powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Функция length
25 сообщений из 143, страница 5 из 6
Функция length
    #39357153
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopЧего менять-то?
Ну падение убрать, ненароком, я про агрегат оконный. :)
...
Рейтинг: 0 / 0
Функция length
    #39357157
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopОчевидно что rownum не должно срабатывать до аналитики.
Он вообще от другого запроса. :)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with t as (select level id from dual connect by level<10)
select * from (
select cast((collect(id) over
             (
              order by rownum desc
             )
            ) as sys.odcinumberlist
           ), rownum from t
)
where rownum=1
...
Рейтинг: 0 / 0
Функция length
    #39357158
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев,

ORA-03113 по прежнему отлично ловится, по крайней мере, на 12.1.0.2 на "аналитическом" collect (с сортировкой).
...
Рейтинг: 0 / 0
Функция length
    #39357161
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,

И элемент в коллекции, видать тоже 1
...
Рейтинг: 0 / 0
Функция length
    #39357162
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopОчевидно что rownum не должно срабатывать до аналитики.Fixed.
...
Рейтинг: 0 / 0
Функция length
    #39357370
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousElicпропущено...
Тебе не надоело бессмысленно спорить?
Не бессмысленно.
Я в ходе дискуссии я полностью определился в своем отношении к обсуждаемому явлению (autonomous declare).
До ссылки на нотку это был забавный недокументированный побочный эффект с непонятным будущим, после ссылки на нотку я склонился к версии о баге в документации.Да нет никакого бага
Картинка вполне доходчиво все показывает:

В сессии в текущий момент активной может быть только одна транзакция (V$SESSION.TADDR). Родительская транзакция замораживается по достижении (на картинке) слова BEGIN. На мой взгляд вполне естественно сделать вывод, что все что до этого выполняется в родительской транзакции.
Ну а приводимая уже цитата When you enter the executable section of an autonomous transaction, the main transaction suspendsс расшифровкой понятия "executable section" окончательно расставляет все по местам.
Считаю, что большего документация и разжевывать не должна. Хотя, конечно, можно "упереться рогом" и требовать дословного указания на все мелочи.

PS. Для меня это выглядело с самого начала вполне естественно. Скорее всего, по аналогии с обработчиком ошибок (ошибки в DECLARE обрабатываются обработчиком родительского блока)

andrey_anonymousВсем спасибо за участие, особенно Elicу и Владимиру Любомудрову за любезно предоставленные ссылки и квалифицированное оппонирование.
...
Рейтинг: 0 / 0
Функция length
    #39357392
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровPS. Для меня это выглядело с самого начала вполне естественно. Скорее всего, по аналогии с обработчиком ошибок (ошибки в DECLARE обрабатываются обработчиком родительского блока)Настало время задуматься, а какая транзакция может быть в EXCEPTION?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
declare
  procedure a(aDoCommit boolean)
  is
    pragma autonomous_transaction;
  begin
    dbms_output.put_line('a->'||dbms_transaction.local_transaction_id(true));
    if aDoCommit then
      commit;
      raise program_error;
    end if;
  exception
    when others then
      dbms_output.put_line('a<-'||dbms_transaction.local_transaction_id);
  end a;
begin
  dbms_output.put_line('m->'||dbms_transaction.local_transaction_id(true));
  a(true);
  a(false);
  dbms_output.put_line('m<-'||dbms_transaction.local_transaction_id);
end;
/

...
Рейтинг: 0 / 0
Функция length
    #39357780
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
This function returns the local (to instance) unique identifier for the current transaction. It returns null if there is no current transaction.


почему m<- в null?

15 rollback; закрыл "мастер" транзакцию

procedure a откатает изменнения и в "мастер" транзакции


Код: 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.
  1  declare
  2     procedure a(aDoCommit boolean)
  3      is
  4        pragma autonomous_transaction;
  5      begin
  6        dbms_output.put_line('a-> '||dbms_transaction.local_transaction_id(true));
  7        if aDoCommit then
  8          commit;
  9          dbms_output.put_line('a->>'||dbms_transaction.local_transaction_id(true));
 10          raise program_error;
 11        end if;
 12      exception
 13        when others then
 14          dbms_output.put_line('a<- '||dbms_transaction.local_transaction_id(TRUE));
 15          rollback;
 16      end a;
 17    begin
 18      dbms_output.put_line('m-> '||dbms_transaction.local_transaction_id(true));
 19      a(true);
 20      dbms_output.put_line('m-= '||dbms_transaction.local_transaction_id(true));
 21      a(false);
 22      dbms_output.put_line('m<- '||dbms_transaction.local_transaction_id);
 23* end;
SQL> /
m-> 33.7.293338
a-> 4.20.2782176
a->>30.29.285147
a<- 30.29.285147
m-= 33.7.293338
a-> 17.16.2122395
a<- 33.7.293338
m<-

PL/SQL procedure successfully completed.



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

15 rollback; закрыл "мастер" транзакцию

procedure a откатает изменнения и в "мастер" транзакцииСтанислав, ты то ли не владеешь знаками препинания, то ли разговариваешь сам с собой.
...
Рейтинг: 0 / 0
Функция length
    #39357879
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicstax..почему m<- в null?

15 rollback; закрыл "мастер" транзакцию

procedure a откатает изменнения и в "мастер" транзакцииСтанислав, ты то ли не владеешь знаками препинания, то ли разговариваешь сам с собой.

и то и другое
так луче/понятней?


[quot stax..]почему m<- в null?

15 rollback; закрыл "мастер" транзакцию .

procedure a откатает изменнения и в "мастер" транзакции .



.....
stax
...
Рейтинг: 0 / 0
Функция length
    #39358097
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic......Настало время задуматься
Да уж, зажигательный вариант истории, про то, почему никогда не пиши when others
...
Рейтинг: 0 / 0
Функция length
    #39358100
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyElic......Настало время задуматься
Да уж, зажигательный вариант истории, про то, почему никогда не пиши when others
Т.е. - ошибки программиста должны обнаруживать себя наиболее очевидным способом.
...
Рейтинг: 0 / 0
Функция length
    #39358133
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicВячеслав ЛюбомудровPS. Для меня это выглядело с самого начала вполне естественно. Скорее всего, по аналогии с обработчиком ошибок (ошибки в DECLARE обрабатываются обработчиком родительского блока)Настало время задуматься, а какая транзакция может быть в EXCEPTION?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
declare
  procedure a(aDoCommit boolean)
  is
    pragma autonomous_transaction;
  begin
    dbms_output.put_line('a->'||dbms_transaction.local_transaction_id(true));
    if aDoCommit then
      commit;
      raise program_error;
    end if;
  exception
    when others then
      dbms_output.put_line('a<-'||dbms_transaction.local_transaction_id);
  end a;
begin
  dbms_output.put_line('m->'||dbms_transaction.local_transaction_id(true));
  a(true);
  a(false);
  dbms_output.put_line('m<-'||dbms_transaction.local_transaction_id);
end;
/

Таки ORA-6519 особый случай. Она должна обработаться в контексте родительской транзакции, поскольку выполнение автономной процедуры закончено. Более того перехватить ошибку и исправить положение уже и нельзя. Вообще в БД в рамках этой автономной транзакции сделать ничего нельзя ибо "the active autonomous transaction is implicitly rolled back and this error is raised".
С другой стороны, почему ошибка обрабатывается в обработчике автономной процедуры? Таки, наверное, контекст транзакции уже восстановлен, а обработчик исключительных ситуаций еще нет
И вот еще прикол
Код: 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.
tst> declare
  2    procedure a(aDoCommit boolean)
  3    is
  4      pragma autonomous_transaction;
  5    begin
  6  --
  7      for i in 1..3 loop
  8        begin
  9  --
 10          dbms_output.put_line('a->'||dbms_transaction.local_transaction_id(true));
 11          if aDoCommit then
 12            commit;
 13            raise program_error;
 14          end if;
 15  --
 16          return;
 17  --
 18        exception
 19          when others then
 20            dbms_output.put_line('a<-'||dbms_transaction.local_transaction_id||' ORA'||sqlcode);
 21  --
 22        end;
 23      end loop;
 24  --
 25    end a;
 26  begin
 27    dbms_output.put_line('m->'||dbms_transaction.local_transaction_id(true));
 28    a(true);
 29    a(false);
 30    dbms_output.put_line('m<-'||dbms_transaction.local_transaction_id);
 31  end;
 32  /
