测试异常处理、抛出
在写oracle存储过程的时候很多东西放到存储过程里面比如一些判断等,要比在程序逻辑里面简单很多,但是也会涉及到捕获和抛出一样的问题。
捕获异常
语法:
EXCEPTION
WHEN excepttion_name1 then
........
WHEN excepttion_name2 then
........
WHEN excepttion_name3 then
........
End;
例子:
declare
a int:=0;
b int:=1;
ex_1 exception;
ex_2 exception;
begin
if a=0 then
raise ex_1;
end if;
if b=1 then
raise ex_2;
end if;
exception
when ex_1 then
DBMS_OUTPUT.put_line('捕获了错误1');
when ex_2 then
DBMS_OUTPUT.put_line('捕获了错误2');
end;
输出:
捕获了错误1
这里由于在ex_1的地方就出现了错误 ,所以下面ex_2没有执行,而是直接跳到错误处理的代码部分了。在Oracle中不允许一个异常由多个异常处理块来处理。
利用OhtERS处理所有的错误
declare
a int:=0;
ex_1 exception;
begin
if a=0 then
raise ex_1;
end if;
exception
when others then
DBMS_OUTPUT.put_line('捕获了全局错误');
end;
输出:image
抛出异常
RAISE_APPLICATION_ERROR 函数
该函数是将应用程序专有的错误从服务器端转达到客户端应用程序(其他机器上的SQLPLUS或者前台开发语言)
PROCEDURE RAISE_APPLICATION_ERROR( error_number_in IN NUMBER, error_msg_in IN VARCHAR2);
error_number_in :自定义的错误码,容许从 -20000 到 -20999 之间,这样就不会与 ORACLE 的任何错误代码发生冲突。
error_msg_in:长度不能超过 2k,否则截取 2k
--eg:
declare
a int:=0;
begin
if a=0 then
RAISE_APPLICATION_ERROR(-20001,'数值不能为0');
end if;
end;
--例如
CREATE OR REPLACE FUNCTION get_number(s in varchar2) return number is
d number;
begin
begin
d := to_number(s);
exception
when others then
d:=0;
end;
return d;
end;