ITPub博客

首页 > 数据库 > > 存储过程-调试

存储过程-调试

作者:GaussDB_数据库 时间:2020-01-17 09:41:14 0 删除 编辑

语法

RAISE有以下五种语法格式:

图1 raise_format::=
GaussDB raise_format::=
图2 raise_condition::=
GaussDB raise_condition::=
图3 raise_sqlstate::=
GaussDB raise_sqlstate::=
图4 raise_option::=
GaussDB raise_option::=
图5 raise::=
GaussDB raise::=

参数说明:

  • level选项用于指定错误级别,有DEBUG,LOG,INFO,NOTICE,WARNING以及EXCEPTION(默认值)。EXCEPTION抛出一个正常终止当前事务的异常,其他的仅产生不同异常级别的信息。特殊级别的错误信息是否报告到客户端、写到服务器日志由log_min_messages和client_min_messages这两个配置参数控制。
  • 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结尾的错误码,因为这种错误码是类别码,会被整个种类捕获。

 说明:

图5所示的语法不接任何参数。这种形式仅用于一个BEGIN块中的EXCEPTION语句,它使得错误重新被处理。

示例

终止事务时,给出错误和提示信息:
CREATE OR REPLACE PROCEDURE proc_raise1(user_id in integer)
AS
BEGIN
RAISE EXCEPTION 'Noexistence ID --> %',user_id USING HINT = 'Please check your user ID';
END;
/
call proc_raise1(300011);
--执行结果
ERROR: Noexistence 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
LOCATION: exec_stmt_raise, pl_exec.cpp:3482
如果主要的参数是条件名或者是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= THEN
RAISE division_by_zero;
RETURN;
ELSE
res := div/dividend;
RAISE INFO 'division result: %', res;
RETURN;
END IF;
END;
/
call division(3,);
--执行结果
ERROR: division_by_zero
或者另一种方式:
RAISE unique_violation USING MESSAGE = 'Duplicate user ID: ' || user_id;


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69959250/viewspace-3129808/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2020-01-06

  • 博文量
    2907
  • 访问量
    19240