VastbaseG100

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

Menu

DECLARE CONDITION

功能描述

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

语法格式

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'。

注意事项

  • 该功能仅在数据库兼容模式为MySQL时能够使用(即创建DB时DBCOMPATIBILITY='B'),在其他数据库兼容模式下不能使用该特性。
  • MySQL中 mysql_error_code 与错误信息一一对应,在vastbase 中没有与之对应的关系,只做语法支持。
  • 支持在触发器和匿名块中使用。

示例

前置步骤

1、创建兼容MySQL的库db_mysql,并进入。

CREATE DATABASE db_mysql dbcompatibility='B';
\c db_mysql

2、设置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)