系统中没有预设名字的异常错误¶
语法:
exception_name EXCEPTION
PRAGMA EXCEPTION_INIT(exception_name, err_code);
以上在declare块中。
EXCEPTION WHEN condition THEN
BEGIN
statements
END:
参数:
exception_name
用户自行决定的一个错误名,最好不要跟系统原有错误名重复,如果重复,那么在这个变量的作用域内,同名系统内部错误无法用这个名字捕捉到。
err_code
一个系统内部预设的异常的错误号。
condition
错误的类型,这个异常条件是用来让存储过程的用户过滤感兴趣的异常,比如,当进行SELECT INTO操作时,如果返回的结果为0或者大于1,系统都会报告一个异常,这时,就可以使用相应的条件来过滤这些异常条件。其他未过滤的异常将会进入正常的路径,导致系统退出整个事务并跳回主循环。
statements
当发生异常时,需要执行的语句。
说明:
这里定义的exception的作用域与普通变量一样。内层可以捕获外层定义的exception,外层却无法用内层定义的异常名来捕捉该异常。系统中原本有名字的异常,也可以用这种方法,给它一个别名,然后捕捉。目前系统中各种异常的错误号还没有被整理出来,所以,绝大多数异常还是只能通过others进行捕捉。
示例:没有预设名字的异常错误语句¶
-- 清理环境
DROP PROCEDURE proc;
CREATE OR REPLACE PROCEDURE proc as
m exception;
n int;
pragma exception_init(m,848297995);
BEGIN
n = 10/0;
exception when m then
dbms_output.put_line('good morning');
END;
/
exec proc;
--删除过程
DROP PROCEDURE proc;