VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

调试

语法格式

RAISE有以下五种语法格式:

图1 raise_format::=

图2 raise_condition::=

图3 raise_sqlstate::=

图4 raise_option::=

图5 raise::=

参数说明

  • level

    用于指定错误级别,有DEBUG,LOG,INFO,NOTICE,WARNING以及EXCEPTION(默认值)。

    EXCEPTION抛出一个正常终止当前事务的异常,其他的仅产生不同异常级别的信息。特殊级别的错误信息是否报告到客户端、写到服务器日志由log_min_messagesclient_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作为消息文本。

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

  • 用于ERRCODE指定的条件名称和condition_name可见SQL标准错误码说明,仅支持其中的ERROR类条件名。

  • 当由SQLSTATE指定了错误码,则不局限于已定义的错误码,可以选择任意包含五个数字或者大写的ASCII字母的错误码,而不是00000。建议避免使用以三个0结尾的错误码,因为这种错误码是类别码,会被整个种类捕获。

  • Oracle兼容模式下,SQLCODE等于SQLSTATE。

示例

示例1: 终止事务时,给出错误和提示信息。

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

示例2: 两种设置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';
    
  • 或者另一种方式:

    RAISE unique_violation USING MESSAGE = 'Duplicate user ID: ' || user_id;
    

例如:

  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
  SQLSTATE: 22012