我有一个名为employee的表,有两列,并为其创建了两个函数 插入和更新操作。这两个函数将通过另一个函数调用 名为udf_3()的函数。
我想对udf_3()
的第三个函数进行异常处理
给我详细说明哪个函数有错误。
- 表格:employee
create table employee
(
id int,
name varchar(10)
);
- 功能 1:udf_1()
用于插入。
create or replace function udf_1()
returns void as
$body$
begin
insert into employee values(1,'Mak');
end;
$body$
language plpgsql;
- 功能 2:udf_2()
用于更新。
create or replace function udf_2()
returns void as
$body$
begin
update employee
set a_id = 99
where name = 'Mak';
end;
$body$
language plpgsql;
- 功能 3:udf_3()
用于调用以上所有功能。
create or replace function udf_3()
returns int as
$body$
begin
perform udf_1();
perform udf_2();
return 0;
exception
when others then
RAISE INFO 'Error Name:%',SQLERRM;
RAISE INFO 'Error State:%', SQLSTATE;
return -1;
end;
$body$
language plpgsql;
- 功能调用:
select * from udf_3();
例外:
INFO: Error Name:column "a_id" of relation "employee" does not exist
INFO: Error State:42703
问题:我能够获得异常但是无法从哪个函数中获取异常。
答案 0 :(得分:6)
根据文件
在异常处理程序中,还可以使用
GET STACKED DIAGNOSTICS
命令检索有关当前异常的信息
示例:
create or replace function udf_3()
returns int as
$body$
declare
err_context text;
begin
perform udf_1();
perform udf_2();
return 0;
exception
when others then
GET STACKED DIAGNOSTICS err_context = PG_EXCEPTION_CONTEXT;
RAISE INFO 'Error Name:%',SQLERRM;
RAISE INFO 'Error State:%', SQLSTATE;
RAISE INFO 'Error Context:%', err_context;
return -1;
end;
$body$
language plpgsql;
将显示以下内容:
INFO: Error Context:SQL: "SELECT udf_1()"
但这只是错误的文字表示。你的逻辑不应该依赖它。最好使用自定义错误代码来处理异常逻辑(并在函数中引发有意义的异常,以后可以捕获并处理)。
<强>更新强>
另一种解决方案是将您的代码分隔在不同的块中,您可以单独捕获异常。在这种情况下,您知道从哪个块引发了异常:
DO $$
BEGIN
-- Block 1
BEGIN
-- any code that might raise an exception
RAISE EXCEPTION 'Exception 1'; -- for example
EXCEPTION
WHEN others THEN
RAISE INFO 'Caught in Block 1';
END;
-- Block 2
BEGIN
-- any code that might raise an exception
RAISE EXCEPTION 'Exception 2'; -- for example
EXCEPTION
WHEN others THEN
RAISE INFO 'Caught in Block 2';
END;
END $$