VastbaseG100

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

Menu

异常处理

本章节介绍Vastbase G100兼容Oracle的异常处理能力。

RAISE自定义异常

功能描述

Vastbase支持RAISE语句显式引发异常,在异常处理程序外部必须指定异常名称。

语法格式

declare
 exception_name exception;
begin
 raise exception_name;
exception
 when exception_name then
-- handle the error
end;

参数说明

exception_name

自定义的异常变量名。

注意事项

无。

示例

1、设置serveroutput为on。

set serveroutput on;

2、创建存储过程自定义异常。

create or replace procedure pro1
as
  past_due exception;
  v_var1 number :=2;
  v_var2 number :=1;
begin
  if v_var1 > v_var2 then
     raise past_due;
  end if;
exception
  when past_due then 
    DBMS_OUTPUT.PUT_LINE('Account past due.');
end;
/

3、调用存储过程。

exec pro1();

返回结果为:

Account past due.
 pro1
------

(1 row)

4、清理环境。

DROP PROCEDURE pro1;
SET serveroutput TO default;

EXCEPTION_INIT预定义异常处理

功能描述

使用exception_init可以将自定义异常变量名称与自定义的异常的错误代码关联。

语法格式

PRAGMA EXCEPTION_INIT (exception_name,error_code)

参数说明

  • exception_name

    自定义的异常变量名。

  • error_code

    自定义错误编号。

    取值范围:-20000~20999

注意事项

无。

示例

1、设置serveroutput为on。

set serveroutput on;

2、创建测试表。

create table t2(id int not null,name varchar2(50));

3、创建存储过程声明预定义的异常处理。

create or replace procedure pro1
as
e_missingnull exception;
PRAGMA EXCEPTION_INIT(e_missingnull ,-1400);
begin
insert into t2(id) values(null);
commit;
exception
when e_missingnull then
dbms_output.put_line(SQLERRM);
rollback;
end;
/

4、调用存储过程。

exec pro1();

返回结果为:

ERROR:  null value in column "id" violates not-null constraint
DETAIL:  Failing row contains (null, null).
CONTEXT:  SQL statement "insert into t2(id) values(null)"
PL/pgSQL function pro1() line 5 at SQL statement

5、清理环境。

DROP PROCEDURE pro1;
DROP TABLE t2;
SET serveroutput TO default;

RAISE_APPLICATION_ERROR存储过程

功能描述

RAISE_APPLICATION_ERROR存储过程用于声明自定义异常编号和错误信息。

使用流程

1、RAISE_APPLICATION_ERROR定义异常编号和错误信息。

2、通过exception_init关联异常编号。

3、捕获异常变量。

语法格式

RAISE_APPLICATION_ERROR(error_code,message[,{TURE | FALSE}]);

参数说明

  • error_code

    用户自定义异常变量编号。

    取值范围:-20000~20999

  • message

    错误信息,允许最长2k的字符串。

  • [{TURE | FALSE}]

    输出自定义错误信息。

    默认值:TRUE

    当设置为FALSE,输出系统错误信息。

注意事项

无。

示例

1、设置serveroutput 为on(允许将dbms_output.put_line的输出信息输出至vsql的命令界面的屏幕上)。

set serveroutput on;

2、创建存储过程声明自定义异常编号和错误信息。

create or replace procedure account_status(
due_date DATE,
today DATE
)authid definer
is
begin
if due_date < today then
RAISE_APPLICATION_ERROR(-20000,'Account past due.');
end if ;
end;
/

3、调用存储过程。

declare
past_due exception;
PRAGMA EXCEPTION_INIT(past_due,-20000);
begin
account_status('2021-10-22','2021-11-22');
exception
when past_due then
dbms_output.put_line(SQLERRM);
end;
/

返回结果为:

Account past due.
ANONYMOUS BLOCK EXECUTE

4、清理环境。

DROP PROCEDURE account_status;
SET serveroutput TO default;