1、编译时错误主要集中在一下几点:
语句忘记";";拼写错误;注释错误;
2、运行时错误
declaration块的错误不能被local exception捕获;最容易捕获的错误是从运行块(exec block)发生的错误,因为此错误首先被local exception捕获,接着是包容块进行捕捉。
只有外部excetpion 才能捕捉local exception的运行时错误。
Exception块包含WHEN块,WHEN块的定义如下:
WHEN {predefined_exception | user_defined_exception | OTHERS} THEN
exception_handling_statement;
[RETURN | EXIT ];
Exception 内建函数。
SQLCODE:返回-20001~-20999,每个值对应一个确定的oracle预定义错误,没有错误则返回1,NO_DATA_FOUND除外,返回100;
SQLERRM:返回oracle错误代码和出错信息。
系统预定义的错误在SYS.STANDARD包里面;
手动触发Exception: Raise e,将控制权交给Exception handler;
最佳实践:Good PL/SQL coding practices avoid dynamic assignments in declaration blocks.
3、用户自定义Exception
可以在declaration 块声明一个EXCEPTION 变量,也可以在执行快动态创建exception;
declaration块中声明exception demo1
DECLARE
e EXCEPTION;
BEGIN
RAISE e;
dbms_output.put_line('Can''t get here.');
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE = 1 THEN
dbms_output.put_line('This is a ['||SQLERRM||'].');
END IF;
END;
用户定义exception返回SQLCODE默认是1,所以可以在exception块中用此值。
demo2
分为两步,首先定义exception,接着将此exception与一个数值关联,如下:
DECLARE
a VARCHAR2(20);
--定义exception
invalid_userenv_parameter EXCEPTION;
--将此exception变量与-2003关联
PRAGMA EXCEPTION_INIT(invalid_userenv_parameter,-2003);
BEGIN
a := SYS_CONTEXT('USERENV','PROXY_PUSHER');
EXCEPTION
WHEN invalid_userenv_parameter THEN
dbms_output.put_line(SQLERRM);
END;
执行后结果即为:ORA-02003: invalid USERENV parameter.
4、Exception处理的两条路径:
当exception为fatal error引起,会影响到业务逻辑的正确性时,考虑结束并恢复数据;当exception为非fatal error引起时,应该让此次事务完成(complete),并记录到日志。
pl/sql学习笔记之五 错误管理 error mgt
最新推荐文章于 2021-07-17 16:53:11 发布