powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Функция length
18 сообщений из 143, страница 6 из 6
Функция length
    #39358650
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..,

and здесь, неожиданно, следует читать, как союз определяющий последовательность действий.
Сначала происходит откат, потом выброс информации о том, что программист совершил ошибку.
Т.е. к моменту выброса такой ошибки, транзакции, подвергнутой rollback, уже нет.
нельзя уже оказаться в ее контексте и, тем более, вернуться в него.
...
Рейтинг: 0 / 0
Функция length
    #39358690
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicstax..откаталось и что, где сдесь что вернулись в контекст мастер транзакции?А куда ещё?
как куда
остатся в автономке, в ексепшене может быть любой код, ето часть процедуры с autonomous_transaction


напр
exception
when ex6519 then
write_log();
commit;
...

rollback в теле процедуры не вываливает ж в мастер транзакцию

сделали implicitly rolled back , но зачем закрывать автономку,
причем implicitly rolled back делать если нет обработчика

почему для других исключений автономка не заканчивается?

имхо баг/фича

.....
stax
...
Рейтинг: 0 / 0
Функция length
    #39358697
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевВообще блок exception по сути своей переходной. Из процедуры уже вышли, а к вызывающему еще не вернулись.

что значит из "процедуры уже вышли"
exception ето часть процедуры, и там может быть нехилый код

.....
stax
...
Рейтинг: 0 / 0
Функция length
    #39358715
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobystax..,

and здесь, неожиданно, следует читать, как союз определяющий последовательность действий.
Сначала происходит откат, потом выброс информации о том, что программист совершил ошибку.
Т.е. к моменту выброса такой ошибки, транзакции, подвергнутой rollback, уже нет.
нельзя уже оказаться в ее контексте и, тем более, вернуться в него.
в ексепшене можно начать новую транзакцию изолированную от мастер

explicitly rolled back
откатывает текущие изменения
но не вываливает ж из автономки



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
exception
  when zero_divide then
    rollback;
    ....
    --находимся в автономном контексте 
   ...
  when ex6519 then
    --implicitly rolled back 
    --находимся в контексте мастер транзакции

    ...



имхо
бага/фича

.....
stax
...
Рейтинг: 0 / 0
Функция length
    #39358718
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..,

почему для других исключений автономка не заканчивается?

Потому что другие исключения гарантированно происходят до Return/End procedure_at

А про это исключение ты должен думать так:
Не веря в программиста, зная, что тот всегда пишет то, чего сам не понимает,
компилятор , в момент компиляции такой процедуры принудительно вставляет перед каждым return/End procedure вызов метода, производящего принудительные действия по откату с уведомлением в виде ошибки, если к этому моменту автономная транзакция еще не завершена.
...
Рейтинг: 0 / 0
Функция length
    #39358747
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobystax..,

почему для других исключений автономка не заканчивается?

Потому что другие исключения гарантированно происходят до Return/End procedure_at

А про это исключение ты должен думать так:
Не веря в программиста, зная, что тот всегда пишет то, чего сам не понимает,
компилятор , в момент компиляции такой процедуры принудительно вставляет перед каждым return/End procedure вызов метода, производящего принудительные действия по откату с уведомлением в виде ошибки, если к этому моменту автономная транзакция еще не завершена.

причем тут компилятор
если в коде есть обработчик исключения
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    procedure a(aDoCommit boolean)
      is
        pragma autonomous_transaction;
        ex6519 exception;
        pragma exception_init(ex6519,-6519);
...
      begin

      exception
--
        when ex6519 then
--- обработка
      end;
...




.....
stax
...
Рейтинг: 0 / 0
Функция length
    #39358994
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..,

Ны хочешь rollback to savepoint, но там может быть только rollback, а он завершает текущую транзакцию.
На открыть новую, не связанную с мастер запрета нет.
И сделать ты это скорее обязан (собственными руками), раз уж ты решил, что тебе в этом месте необходимо явно перехватывать ошибку из категории "ошибка программиста".
каким нибудь Insert into your_super_log ты вполне достигнешь этой цели, но если эта, вновь открытая транзакция останется незавершенной при выходе из процедуры по нговому пути следования, то снова возникнет та же ошибка, которая уже не будет возвращать тебя в исходную точку твоего перехвата.
Компилятор здесь при том, что он знает синтакис, используемый в твоем исходном коде, умеет как забраковать его, объявив негодным к компиляции, так и преобразовать к виду, годному для исполнения.
В этом месте все тапки его.
А в данном случае, если работу по управлению подтранзакией не сделает компилятор, путем внесения в твой код вызовов, подразумеваемых наличием тобой написанной прагмы, то и сделать это будет некому, с учетом всех ожидаемых для данного варианта использования кода соглашений.
...
Рейтинг: 0 / 0
Функция length
    #39358995
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,
сорри
НТы хочешь ...
...
Рейтинг: 0 / 0
Функция length
    #39359034
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевВот где написано, что в моем варианте перехватит блок b.А какой еще?
Именно в нем последний выполняемый оператор и именно из него происходит выход из процедуры (с незакрытой транзакцией, что и вызывает ORA-6519)

Хотя, конечно, выглядит это (да и наверняка, является) как баг.
Обработка ошибки, на мой взгляд, должна проводиться или за пределами автономной транзакции (конечно, концептуально это не очень красиво) или в новой автономной транзакции (на которую уже не генерить ошибку, чтоб не допустить рекурсии, что наверняка сложнее).
Т.е. либо крестик снимите, либо трусы оденьте.

А то, получается, из автономной транзакции, по определению являющейся отдельной от родительской, я тем не менее могу откатить или подтвердить родительскую транзакцию.
...
Рейтинг: 0 / 0
Функция length
    #39359036
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Речь, естественно, про обработку именно 6519

А то, что оно все-таки пытается после обработчика пойти выполнять PL/SQL дальше (до первого обращения к SQL или хрен знает какая там логика?) это вообще ни в какие ворота
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
tst> declare i number := 0;
  2    procedure atr as
  3       pragma autonomous_transaction;
  4    begin for r in 1..10 loop
  5       begin i := i+1;
  6             dbms_output.put_line(dbms_transaction.local_transaction_id(true));
  7             return;
  8       exception when others then null;
  9       end;
 10      end loop;
 11    end;
 12  begin atr;
 13        dbms_output.put_line(i);
 14  end;
 15  /
33.19.36649
34.0.370013
2

PL/SQL procedure successfully completed.



PS. я пытался обратить на это внимание еще в 19953712
...
Рейтинг: 0 / 0
Функция length
    #39359038
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так даже интересней
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
tst> create table t1(a number);

Table created.

tst> declare i number := 0;
  2    procedure atr as
  3       pragma autonomous_transaction;
  4    begin for r in 1..10 loop
  5       begin i := i+1;
  6             insert into t1 values(i);
  7             return;
  8       exception when others then null;
  9       end;
 10      end loop;
 11    end;
 12  begin insert into t1 values(i);
 13        atr;
 14        commit;
 15  end;
 16  /

PL/SQL procedure successfully completed.

tst> select * from t1;

         A
----------
         0
         2

...
Рейтинг: 0 / 0
Функция length
    #39359080
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровРечь, естественно, про обработку именно 6519

А то, что оно все-таки пытается после обработчика пойти выполнять PL/SQL дальше ( до первого обращения к SQL или хрен знает какая там логика? ) это вообще ни в какие воротаЧе-то перемудрил я
Нет там никакой логики
Просто тупо продолжает выполнение в контексте родительской транзакции
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
tst> create table t1(a number);

Table created.

tst> declare i number := 0;
  2    procedure atr as
  3       pragma autonomous_transaction;
  4    begin for r in 1..10 loop
  5       begin i := i+1;
  6             insert into t1 values(i);
  7             if i=1 then
  8                 return;
  9             end if;
 10       exception when others then
 11             dbms_output.put_line(sqlerrm);
 12       end;
 13      end loop;
 14    end;
 15  begin insert into t1 values(i);
 16        atr;
 17        for r in (select a from t1) loop
 18             dbms_output.put_line(r.a);
 19        end loop;
 20        rollback;
 21  end;
 22  /
ORA-06519: active autonomous transaction detected and rolled back
0
2
3
4
5
6
7
8
9
10

PL/SQL procedure successfully completed.

tst> select * from t1;

no rows selected

...
Рейтинг: 0 / 0
Функция length
    #39359105
