异常处理
(1)自定义异常:必须首先在声明部分声明异常,然后在执行部分抛出异常,最后由异常处理区域捕获异常。
(2)有些Oracle内部错误只有错误编号,而没有异常名称。使用 EXCEPTION_INIT,可以将自定义的异常名称与错误编号关联起来。
EXCEPTION_INIT只能定义在声明部分,语法如下:
pragma EXCEPTION_INIT(exception_name, oracle_error_number);
(3)RAISE_APPLICATION_ERROR,是Oracle中的一个内置函数,只能在存储的子程序中调用(即函数,存储过程,包等,不能在匿名的程序块中使用),
能够抛出用户自定义的错误消息,语法如下:
1 raise_application_error(error_number, error_message, [keep_errors]);
其中,error_number是范围在 -20000 到 -20999之间的负整数,error_message是最大长度为2048字节的字符串。
(4)重新抛出异常
在捕捉到异常之后,要想重新抛出异常,只要在本地处理程序放置一个 raise 语句即可。
(5)从异常中恢复
要想实现从异常中恢复,可以将异常放在子块中,在子块中编写对应的异常处理程序,当子块结束后,就可以继续执行外层块中的下一条语句。
(6)跟踪异常发生的具体位置
可以使用 DBMS_UTILITY.FORMAT_ERROR_BACKTRACE函数来获取异常发生的具体位置。该函数返回错误发生的具体位置的行号,必须在异常处理模块调用这个函数来访问异常的栈。
(7)抛出一个异常并不会终止一个事务,除非在异常处理器中显式使用了 ROLLBACK 语句 或 COMMIT 语句。如果顶层的语句块中存在一个未处理的异常,该异常将被传递到调用环境,服务器端将会自动回滚该事务。