m->10.28.8270413
a->9.21.7985161
a<- ORA-6501
a->9.17.7985481
a<- ORA-6501
a->9.22.7986868
a<- ORA-6501
a->9.27.7984497
a<-10.28.8270413 ORA-6519
a->10.28.8270413
m<-10.28.8270413

PL/SQL procedure successfully completed.

...
Рейтинг: 0 / 0
Функция length
    #39358407
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровТаки ORA-6519 особый случай. Она должна обработаться в контексте родительской транзакции, поскольку выполнение автономной процедуры закончено. Более того перехватить ошибку и исправить положение уже и нельзя.
Забавно то, как раз не это. То, что блок exception на процедуру обрабатывается по выходу из нее с ошибкой это нормальное поведение. Как впрочем не лишено логики и обработка его, как если из нее не вышли. Вот то, что в зависимости от ситуации может быть то, а может быть другое, просто потому, что так проще, вот это забавно.
более того оптимизатор еще и отдает exception не тому блоку
Код: 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.
declare
      procedure a(aDoCommit boolean)
       is
         pragma autonomous_transaction;
         n varchar2(4000);
       begin
        begin
         dbms_output.put_line('a-> '||dbms_transaction.local_transaction_id(true));
         if aDoCommit then
           commit;
           dbms_output.put_line('a->>'||dbms_transaction.local_transaction_id(true));
           raise program_error;
         end if;
        exception
         when others then
           dbms_output.put_line('b<- '||dbms_transaction.local_transaction_id(TRUE));
           rollback;
        end;  
--         n:=dbms_transaction.local_transaction_id(TRUE);
       exception
         when others then
           dbms_output.put_line('a<- '||dbms_transaction.local_transaction_id(TRUE));
           rollback;
       end a;
     begin
       dbms_output.put_line('m-> '||dbms_transaction.local_transaction_id(true));
       a(true);
       dbms_output.put_line('m-= '||dbms_transaction.local_transaction_id(true));
       a(false);
       dbms_output.put_line('m<- '||dbms_transaction.local_transaction_id);
end;
/

...
Рейтинг: 0 / 0
Функция length
    #39358470
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyникогда не пиши when others then null end;
...
Рейтинг: 0 / 0
Функция length
    #39358476
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadboobyникогда не пиши when others then null end;
в данном случае свет гасит не команда Null - ты хоть весь бэктрейс туда запихни,
оно вообще не обязано быть замеченным, что где-то в извилинах массового процесса по дороге свет погас.
свет гасит именно сам when others
...
Рейтинг: 0 / 0
Функция length
    #39358490
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyAmKadпропущено...

в данном случае свет гасит не команда Null - ты хоть весь бэктрейс туда запихни,
оно вообще не обязано быть замеченным, что где-то в извилинах массового процесса по дороге свет погас.
свет гасит именно сам when others
ну, что-то сорта
Код: plsql
1.
2.
3.
When Others 
  Then
  Raise_application_Error(iProgrammerError,'Ошибка программиста! Немедленно сообщите в службу поддержки',True);


вполне допустимо.
...
Рейтинг: 0 / 0
Функция length
    #39358518
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyну, что-то сорта
Код: plsql
1.
2.
3.
When Others 
  Then
  Raise_application_Error(iProgrammerError,'Ошибка программиста! Немедленно сообщите в службу поддержки',True);

Ну так ведь еще можно сделать и что-нибудь более осмысленное, например залоггировать ошибку и ее "окружение".
...
Рейтинг: 0 / 0
Функция length
    #39358544
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyну, что-то сорта
Код: plsql
1.
2.
3.
When Others 
  Then
  Raise_application_Error(iProgrammerError,'Ошибка программиста! Немедленно сообщите в службу поддержки',True);


вполне допустимо.
Код: plsql
1.
when others then update emp set comm = 0 where job = 'Programmer'; commit;
...
Рейтинг: 0 / 0
Функция length
    #39358556
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровElicпропущено...
Настало время задуматься, а какая транзакция может быть в EXCEPTION?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
declare
  procedure a(aDoCommit boolean)
  is
    pragma autonomous_transaction;
  begin
    dbms_output.put_line('a->'||dbms_transaction.local_transaction_id(true));
    if aDoCommit then
      commit;
      raise program_error;
    end if;
  exception
    when others then
      dbms_output.put_line('a<-'||dbms_transaction.local_transaction_id);
  end a;