open your mi... bug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав ЛюбомудровНет там никакой логикину от чего же никакой. return возвращает контекст родительской транзакции независимо от реального выхода.
По сути баг. И вряд ли оракл его исправит, останется сакральными знаниями на металинке.
...
Рейтинг: 0 / 0
Функция length
    #39359272
dba123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавил к примеру Славы вывод транзакции
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
create table t1(a number, b varchar2(64));

--
<<D>>declare 
  l_trz varchar2(30);
  n   pls_integer := 0;
procedure atr as
   pragma autonomous_transaction;
   ex6519 exception;
   pragma exception_init(ex6519, -6519);

begin 
 D.n := D.n + 1;
 for r in 1..10 loop
 -- for r in 1..1 loop
   begin 
         dbms_output.put_line('atr-beforinsert-loop-'||to_char(r)||', '||chr(9)||nvl(dbms_transaction.local_transaction_id,'нет активной транзакции'));
         insert into t1 values(D.n, 'step-atr-body-loop-'||to_char(r)||', '||dbms_transaction.local_transaction_id);
         dbms_output.put_line('atr-afterinsert-loop-'||to_char(r)||', '||chr(9)||( CASE dbms_transaction.local_transaction_id WHEN D.l_trz THEN D.l_trz ELSE dbms_transaction.local_transaction_id||', была такая транзакция' END ));

         -- не забудь закоммитить автономную транзакцию в atr
         -- иначе первый проход по циклу в автономке октатится:
         -- return - проигнорируется (вместо него исполнится rollback и ex6519)
         -- а процедура продолжит выполнение цикла, но уже в родительской
         -- адрес передачи управления - последний оператор перед блоком с return
         -- commit;
         return;
         -- а вдруг
         dbms_output.put_line('atr-afterreturn-loop-'||to_char(r)||', '||chr(9)||dbms_transaction.local_transaction_id);
     exception when ex6519 then
         dbms_output.put_line('ex6519-beforinsert-loop-'||to_char(r)||', '||chr(9)||dbms_transaction.local_transaction_id);
         insert into t1 values(D.n, 'step-atr-ex6519-loop-'||to_char(r)||', '||dbms_transaction.local_transaction_id);
         dbms_output.put_line('ex6519-afterinsert-loop-'||to_char(r)||', '||chr(9)||dbms_transaction.local_transaction_id);
   end;
  end loop;
  -- 
  dbms_output.put_line('atr-bottom-beforinsert, '||chr(9)||dbms_transaction.local_transaction_id);
  insert into t1 values(D.n, 'step-atr-bottom, '||dbms_transaction.local_transaction_id);
  dbms_output.put_line('atr-bottom-afterinsert, '||chr(9)||dbms_transaction.local_transaction_id);
  return;

exception when others then
  dbms_output.put_line('others-beforinsert, '||chr(9)||dbms_transaction.local_transaction_id);
  insert into t1 values(D.n, 'step-atr-others, '||dbms_transaction.local_transaction_id);
  dbms_output.put_line('others-afterinsert, '||chr(9)||dbms_transaction.local_transaction_id);

end atr;
begin 
      D.l_trz := dbms_transaction.local_transaction_id(true);

      dbms_output.put_line('step-'||D.n||', '||dbms_transaction.local_transaction_id);
      insert into t1 values(D.n, 'step-'||D.n||', '||dbms_transaction.local_transaction_id);
      atr;
      commit;
end;
/

step-0, 1.16.86777
atr-beforinsert-loop-1, 	нет активной транзакции
atr-afterinsert-loop-1, 	9.32.104517, была такая транзакция
ex6519-beforinsert-loop-1, 	1.16.86777
ex6519-afterinsert-loop-1, 	1.16.86777
atr-beforinsert-loop-2, 	1.16.86777
atr-afterinsert-loop-2, 	1.16.86777

PL/SQL procedure successfully completed.


scott@ORCL.HOME.LOCAL>;select * from t1;
         A B
---------- ----------------------------------------------------------------
         0 step-0, 1.16.86777
         1 step-atr-ex6519-loop-1, 1.16.86777
         1 step-atr-body-loop-2, 1.16.86777
