2011-12-19 3 views
7

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

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

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: БД составляет 10 г, и в нем нет CONTINUE. Следовательно, использование GOTO.

+2

Кроме того, 'if' нуждается в' 'затем' и конец if'. –

+0

thnx. Это была опечатка в вопросе. – codeObserver

+0

Не могли бы вы проверить, может ли один из предложенных ответов быть приемлемым? TIA – lkuty

ответ

16

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

После того, как исключение для этой итерации обрабатывается, следующая итерация цикла начнет

например:

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

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

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; 
+1

Thnx Ian. Я попробовал это и обновил в вопросе. Все еще есть проблемы. Есть ли необходимость в «начале» и «завершении» в LOOP? – codeObserver

+2

Да, для использования секции исключений требуются начальные разделы begin. –

+0

Я обновлю свой ответ на примере –

7
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
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; 
Смежные вопросы