VastbaseG100

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

Menu

DECLARE CONDITION

功能描述

Vastbase在MySQL兼容模式下支持使用DECLARE...CONDITION语句声明一个命名的错误条件,可以为错误号或者SQLSTATE重命名,在异常处理中可以使用声明的CONDITION。

注意事项

  • 该功能仅在数据库兼容模式为MySQL时支持(即数据库实例初始化时指定DBCOMPATIBILITY='B')。
  • MySQL中mysql_error_code与错误信息一 一对应,在Vastbase中没有与之对应的关系,仅做语法支持。
  • 支持在触发器和匿名块中使用该语法。

语法格式

DECLARE condition_name CONDITION FOR condition_value

其中condition_value内容如下:

{
mysql_error_code
| SQLSTATE [VALUE] sqlstate_value
}

参数说明

  • condition_name

    条件名称。

  • condition_value

    指示要与条件名称相关联的特定条件或条件类别,支持以下形式:

    • mysql_error_code:表示MySQL错误代码的整数文字,不支持使用MySQL错误代码0,因为这表示成功而不是错误条件。
    • SQLSTATE [VALUE]:一个 5 字符的字符串文字,指示SQLSTATE值。例如:SQLSTATE '22012'。

示例

前置步骤

设置serveroutput为on。

set serveroutput = on;

示例1: 存储过程begin内部声明处理程序,handler方法调用。

1、创建存储过程,begin内部定义condition处理程序。

create or replace procedure testpro() as
declare
a int;
begin
declare t_condition condition for SQLSTATE '22012' ;
declare exit handler for t_condition
begin
RAISE NOTICE 'SQLSTATE = %,SQLCODE = %,SQLERROR=%',SQLSTATE,returned_sqlstate,message_text;
end;
a = 1/0;
end;
/

2、调用存储过程。

call testpro();

返回结果为:

NOTICE:  SQLSTATE = 22012,SQLCODE = 33816706,SQLERROR=division by zero
 testpro
---------

(1 row)

示例2: 存储过程begin内部声明处理程序,exception方法调用。

1、创建测试表。

create table test(id int,info text);

2、调用存储过程。

create or replace procedure testpro() as
declare
a int;
begin
declare t_condition condition for SQLSTATE '22012' ;
a = 1/0;
EXCEPTION
WHEN t_condition THEN
begin
insert into test values (1,'success');
RAISE NOTICE 'SQLSTATE = %,SQLCODE = %,SQLERRM = %',SQLSTATE,SQLCODE,SQLERRM;
end;
end;
/

3、调用存储过程。

call testpro();

返回结果为:

NOTICE:  SQLSTATE = 22012,SQLCODE = 33816706,SQLERRM = division by zero
 testpro
---------

(1 row)

4、查询数据。

select * from test;

返回结果为:

 id |  info
----+---------
  1 | success
(1 row)