...
Рейтинг: 0 / 0
Функция length
    #39360046
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..explicitly rolled back
откатывает текущие изменения
но не вываливает ж из автономки
Увы - нет
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
set serveroutput on;
declare
  procedure a(aDoCommit boolean)
  is
    pragma autonomous_transaction;
  begin
    dbms_output.put_line('a->'||dbms_transaction.local_transaction_id(true));
    update t set value=id;
  exception
    when others then
     dbms_output.put_line('a<-'||-SQLCODE||':'||dbms_transaction.local_transaction_id);
     if aDoCommit then
      commit;
     end if;
     dbms_output.put_line('a!'||dbms_transaction.local_transaction_id);
  end a;
begin
  dbms_output.put_line('m->'||dbms_transaction.local_transaction_id(true));
  begin
   a(true);
  exception
    when others then
     dbms_output.put_line('m<-'||-SQLCODE||':'||dbms_transaction.local_transaction_id);
  end;   
  dbms_output.put_line('m!'||dbms_transaction.local_transaction_id(true));
  dbms_output.put_line('-------------false---------');
  begin
   a(false);
  exception
    when others then
     dbms_output.put_line('m<-'||-SQLCODE||':'||dbms_transaction.local_transaction_id);
  end;   
  dbms_output.put_line('m!'||dbms_transaction.local_transaction_id(true));
end;
/


sqlplusm->4.30.614216
a->9.7.634789
a<-6519:4.30.614216
a!
m!8.17.678840
-------------false---------
a->7.12.604347
a<-6519:8.17.678840
a!8.17.678840
m!8.17.678840
...
Рейтинг: 0 / 0
Функция length
    #39360048
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровА какой еще?
Именно в нем последний выполняемый оператор и именно из него происходит выход из процедуры (с незакрытой транзакцией, что и вызывает ORA-6519)

А мне казалось, что выход из процедуры и последний оператор это несколько разные действия.
Тем более что есть окончание блока и окончание процедуры и вынесенный отдельно exception на процедуру. Но ...
...
Рейтинг: 0 / 0
Функция length
    #39361343
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньевstax..explicitly rolled back
откатывает текущие изменения
но не вываливает ж из автономки
Увы - нет
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
set serveroutput on;
declare
  procedure a(aDoCommit boolean)
  is
    pragma autonomous_transaction;
  begin
    dbms_output.put_line('a->'||dbms_transaction.local_transaction_id(true));
    update t set value=id;
  exception
    when others then
     dbms_output.put_line('a<-'||-SQLCODE||':'||dbms_transaction.local_transaction_id);
     if aDoCommit then
      commit;
     end if;
     dbms_output.put_line('a!'||dbms_transaction.local_transaction_id);
  end a;
begin
  dbms_output.put_line('m->'||dbms_transaction.local_transaction_id(true));
  begin
   a(true);
  exception
    when others then
     dbms_output.put_line('m<-'||-SQLCODE||':'||dbms_transaction.local_transaction_id);
  end;   
  dbms_output.put_line('m!'||dbms_transaction.local_transaction_id(true));
  dbms_output.put_line('-------------false---------');
  begin
   a(false);
  exception
    when others then
     dbms_output.put_line('m<-'||-SQLCODE||':'||dbms_transaction.local_transaction_id);
  end;   
  dbms_output.put_line('m!'||dbms_transaction.local_transaction_id(true));
end;
/


sqlplusm->4.30.614216
a->9.7.634789
a<-6519:4.30.614216
a!
m!8.17.678840
-------------false---------
a->7.12.604347
a<-6519:8.17.678840
a!8.17.678840
m!8.17.678840



не точно выразился
імхо explicitly, ето явный код программиста (commit/rollback), он может обработать ошибки в тч 6519, и напр закоммитить

в Вашем примере ето было-б напр

update t set value=id ...;
rollback; --транзакцію завершили, но остались в среде автономной
update t set value=id+1 ...;
commit;


имхо implicitly rolled back делать после завершения автономной процедуры (в которой естественной частью есть блок exception)

если грубо то -6519 должна возбуждаться в головном (мастер) блоке, поле выхода (end а)

.....
stax
...
Рейтинг: 0 / 0
Функция length
    #39361442
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..,

если грубо, то должно быть однообразие - или exception раздел процедуры находится в ней или за ее пределами, а получилось, то так, то едак. Да и еще перехватывает не тот блок.
...
Рейтинг: 0 / 0
18 сообщений из 143, страница 6 из 6
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Функция length
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]