背景
在Oracle中支持用户 自定义异常,抛出自定义异常,处理自定义异常 来扩展业务自定义异常,丰富PLSQL行为。
LightDB在2024RP1版本里面,将支持PL/SQL自定义异常功能
支持范围匿名块,函数,存储过程
语法格式
DECLARE
exception_name EXCEPTION;
PRAGMA EXCEPTION_INIT(exception_name,error_code);
BEGIN
...
RAISE exception_name;
...
EXCEPTION WHEN exception_name THEN
...
END;
/
error_code取值范围为正100,大于-100000且不等于-1403的负数
匿名块中使用场景案例:
declare
a exception;
b exception;
pragma exception_init(a,-20001);
pragma exception_init(a,-20002);
begin
raise a;
exception
when a then
dbms_output.put_line('a sqlcode:' || sqlcode || ',sqlerrm:' || sqlerrm);
when b then
dbms_output.put_line('b sqlcode:' || sqlcode || ',sqlerrm:' || sqlerrm);
when others then
dbms_output.put_line('others sqlcode:' || sqlcode || ',sqlerrm:' || sqlerrm);
end;
/
--运行结果
a sqlcode:-20001,sqlerrm:ORA-20001:
函数中使用场景案例:
create or replace function func_custom_exception(id int) return integer as
a exception;
pragma exception_init(a,-20001);
begin
if id = 1 then
return id;
end if;
raise a;
exception
when a then
dbms_output.put_line('a sqlcode:' || sqlcode || ',sqlerrm:' || sqlerrm);
return sqlcode;
when others then
dbms_output.put_line('others sqlcode:' || sqlcode || ',sqlerrm:' || sqlerrm);
return id;
end;
/
declare
r integer;
begin
r := func_custom_exception(1);
dbms_output.put_line('r:' || r);
r := func_custom_exception(2);
dbms_output.put_line('r:' || r);
end;
/
--运行结果
r:1
a sqlcode:-20001,sqlerrm:ORA-20001:
r:-20001
存储过程中使用场景案例:
create or replace procedure proc_custom_exception(id int) as
a exception;
pragma exception_init(a,-20001);
begin
if id = 1 then
dbms_output.put_line('id:' || id);
return;
end if;
raise a;
exception
when a then
dbms_output.put_line('a sqlcode:' || sqlcode || ',sqlerrm:' || sqlerrm);
when others then
dbms_output.put_line('others sqlcode:' || sqlcode || ',sqlerrm:' || sqlerrm);
end;
/
begin
proc_custom_exception(1);
proc_custom_exception(2);
end;
/
--运行结果
id:1
a sqlcode:-20001,sqlerrm:ORA-20001:
以上功能,将在2024RP1的LightDB版本与大家见面!