遇到异常oracle PLSQL时程序的执行流程

时间:2019-07-05 17:27:33

标签: sql oracle exception plsql plsqldeveloper

当我们遇到异常时,指针将移至异常部分,如果处理了异常,则指针将返回或移至下一部分。?????

情况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 个答案:

答案 0 :(得分:3)

从Oracle docs-

运行异常处理程序后,控制权转移到封闭块的下一条语句。如果没有封闭块,则:

如果异常处理程序位于子程序中,则控制将在调用后的语句处返回到调用者。

如果异常处理程序位于匿名块中,则控制权将转移到主机环境(例如SQL * Plus)

答案 1 :(得分:1)

不,您不会回到自己所在的位置。而是代码会继续执行异常处理。

检查此测试:

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

因此,Oracle的Try / Catch版本是在块内使用匿名块。您可以嵌套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;

问候 奥拉富尔