引发异常后提交事务

时间:2016-02-17 19:43:22

标签: postgresql plpgsql

我试着寻找解决方案但未能找到解决方案。我知道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中的记录就会被回滚。是否有替代解决方案,我可以将记录插入数据库表以及引发应用程序错误?

1 个答案:

答案 0 :(得分:2)

以简单的方式 - 你不能。一旦你进入一个功能,那就是它。

您必须在客户端层执行此操作,或者在另一个连接上循环以记录错误。传统上你会通过dblink循环回来,但也可以使用Foreign Data Wrappers - 我不得不承认我不确定。

编辑:不,在本地和远程之间看起来像postgres_fdw syncs the transactions。在这种情况下没有帮助。看起来像dblink是显而易见的选择。