更新时间:2026-10-21 GMT+08:00
调试
语法
RAISE有以下五种语法格式:
- raise_format::=语法如图1所示。
- raise_condition::=语法如图2所示。
- raise_sqlstate::=语法如图3所示。
- raise_option::=语法如图4所示。
- raise::=语法如图5所示。
参数说明:
- level选项用于指定错误级别,有DEBUG、LOG、INFO、NOTICE、WARNING以及EXCEPTION(默认值)。EXCEPTION抛出一个正常终止当前事务的异常,其他的仅产生不同异常级别的信息。特殊级别的错误信息是否报告到客户端、写到服务器日志由log_min_messages和client_min_messages这两个GUC参数控制。
- format:格式字符串,指定要报告的错误消息文本。格式字符串后可跟表达式,用于向消息文本中插入。在格式字符串中,%由format后面跟着的参数的值替换,%%用于打印出%。例如:
--v_job_id 将替换字符串中的 %: RAISE NOTICE 'Calling cs_create_job(%)',v_job_id;
- option = expression:向错误报告中添加另外的信息。关键字option可以是MESSAGE、DETAIL、HINT以及ERRCODE,并且每一个expression可以是任意的字符串。
- MESSAGE,指定错误消息文本,这个选项不能用于在USING前包含一个格式字符串的RAISE语句中。
- DETAIL,说明错误的详细信息。
- HINT,用于打印出提示信息。
- ERRCODE,向报告中指定错误码(SQLSTATE)。可以使用条件名称或者直接用五位字符的SQLSTATE错误码。
- condition_name:错误码对应的条件名。
- sqlstate:错误码。
如果在RAISE EXCEPTION命令中既没有指定条件名也没有指定SQLSTATE,默认用RAISE EXCEPTION (P0001)。如果没有指定消息文本,默认用条件名或者SQLSTATE作为消息文本。
- 当由SQLSTATE指定了错误码,则不局限于已定义的错误码,可以选择任意包含五个数字或者大写的ASCII字母的错误码,而不是00000。建议避免使用以三个0结尾的错误码,因为这种错误码是类别码,会被整个种类捕获。
- 兼容ORA模式下,SQLCODE等于SQLSTATE。
- 图5所示的语法不接受任何参数。这种形式仅用于一个BEGIN块中的EXCEPTION语句,它使得错误重新被处理。
EXCEPTION_INIT语法
兼容ORA模式下,支持使用EXCEPTION_INIT语法自定义错误码SQLCODE。
语法图如图6所示。
参数说明:
- exception_name为用户声明的异常名,EXCEPTION_INIT语法必须出现在与声明异常相同部分,位于声明异常之后。
- sqlcode为自定义的SQLCODE,必须为负整数,取值范围-2147483647~-1。
注意事项:
- 支持在ORA兼容性下使用,不支持与系统错误码进行绑定。
- exception关联的sqlcode只能通过exception_init赋值,其他赋值方式无效。
- 不支持跨database.schema.package.exception调用。
- 使用EXCEPTION_INIT语法自定义错误码SQLCODE时,SQLSTATE与SQLCODE相同,SQLERRM格式为" xxx: non-GaussDB Exception"。比如自定义SQLCODE=-1,则SQLSTATE="-1",SQLERRM=" 1: non-GaussDB Exception"。
- 在同一个存储过程或函数中,通过EXCEPTION_INIT设置相同错误码时,Oracle数据库不支持分别作为条件捕获异常,GaussDB支持此行为,详见示例。
示例
终止事务时,给出错误和提示信息:
CREATE OR REPLACE PROCEDURE proc_raise1(user_id in integer) AS BEGIN RAISE EXCEPTION 'Noexistent ID --> %',user_id USING HINT = 'Please check your user ID'; END; / call proc_raise1(300011); --执行结果 ERROR: Noexistent ID --> 300011 HINT: Please check your user ID
两种设置SQLSTATE的方式:
CREATE OR REPLACE PROCEDURE proc_raise2(user_id in integer) AS BEGIN RAISE 'Duplicate user ID: %',user_id USING ERRCODE = 'unique_violation'; END; / \set VERBOSITY verbose call proc_raise2(300011); --执行结果 ERROR: Duplicate user ID: 300011 SQLSTATE: 23505
如果主要的参数是条件名或者是SQLSTATE,可以使用:
RAISE division_by_zero; RAISE SQLSTATE '22012';
例如:
CREATE OR REPLACE PROCEDURE division(div in integer, dividend in integer)
AS
DECLARE
res int;
BEGIN
IF dividend=0 THEN
RAISE division_by_zero;
RETURN;
ELSE
res := div/dividend;
RAISE INFO 'division result: %', res;
RETURN;
END IF;
END;
/
call division(3,0);
--执行结果
ERROR: division_by_zero 或者另一种方式:
RAISE unique_violation USING MESSAGE = 'Duplicate user ID: ' || user_id;
在同一个存储过程或函数中,通过EXCEPTION_INIT设置相同错误码时,Oracle数据库不支持分别作为条件捕获异常,GaussDB支持此行为。
gaussdb=# CREATE OR REPLACE PACKAGE pkg IS gaussdb$# err1 EXCEPTION; gaussdb$# err2 EXCEPTION; gaussdb$# PRAGMA EXCEPTION_INIT(err1, -10001); gaussdb$# PRAGMA EXCEPTION_INIT(err2, -10001); gaussdb$# PROCEDURE pro; gaussdb$# END pkg; gaussdb$# / CREATE PACKAGE gaussdb=# CREATE OR REPLACE PACKAGE BODY pkg IS gaussdb$# PROCEDURE pro IS gaussdb$# BEGIN gaussdb$# FOR i IN 1..10 LOOP gaussdb$# BEGIN gaussdb$# IF i = 1 THEN gaussdb$# raise err1; gaussdb$# END IF; gaussdb$# IF i = 2 THEN gaussdb$# raise err2; gaussdb$# END IF; gaussdb$# EXCEPTION gaussdb$# -- 相同错误码拆分作为EXCEPTION的两个不同条件。 gaussdb$# WHEN err1 THEN gaussdb$# CONTINUE; gaussdb$# WHEN err2 THEN gaussdb$# EXIT; gaussdb$# END; gaussdb$# END LOOP; gaussdb$# END pro; gaussdb$# END pkg; gaussdb$# / CREATE PACKAGE BODY gaussdb=# CALL pkg.pro(); pro ----- (1 row) gaussdb=# DROP PACKAGE pkg; NOTICE: drop cascades to function public.pro() DROP PACKAGE
父主题: 存储过程





