当我们遇到异常时,指针将移至异常部分,如果处理了异常,则指针将返回或移至下一部分。?????
情况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;
我想知道何时遇到异常 在执行异常部分之后,指针将返回到下一条语句或它刚刚存在该程序。在此处输入代码
答案 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;
问候 奥拉富尔