异常语句
异常语句(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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。评论
- 参数说明
- 功能描述
- 参数说明
- 示例(SQLCODE和SQLERRM以粗体显示)
- SQLERRM语法格式
- SQLCODE语法格式
- 参数说明




