Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Неявный откат транзакции для анонимного блока  [new]
Guest_rollback_123
Guest
Странная ситуация...
Использую SQL Navigator 7.0.0 и выполняю следующий код:

create table ttt(s number)
/

begin
   insert into ttt values (1);
   raise no_data_found;
end;
/

select * from ttt;


При выполнении select, записи в таблице ttt не вижу, как-будто происходит неявный откат транзакции. Вроде бы должна выполниться вставка записи, сгенерироваться исключение и все, без отката самой вставки.
С чем это может быть связано?
16 фев 17, 15:32    [20218128]     Ответить | Цитировать Сообщить модератору
 Re: Неявный откат транзакции для анонимного блока  [new]
AmKad
Member

Откуда:
Сообщений: 4319
Блок, в котором возникло исключение, откатывается целиком.
16 фев 17, 15:54    [20218232]     Ответить | Цитировать Сообщить модератору
 Re: Неявный откат транзакции для анонимного блока  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром началась. КЯЗ
Сообщений: 26616
AmKad
Блок, в котором возникло исключение, откатывается целиком.
Слишком упрощённо, поэтому технически неправильно.
16 фев 17, 16:10    [20218331]     Ответить | Цитировать Сообщить модератору
 Re: Неявный откат транзакции для анонимного блока  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром началась. КЯЗ
Сообщений: 26616
Guest_rollback_123
и все, без отката самой вставки.
RTFM statement-level rollback (FAQ)
16 фев 17, 16:28    [20218433]     Ответить | Цитировать Сообщить модератору
 Re: Неявный откат транзакции для анонимного блока  [new]
AmKad
Member

Откуда:
Сообщений: 4319
Elic
Guest_rollback_123
и все, без отката самой вставки.
RTFM statement-level rollback (FAQ)
Тоже наткнулся на эту ссылку, когда искал, что дать топикстартеру. Но счел ее не столь убедительной, statement-level rollback он конечно statement-level, но из приведенной статьи я бы не смог сделать однозначного вывода, что это распространяется и на весь pl/sql блок целиком, а не sql-команды в нем по отдельности.
16 фев 17, 16:46    [20218567]     Ответить | Цитировать Сообщить модератору
 Re: Неявный откат транзакции для анонимного блока  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром началась. КЯЗ
Сообщений: 26616
AmKad
я бы не смог сделать однозначного вывода, что это распространяется и на весь pl/sql блок целиком, а не sql-команды в нем по отдельности.
Не спорю, не разжёвано. Но разве AB - это не statement?
statement-level rollback относится к любому server-call-у. Если грубо - любой execute: из хост-программы, а внутри PL/SQL - все связанное с SQL% (DML, for update, commit, EI), dbms_sql.
16 фев 17, 17:05    [20218654]     Ответить | Цитировать Сообщить модератору
 Re: Неявный откат транзакции для анонимного блока  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром началась. КЯЗ
Сообщений: 26616
И да, ничто так не подтверждает правило, как исключения. Есть exception, который не выполняет statement-level rollback.
16 фев 17, 17:07    [20218663]     Ответить | Цитировать Сообщить модератору
 Re: Неявный откат транзакции для анонимного блока  [new]
AmKad
Member

Откуда:
Сообщений: 4319
Elic
Но разве AB - это не statement?
statement-level rollback относится к любому server-call-у.
Так-то оно так. Но когда понимаешь, что внутри AB-statement-a есть другие SQL-statement-ы, а такие выражения, как server-call и pl/sql-блок в статье опущены, невольно задаешься вопросом, как эти правила выполняются для AB-блока. Другое же дело - когда знаешь, как это работает, то и статью уже воспринимаешь под соответствующим углом.

Elic
Есть exception, который не выполняет statement-level rollback
Сходу сейчас не угадаю. Какой?
16 фев 17, 17:22    [20218741]     Ответить | Цитировать Сообщить модератору
 Re: Неявный откат транзакции для анонимного блока  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 42676

AmKad
невольно задаешься вопросом, как эти правила выполняются для AB-блока.

Откаты statement-ов раскручиваются пока им не встретится обработчик соответствующего
исключения. По-моему, вполне очевидно, что любое исключение обязано быть хоть как-то
обработано на уровне пользовательского кода, оно не может просто исчезнуть в воздухе.

Posted via ActualForum NNTP Server 1.5

16 фев 17, 17:43    [20218837]     Ответить | Цитировать Сообщить модератору
 Re: Неявный откат транзакции для анонимного блока  [new]
Vint
Member

