поток выполнения программы при возникновении исключения oracle PLSQL - PullRequest
1 голос
/ 05 июля 2019

когда мы встречаемся с исключением, указатель переместится в часть исключения, и если обработано исключение, он вернется или переместится к следующей части .?????

вариант 1: определенное системой исключение

вариант 2: пользовательское исключение

DECLARE
    var_dividend   NUMBER := 24;
    var_divisor    NUMBER := 0;
    var_result     NUMBER;
    exception_div_zero EXCEPTION;
BEGIN
    IF  var_divisor = 0
    THEN
        RAISE exception_div_zero;
    END IF;

    var_result := var_dividend / var_divisor;

    dbms_output.put_line(var_result);

EXCEPTION
    WHEN exception_div_zero THEN
        dbms_output.put_line(var_result);
END;

я хочу знать, когда возникнет исключение после выполнения исключительной части указатель вернется к следующему оператору или просто будет существовать в программе.? Введите здесь код

Ответы [ 2 ]

3 голосов
/ 05 июля 2019

Из Oracle документы -

После запуска обработчика исключения управление переходит к следующему оператору вмещающего блока.Если вмещающего блока нет, то:

Если обработчик исключений находится в подпрограмме, тогда управление возвращается к вызывающему объекту в операторе после вызова.

Если обработчик исключений находится ванонимный блок, затем управление передаётся в хост-среду (например, SQL * Plus)

1 голос
/ 08 июля 2019

Нет, ты не вернешься туда, где ты. Скорее код продолжает идти после обработки исключений.

Проверьте этот тест:

begin
  dbms_output.put_line('One');

  <<inner_one>>
  begin
    raise no_data_found;
    dbms_output.put_line('Two');
  exception
    when no_data_found then
      dbms_output.put_line('Three');
  end inner_one;

  dbms_output.put_line('Four');

  raise no_data_found;

  dbms_output.put_line('Five');

exception
  when no_data_found then
    dbms_output.put_line('Six');
end;

Вывод:

One
Three
Four
Six

Так что версия Try / Catch для Oracle заключается в использовании анонимных блоков внутри ваших блоков. Вы можете вкладывать блоки 255 раз, что много ..

Пример использования подблока для разбора строки даты, если она не удалась, используйте текущую дату / время.:

declare
  l_date date;
begin
  -- some code
  -- parse date
  begin
    l_date := to_date(:input1, 'yyyy-mm-dd hh24:mi:ss');
  exception
    when others then
      l_date := sysdate;
  end;

  --some more code
end;

С уважением Олафур

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...