暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

华为GaussDB T 异常语句

墨天轮 2019-10-12
2449

异常语句

异常语句(EXCEPTION)用于处理正常执行过程中未预料的事件。GaussDB 100目前支持系统预定义异常的处理、用户自定义异常的处理以及内部定义异常的处理。这三种异常处理均支持通过sqlcode和sqlerrm获取错误代码和错误消息。

异常处理机制

  • 语法格式
    EXCEPTION { [ WHEN expr THEN sql ] [...] [ WHEN OTHERS THEN sql1 ] } END;
  • 参数说明
    • WHEN expr THEN sql

      expr为异常表达式,sql为捕获异常时对应的处理语句。对同一个异常,只能进行一次处理。

    • WHEN OTHERS THEN sql1

      OTHERS表示不匹配所有异常表达式的其它异常,sql1为捕获其它异常时对应的处理语句。使用“WHEN OTHERS THEN sql1”时,必须放在最后。

  • 示例(异常语句以粗体显示)
    --删除重名的存储过程test_pl_excpt1。 DROP PROCEDURE IF EXISTS test_pl_excpt1;
    --创建存储过程test_pl_excpt1。 CREATE OR REPLACE PROCEDURE test_pl_excpt1 AS v_age INTEGER; v_name VARCHAR(30); BEGIN v_age:=89;v_age:= v_age/0; DBMS_OUTPUT.PUT_LINE('correct'); EXCEPTION WHEN Zero_divide THEN SYS.DBMS_OUTPUT.PUT_LINE('Zero divide'); SYS.DBMS_OUTPUT.PUT_LINE(SQLCODE || 'error ' || sqlerrm); WHEN value_error THEN SYS.DBMS_OUTPUT.PUT_LINE('value error'); SYS.DBMS_OUTPUT.PUT_LINE(SQLCODE || 'error ' || sqlerrm); WHEN OTHERS THEN SYS.DBMS_OUTPUT.PUT_LINE('other error'); SYS.DBMS_OUTPUT.PUT_LINE(sqlcode||'error'||sqlerrm); END; /

使用SQLCODE和SQLERRM处理异常

  • 功能描述

    在存储过程中,可使用SQLCODE获取错误码,使用SQLERRM获取与错误码对应的错误信息。

  • 注意事项
    • SQLCODE和SQLERRM可以作为变量在存储过程中进行定义。如果自己进行了定义并设置了相应的值,在通过SQLCODE和SQLERRM去获取错误信息时,将获取到自己设置的值,而无法获取到系统参数的错误码和错误消息。
    • 存储过程中进行异常处理不带参数时可以不带括号。
  • 语法格式
    • SQLCODE语法格式
      SQLCODE();
    • SQLERRM语法格式
      SQLERRM([ errorcode ]);
  • 示例(SQLCODE和SQLERRM以粗体显示)
    CREATE OR REPLACE PROCEDURE test_pl_excpt1 AS v_age INTEGER; v_name VARCHAR(30); BEGIN v_age:=89;v_age:= v_age/0; DBMS_OUTPUT.PUT_LINE('correct'); EXCEPTION WHEN Zero_divide THEN SYS.DBMS_OUTPUT.PUT_LINE('Zero divide'); SYS.DBMS_OUTPUT.PUT_LINE(SQLCODE || 'error ' || SQLERRM); WHEN value_error THEN SYS.DBMS_OUTPUT.PUT_LINE('value error'); SYS.DBMS_OUTPUT.PUT_LINE(SQLCODE || 'error ' || SQLERRM); WHEN OTHERS THEN SYS.DBMS_OUTPUT.PUT_LINE('other error'); SYS.DBMS_OUTPUT.PUT_LINE(SQLCODE||'error'||SQLERRM); END; /

系统预定义异常

系统预定义异常有14个,详情请参见表1。处理系统预定义异常时,异常由系统自动引发,无需在程序中再次对其进行定义。

表1 系统预定义异常

序号

异常名

错误号

1

CASE_NOT_FOUND

902

2

CURSOR_ALREADY_OPEN

904

3

DUP_VAL_ON_INDEX

729

4

INVALID_CURSOR

905

5

INVALID_NUMBER

636

6

NO_DATA_FOUND

906

7

PROGRAM_ERROR

908

8

ROWTYPE_MISMATCH

926

9

STORAGE_ERROR

911

10

SYS_INVALID_ROWID

639

11

TIMEOUT_ON_RESOURCE

723

12

TOO_MANY_ROWS

915

13

VALUE_ERROR

635

14

ZERO_DIVIDE

637

用户自定义异常

  • 语法格式
    exception_name EXCEPTION;

    声明异常后,可通过raise语句来抛出异常。

  • 参数说明

    exception_name

    所声明异常的名称。

  • 示例(用户自定义异常的使用以粗体显示)
    CREATE OR REPLACE PROCEDURE employee_income ( salary number ) IS low_income EXCEPTION; //声明异常 BEGIN IF salary < 30000 THEN RAISE low_income; //抛出异常 END IF; EXCEPTION WHEN low_income THEN //处理异常 DBMS_OUTPUT.PUT_LINE ('low_income:'||salary); END; / BEGIN employee_income (10000); END; / 输出: low_income:10000

内部定义异常

  • 功能描述

    内部定义异常是GaussDB 100内部定义的错误,在执行存储过程出错时,会自动抛出内部定义的错误码和错误信息。

  • 语法格式
    --定义异常。 exception_name EXCEPTION;
    --将异常和内部错误码进行绑定。 PRAGMA EXCEPTION_INIT (exception_name, error_code);
  • 参数说明
    • exception_name

      所定义异常的名称。

    • error_code

      异常对应的错误码,支持的错误号范围为(0, 100000) 或者[-20999, -20000]。

  • 示例
    DECLARE my_except EXCEPTION; PRAGMA EXCEPTION_INIT(my_except, 932); BEGIN ... EXCEPTION WHEN my_except THEN ... WHEN OTHERS THEN ... END; /
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论