begin
  dbms_output.put_line('m->'||dbms_transaction.local_transaction_id(true));
  a(true);
  a(false);
  dbms_output.put_line('m<-'||dbms_transaction.local_transaction_id);
end;
/

Таки ORA-6519 особый случай. Она должна обработаться в контексте родительской транзакции, поскольку выполнение автономной процедуры закончено. Более того перехватить ошибку и исправить положение уже и нельзя. Вообще в БД в рамках этой автономной транзакции сделать ничего нельзя ибо "the active autonomous transaction is implicitly rolled back and this error is raised".
С другой стороны, почему ошибка обрабатывается в обработчике автономной процедуры? Таки, наверное, контекст транзакции уже восстановлен, а обработчик исключительных ситуаций еще нет
И вот еще прикол
Код: 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.
tst> declare
  2    procedure a(aDoCommit boolean)
  3    is
  4      pragma autonomous_transaction;
  5    begin
  6  --
  7      for i in 1..3 loop
  8        begin
  9  --
 10          dbms_output.put_line('a->'||dbms_transaction.local_transaction_id(true));
 11          if aDoCommit then
 12            commit;
 13            raise program_error;
 14          end if;
 15  --
 16          return;
 17  --
 18        exception
 19          when others then
 20            dbms_output.put_line('a<-'||dbms_transaction.local_transaction_id||' ORA'||sqlcode);
 21  --
 22        end;
 23      end loop;
 24  --
 25    end a;
 26  begin
 27    dbms_output.put_line('m->'||dbms_transaction.local_transaction_id(true));
 28    a(true);
 29    a(false);
 30    dbms_output.put_line('m<-'||dbms_transaction.local_transaction_id);
 31  end;
 32  /
m->10.28.8270413
a->9.21.7985161
a<- ORA-6501
a->9.17.7985481
a<- ORA-6501
a->9.22.7986868
a<- ORA-6501
a->9.27.7984497
a<-10.28.8270413 ORA-6519
a->10.28.8270413
m<-10.28.8270413

PL/SQL procedure successfully completed.





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

.....
stax
...
Рейтинг: 0 / 0
Функция length
    #39358567
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-boobyну, что-то сорта
Код: plsql
1.
2.
3.
When Others 
  Then
  Raise_application_Error(iProgrammerError,'Ошибка программиста! Немедленно сообщите в службу поддержки',True);


вполне допустимо.
Код: plsql
1.
when others then update emp set comm = 0 where job = 'Programmer'; commit;



не страшно comm и так 0

а от то что закоммитет основную транзакцию, ето уже посерьезнее

.....
stax
...
Рейтинг: 0 / 0
Функция length
    #39358569
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..,
вот вот.
а если читать описание к ORA-6519, потом перечитывать и на досуге вдумываться, то ведь, там же все написано.
Здесь самое не очевидное, что написанному, оказывается, в данном случае, следует верить.
...
Рейтинг: 0 / 0
Функция length
    #39358574
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobystax..,
вот вот.
а если читать описание к ORA-6519, потом перечитывать и на досуге вдумываться, то ведь, там же все написано.
Здесь самое не очевидное, что написанному, оказывается, в данном случае, следует верить.

06519, 00000, "active autonomous transaction detected and rolled back"
// *Cause: Before returning from an autonomous PL/SQL block, all autonomous
// transactions started within the block must be completed (either
// committed or rolled back). If not, the active autonomous
// transaction is implicitly rolled back and this error is raised.
// *Action: Ensure that before returning from an autonomous PL/SQL block,
// any active autonomous transactions are explicitly committed
// or rolled back.
//-----------------------------------------------------------------------

откаталось и что, где сдесь что вернулись в контекст мастер транзакции?

.....
stax
...
Рейтинг: 0 / 0
Функция length
    #39358608
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..откаталось и что, где сдесь что вернулись в контекст мастер транзакции?А куда ещё?
...
Рейтинг: 0 / 0
Функция length
    #39358637
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..// transaction is implicitly rolled back and this error is raised.

...

откаталось и что, где сдесь что вернулись в контекст мастер транзакции?

Откатились - значит транзакции нет.
Вообще блок exception по сути своей переходной. Из процедуры уже вышли, а к вызывающему еще не вернулись.

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


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