Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Cursor loop. Подстава подстав  [new]
Sergey M
Member

Откуда: г. Барнаул
Сообщений: 5462
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Prod 

то что для циклов можно делать метки - известно. так
      for rParam in (select ...) loop
                  insert into ...; 
      end loop inner_loop;
понятно, можно... Иногда даже удобно когда циклы вложенные.

Подставу словил в следующем коде
   procedure BeginAction  (
      iActionParams   in Common.tActionParams default null)
   is 
      pragma autonomous_transaction;
   begin
     ... 
              
      -- Получить параметры события 
      for rParam in (select A.Name,
                            A.Value
                       from table (iActionParams) A
                      where A.Value is not null) loop
         insert into ... values ...;
      end loop
      -- Зафиксировать транзакцию                    
      commit;
   end;

Упорно и настойчиво давал ошибку ORA-06519 - обнаружена незафиксированная автономная транзакция....

очень долго не мог понять в чем дело. ведь commit вроде бы на месте... Более внимательно удалось обнаружить что не хватает точки с запятой после end loop и commit.
Видимо, в этой ситуации commit вполне сходит за банальную метку курсорного цикла.....
ото жеж... ведь это ключевое слово..
Убил 2 часа...
26 окт 10, 18:54    [9680364]     Ответить | Цитировать Сообщить модератору
 Re: Cursor loop. Подстава подстав  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2855
Sergey M,

почитайте тему - там много интересного
26 окт 10, 19:02    [9680416]     Ответить | Цитировать Сообщить модератору
 Re: Cursor loop. Подстава подстав  [new]
-2-
Member

Откуда:
Сообщений: 15330
Sergey M,

Игнорирование метки в end loop стоит расценивать как баг
set serveroutput on

begin
   <<метка1>>
   for i in 1..5 loop
      dbms_output.put_line('метка1:'||i);
      <<метка2>>
      for i in 10..15 loop
         dbms_output.put_line('метка2:'||i);
         exit метка1;
      end loop метка2;
   end loop метка3;
end;

метка1:1
метка2:10

begin
   <<метка1>>
   for i in 1..5 loop
      dbms_output.put_line('метка1:'||i);
      <<метка2>>
      for i in 10..15 loop
         dbms_output.put_line('метка2:'||i);
         exit метка3;
      end loop метка2;
   end loop метка3;
end;


PLS-00201: идентификатор 'МЕТКА3' должен быть объявлен
26 окт 10, 19:08    [9680452]     Ответить | Цитировать Сообщить модератору
 Re: Cursor loop. Подстава подстав  [new]
Sergey M
Member

Откуда: г. Барнаул
Сообщений: 5462
Однако метки в угловых кавычках приоритетнее...
Да понятно что все это баги..... Засадные они. И ведь если вместо commit написать другое ключевое слово, например procedure - получим ошибку компиляции... Эх.. ))) Баги баги...

AlexFF__|
Интересная темка, спасибо :)
26 окт 10, 19:16    [9680513]     Ответить | Цитировать Сообщить модератору
 Re: Cursor loop. Подстава подстав  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
-2-
Sergey M,

Игнорирование метки в end loop стоит расценивать как баг

наверное. но, вообще, баян.
+
begin
<<m1>>
  begin
    null;
  end "ляляля";
end;
та же хрень живёт у триггеров в енде. короче - меньше случаев, где оно работает, чем где не работает.

ну и второе. по аналогии - облажаться не вопрос и в месте, где к ораклу и предъявить нечего.
delete from my_dummy
commit;
так что. при всём уважении - (автор) сам виноват.
26 окт 10, 19:26    [9680561]     Ответить | Цитировать Сообщить модератору
 Re: Cursor loop. Подстава подстав  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8136
Sergey M

      for rParam in (select A.Name,
         ...
      end loop
      -- Зафиксировать транзакцию                    
      commit;

Всегда пишите
<<my_nice_loop>>
      for rParam in (select A.Name,
         ...
      end loop my_nice_loop
      -- Зафиксировать транзакцию                    
      commit;
Тогда, если пропустите точку запятой, то получите ошибку компиляции...
26 окт 10, 20:16    [9680709]     Ответить | Цитировать Сообщить модератору
 Re: Cursor loop. Подстава подстав  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8136
-2-
Игнорирование метки в end loop стоит расценивать как баг[src oracle]set serveroutput on

Нигде не написано, что имя, указанное после END LOOP, должно совпадать с именем метки, стоящей перед циклом...
26 окт 10, 20:20    [9680721]     Ответить | Цитировать Сообщить модератору
 Re: Cursor loop. Подстава подстав  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54398
SQL*Plus,

тогда это не ссылка на метку, а просто комментарий
26 окт 10, 20:24    [9680732]     Ответить | Цитировать Сообщить модератору
 Re: Cursor loop. Подстава подстав  [new]
Andrei Ditiatev
Member

Откуда: New York
Сообщений: 12
Sergey M,

Дак у Вас же после end loop нет точки с запятой, зато она есть после commit.
26 окт 10, 20:25    [9680734]     Ответить | Цитировать Сообщить модератору
 Re: Cursor loop. Подстава подстав  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8136
Oracle® Database
PL/SQL Language Reference
11g Release 1 (11.1)
Like PL/SQL blocks, loops can be labeled. The optional label, an undeclared identifier
enclosed by double angle brackets, must appear at the beginning of the LOOP
statement. The label name can also appear at the end of the LOOP statement. When you
nest labeled loops, use ending label names to improve readability.

Интересно было бы посмотреть, как это всё определено в спецификации языка Ада, из которого вышел Oracle PL/SQL...
26 окт 10, 20:44    [9680806]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить