当 STORED PROCEDURE 代码发生一个运行时错误,就会上报一个异常。如果子程序(或者STORED PROCEDURE 块)在异常抛出点后面有异常处理部分,则程序控制会跳转到异常处理部份;否则,异常会继续上报或者程序执行停止。

    运行时错误可能产生于设计错误、编码错误、硬件故障或其他源头。

    OceanBase 数据库有一些预定义异常,会在程序违反数据库规则或者超出系统依赖限制时自动抛出。例如,如果 SELECT INTO 语句没有返回数据行,OceanBase 会上报一个预定义异常 NO_DATA_FOUND 。

    STORED PROCEDURE 也允许您定义(声明)自己的异常逻辑。一个异常声明的语法格式如下:

    1. exception_name EXCEPTION;

    不同于预定义异常,用户自定义的异常在条件触发时必须显式的上报。方法是使用 RAISE 语句或者使用 RAISE_APPLICATION_ERROR 方法。举个例子:

    1. IF condition THEN RAISE exception_name;

    子程序的异常处理部分包含一个或多个异常处理程序。一个异常处理程序的语法格式如下:

    1. WHEN { exception_name [ OR exception_name ]... | OTHERS } THEN
    2. statement; [ statement; ]...

    每个异常处理程序通常能够处理特定类型的异常,当定义了多个异常处理程序时,STORED PROCEDURE 引擎会顺序判断使用哪个异常处理程序去处理异常,当异常被处理后控制就跳出所在的异常处理部分。在异常处理语句中,依然可以选择继续 RAISE 异常。

    WHEN OTHERS 异常处理启能够处理所有意外的运行时错误。一旦使用了这个,必须是放在最后一个。示例格式如下:

    1. EXCEPTION
    2. WHEN exception_1 THEN
    3. statement; [ statement; ]...
    4. WHEN exception_2 OR exception_3 THEN
    5. statement; [ statement; ]...
    6. WHEN OTHERS THEN
    7. statement; [ statement; ]...
    8. RAISE; -- 重新 RAISE 异常.
    9. END;

    还有一个替代 WHEN OTHERS 异常处理程序的方法是使用 EXCEPTION_INIT 指示。这个是给STORED PROCEDURE 编译器用的,将一个自定义异常名称跟 OceanBase 错误号关联:

    1. PRAGMA EXCEPTION_INIT(exception_name, error_code);

    针对异常的内容,STORED PROCEDURE 提供两个变量 SQLCODE 和 SQLERRM 用于获取异常错误码和异常描述。