Postgresql 在引发异常后提交事务
我试图寻找解决办法,但没有找到。我知道一旦出现异常,postgres将回滚所有事务。但我的要求是将某个异常记录到数据库表中 以下是示例代码:Postgresql 在引发异常后提交事务,postgresql,plpgsql,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
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中的记录就会回滚。是否有其他解决方案可以将记录插入数据库表并引发应用程序错误?方法很简单-您不能。一旦你进入了一个函数,这就是它 您必须在客户端层执行此操作,或者在另一个连接上循环以记录错误。传统上,你会在via中循环,但也可能使用——我不得不承认我不确定
编辑:不,它看起来像本地和远程之间的postgres_fdw。在这种情况下没有帮助。看起来dblink是一个明显的选择。为什么不在插入之后和引发最后一个异常之前发出提交?@RicardoC-ASOAN不能-自定义函数在事务内部而不是外部运行。@RichardHuxton right。。。我刚刚了解到Postgres没有嵌套事务。嗯,也许是储蓄点?我想我们需要从ASOAN确定他是否想要回滚在调用函数之前所采取的操作,因为函数中的提交可能仍然是答案。。。我认为,@RicardoC-是的,savepoint是一个嵌套事务,这就是上面用来捕获异常的内容。不过,这并不是他在这里需要的——这是一个独立/分离的事务,因此即使回滚“main”事务,也可以提交write-to-log表。