Откуда: Таган-москва
Сообщений: 4225
Dimitry Sibiryakov,
" оно не может просто исчезнуть в воздухе" - NO_DATA_FOUND внутри pipelined функций)
16 фев 17, 17:49    [20218863]     Ответить | Цитировать Сообщить модератору
 Re: Неявный откат транзакции для анонимного блока  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром началась. КЯЗ
Сообщений: 26616
AmKad
что внутри AB-statement-a есть другие SQL-statement-ы,
А также наоборот, о чём даже написано в документации.
AmKad
Сходу сейчас не угадаю. Какой?
Hint: array
16 фев 17, 17:52    [20218873]     Ответить | Цитировать Сообщить модератору
 Re: Неявный откат транзакции для анонимного блока  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром началась. КЯЗ
Сообщений: 26616
Vint
NO_DATA_FOUND внутри pipelined функций)
16 фев 17, 17:53    [20218878]     Ответить | Цитировать Сообщить модератору
 Re: Неявный откат транзакции для анонимного блока  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 42676

Vint
NO_DATA_FOUND внутри pipelined функций)

А оно там возникает именно как исключение, а не просто состояние NO_MORE_DATА у выходного
курсора?..

Posted via ActualForum NNTP Server 1.5

16 фев 17, 17:56    [20218890]     Ответить | Цитировать Сообщить модератору
 Re: Неявный откат транзакции для анонимного блока  [new]
AmKad
Member

Откуда:
Сообщений: 4319
Dimitry Sibiryakov
AmKad
невольно задаешься вопросом, как эти правила выполняются для AB-блока.

Откаты statement-ов раскручиваются пока им не встретится обработчик соответствующего
исключения. По-моему, вполне очевидно, что любое исключение обязано быть хоть как-то
обработано на уровне пользовательского кода, оно не может просто исчезнуть в воздухе.
Очевидно, когда знаешь, опробовал на реальных примерах и опыте. А выстроить у себя в голове понимание работы pl/sql блоков, связь statement-level rollback и exception (+ вложенности) внутри них по результатам только этой статьи интуиции мне бы не хватило.
16 фев 17, 18:01    [20218900]     Ответить | Цитировать Сообщить модератору
 Re: Неявный откат транзакции для анонимного блока  [new]
ln123
Member

Откуда:
Сообщений: 46
С NO_DATA_FOUND в Oracle вообще не все хорошо

create or replace function test1_b return number
is
 nv number;
begin
 -- raise_application_error(-20000,'Error');
  select 1 into nv from dual where 1=2;
  return nv;
end;


declare
 nv number;
begin
 nv := test1_b;
end;


Получим Exception, но в тоже время

select test1_b c from all_objects


Нормально отработает без Exception.
Но хорошо что хоть отработает, а так на какой-то версии если в запросе была функция которая генерировала no_data_found то можно было потом долго удивляться как запрос без условий возвращал меньше строк чем есть в таблице :)
16 фев 17, 18:20    [20218958]     Ответить | Цитировать Сообщить модератору
 Re: Неявный откат транзакции для анонимного блока  [new]
Vint
Member

Откуда: Таган-москва
Сообщений: 4225
Dimitry Sibiryakov,

+ к сожалению, глотнет даже если руками рейзнуть, и иногда это больно
CREATE OR REPLACE FUNCTION f_pipe(n NUMBER) RETURN sys.odcinumberlist
  PIPELINED IS
  fn_test NUMBER;
BEGIN
  FOR pcur_test IN 1 .. n LOOP
    IF pcur_test > 1 THEN
      SELECT 1 INTO fn_test FROM dual WHERE 1 = 2;
    END IF;
    PIPE ROW(pcur_test);
  END LOOP;
END;

SELECT * FROM TABLE(f_pipe(5))

drop FUNCTION f_pipe;

16 фев 17, 18:26    [20218980]     Ответить | Цитировать Сообщить модератору
 Re: Неявный откат транзакции для анонимного блока  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром началась. КЯЗ
Сообщений: 26616
Elic
AmKad
Сходу сейчас не угадаю. Какой?
Hint: array
+
SQL> create table plch_tab(n int);

Table created.

Elapsed: 00:00:00.02
SQL> select * from plch_tab;

no rows selected

Elapsed: 00:00:00.00
SQL> declare e exception; pragma exception_init(e,-24381);
  2  begin insert into plch_tab values(0); raise e; end;
  3  /
ERROR:
ORA-24381: error(s) in array DML
ORA-06512: at line 2


Elapsed: 00:00:00.04
SQL> select * from plch_tab;

         N
----------
         0

1 row selected.

Elapsed: 00:00:00.00
SQL> drop table plch_tab purge;

Table dropped.
17 фев 17, 13:16    [20221028]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить