我试着寻找解决方案但未能找到解决方案。我知道postgres会在引发异常后回滚所有事务。但我的要求是将某个异常记录到数据库表中。
以下是示例代码:
CREATE OR REPLACE FUNCTION fn_test(
in_var numeric DEFAULT NULL::numeric)
RETURNS numeric AS
$BODY$
DECLARE
BEGIN
IF in_var=0
THEN
RAISE EXCEPTION using errcode='INELG';
ELSE IF in_var=1
THEN
RAISE EXCEPTION using errcode='INVAL';
ELSE
RETURN in_var;
END IF;
begin
EXCEPTION
WHEN sqlstate 'INELG'
THEN
INSERT INTO LOG_TBL(in_par,error_reason)
VALUES(in_var,'VALUE INELGIBLE');
RAISE EXCEPTION 'Unable to Process: Parameter Not Eligible';
WHEN sqlstate 'INVAL'
THEN
INSERT INTO LOG_TBL(in_par,error_reason)
VALUES(in_var,'VALUE INValid');
RAISE EXCEPTION 'Unable to Process: Parameter Invalid';
end;
END;
$BODY$
LANGUAGE plpgsql VOLATILE SECURITY DEFINER
COST 100;
我遇到的问题是,一旦引发异常,异常部分中LOG_TBL中的记录就会被回滚。是否有替代解决方案,我可以将记录插入数据库表以及引发应用程序错误?
答案 0 :(得分:2)
以简单的方式 - 你不能。一旦你进入一个功能,那就是它。
您必须在客户端层执行此操作,或者在另一个连接上循环以记录错误。传统上你会通过dblink循环回来,但也可以使用Foreign Data Wrappers - 我不得不承认我不确定。
编辑:不,在本地和远程之间看起来像postgres_fdw syncs the transactions。在这种情况下没有帮助。看起来像dblink是显而易见的选择。