【问题标题】:execution flow of program when encounter exception oracle PLSQL遇到异常oracle PLSQL时程序的执行流程
【发布时间】:2019-11-16 07:56:20
【问题描述】:
当我们遇到异常时,指针会移动到异常部分,如果异常被处理,指针会返回或移动到下一部分。?????
案例一:系统定义异常
案例 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;
我想知道什么时候遇到异常
执行异常部分后,指针将返回到下一条语句,或者它只是存在程序。??在这里输入代码
【问题讨论】:
标签:
sql
oracle
exception
plsql
plsqldeveloper
【解决方案1】:
来自 Oracle docs -
异常处理程序运行后,控制转移到封闭块的下一条语句。如果没有封闭块,则:
如果异常处理程序在子程序中,则在调用后的语句处将控制权返回给调用者。
如果异常处理程序位于匿名块中,则控制转移到主机环境(例如,SQL*Plus)
【解决方案2】:
不,你不会回到你所在的地方。而是代码在异常处理之后继续运行。
看看这个测试:
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;
问候
奥拉弗