plsql / cursors обрабатывают исключение и возвращаются обратно в поток выполнения - PullRequest
7 голосов
/ 19 декабря 2011

Я пытаюсь выполнить курсор и хочу, чтобы он завершил цикл, даже если есть какое-то исключение.

То, что я пытаюсь сделать, это «перехватить» все исключения и, вероятно, что-то записать или ничего не делать, а затем вернуться обратно в поток. Вот как выглядит код:

 FOR line IN my_cursor
 LOOP
 begin

    if<condition> then
      GOTO pass; 
    else     
     <<do_something>>
     exception
       when others then
        sys.dbms_output.put_line('say something');       
    end if;  

    <<pass>> null;
 end
 END LOOP;

Скрипт не компилируется. Возможно, есть некоторая синтаксическая ошибка с исключением, но я также не очень хорошо знаю семантику. Как я не уверен, если вы можете вернуться к потоку выполнения после обработки исключения.

p.s: БД 10g и в ней нет ПРОДОЛЖЕНИЯ. Следовательно, используя GOTO.

Ответы [ 3 ]

16 голосов
/ 19 декабря 2011

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

Как только будет обработано исключение для этой итерации, начнется следующая итерация цикла

например:

for line in my_cursor
loop
   begin    
      <<do_something>>
   exception
      <<do_exception_processing>>        
   end;
end loop;

Чтобы проиллюстрировать это далее, в следующем примере я имеюобъявлена ​​локальная переменная типа исключение.Я перебираю числа от 1 до 10, во время второй итерации цикла оператор if равен true и обработка переходит к обработчику исключений.Как только исключение обработано, начинается следующая итерация цикла.

begin

   for i in 1 .. 10 
   loop

      declare

         my_exception exception;

      begin

         if i = 2
         then

            -- if you need to do some processing then you would enter it
            -- here and then when you want to enter the exception section 
            -- you would add the line below 

            raise my_exception;

         end if;

      exception
         when my_exception then
            dbms_output.put_line('in exception section');

      end;

   end loop;

end;
7 голосов
/ 19 декабря 2011
FOR line IN my_cursor  
LOOP
  if not some_condition then
    begin
      do_something;
    exception     
      when others then log_my_error(); -- this should be something that uses
                                       -- an autonomous transaction
    end;
  end if;
END LOOP; 
0 голосов
/ 15 мая 2014
 BEGIN 
 FOR Line in My_Cursor LOOP
    IF condition THEN
 BEGIN
    do something...
 END;
    ELSE 
 BEGIN
    do something...
 END;
    END IF;
 END LOOP;
 EXCEPTION
 WHEN OTHERS THEN
 DBMS_OUTPUT.PUT_LINE('say something');
 END;
...