OceanBase支持的预定义异常如下表所示。

    异常名称

    异常编号

    异常描述

    CASE_NOT_FOUND

    -6592

    CASE 语句中没有任何 WHEN 子句满足条件,且没有 ELSE 子句。

    CURSOR_ALREADY_OPEN

    -6511

    程序尝试打开一个已经打开的游标。

    NO_DATA_FOUND

    -4026

    SELECT INTO 语句没有返回数据,不包括调用聚合函数的SELECT INTO 语句。

    TOO_MANY_ROWS

    -1422

    SELECT INTO 语句返回多行数据。

    VALUE_ERROR

    -6502

    FETCH 语句的 LIMIT 子句表达式结果不是正整数。

    ZERO_DIVIDE

    -1476

    表达式尝试除以0 。

    示例:多个预定义异常处理程序

    1. delimiter /
    2. CREATE OR REPLACE PROCEDURE sp_test_exception(p_w_id IN ware.w_id%TYPE )
    3. AS
    4. TYPE TYPE_REFCURSOR IS REF CURSOR ;
    5. ref_cursor TYPE_REFCURSOR;
    6. ware_name ware.w_name%TYPE;
    7. sum_ytd number(10,2) := -1;
    8. BEGIN
    9. OPEN ref_cursor FOR SELECT sum(w_ytd) sum_ytd FROM ware WHERE ( w_id = p_w_id AND p_w_id IS NOT NULL ) OR (p_w_id IS NULL );
    10. FETCH ref_cursor INTO sum_ytd;
    11. dbms_output.put_line('Fetch a ware ytd sum : ' || to_char(nvl(sum_ytd, '-999.99')) || '.');
    12. CLOSE ref_cursor;
    13. OPEN ref_cursor FOR SELECT w_name FROM ware WHERE ( w_id = p_w_id AND p_w_id IS NOT NULL ) OR (p_w_id IS NULL );
    14. FETCH ref_cursor INTO ware_name ;
    15. IF ref_cursor%NOTFOUND THEN
    16. dbms_output.put_line('Fetch a ware name but ref cursor return NOTFOUND.');
    17. ELSE
    18. dbms_output.put_line('Fetch a ware name : ' || ware_name || '.');
    19. END IF;
    20. CLOSE ref_cursor;
    21. SELECT w_name INTO ware_name FROM ware WHERE ( w_id = p_w_id AND p_w_id IS NOT NULL ) OR (p_w_id IS NULL );
    22. dbms_output.put_line('Fetch again a ware name : ' || ware_name || '.');
    23. EXCEPTION
    24. WHEN CURSOR_ALREADY_OPEN THEN
    25. dbms_output.put_line('Handle a CURSOR_ALREADY_OPEN exception. ');
    26. WHEN NO_DATA_FOUND THEN
    27. dbms_output.put_line('Handle a NO_DATA_FOUND exception. ');
    28. WHEN TOO_MANY_ROWS THEN
    29. dbms_output.put_line('Handle a TOO_MANY_ROWS exception. ');
    30. WHEN OTHERS THEN
    31. dbms_output.put_line('Raise an unkown exception !');
    32. RAISE ;
    33. END;
    34. /
    35. delimiter ;
    36. obclient> set serveroutput on;
    37. Query OK, 0 rows affected (0.00 sec)
    38. obclient> select w_id,w_ytd,w_name from ware;
    39. +------+-------+------------+
    40. | W_ID | W_YTD | W_NAME |
    41. +------+-------+------------+
    42. | 2 | 1200 | L6xwRsbDk |
    43. | 1 | 1200 | n1P4zYo8OH |
    44. +------+-------+------------+
    45. 2 rows in set (0.01 sec)
    46. obclient> call sp_test_exception(NULL);
    47. Query OK, 0 rows affected (0.03 sec)
    48. Fetch a ware ytd sum : 2400.
    49. Fetch a ware name : L6xwRsbDk.
    50. Handle a TOO_MANY_ROWS exception.
    51. obclient>
    52. obclient> call sp_test_exception(1);
    53. Query OK, 0 rows affected (0.01 sec)
    54. Fetch a ware ytd sum : 1200.
    55. Fetch a ware name : n1P4zYo8OH.
    56. Fetch again a ware name : n1P4zYo8OH.
    57. obclient>
    58. obclient> call sp_test_exception(3);
    59. Query OK, 0 rows affected (0.00 sec)
    60. Fetch a ware ytd sum : -999.99.
    61. Fetch a ware name but ref cursor return NOTFOUND.
    62. Handle a NO_DATA_FOUND exception.
    63. obclient>