oracle plsql 捕获异常和抛出异常
在写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;
抛出异常
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
例子:让一个数不能为0
declare a int:=0; begin if a=0 then RAISE_APPLICATION_ERROR(-20001,‘数值不能为0’); end if; end;
运行: