异常处理
本章节介绍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;