Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 在引发异常后提交事务_Postgresql_Plpgsql - Fatal编程技术网

Postgresql 在引发异常后提交事务

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

我试图寻找解决办法,但没有找到。我知道一旦出现异常,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中的记录就会回滚。是否有其他解决方案可以将记录插入数据库表并引发应用程序错误?

方法很简单-您不能。一旦你进入了一个函数,这就是它

您必须在客户端层执行此操作,或者在另一个连接上循环以记录错误。传统上,你会在via中循环,但也可能使用——我不得不承认我不确定


编辑:不,它看起来像本地和远程之间的postgres_fdw。在这种情况下没有帮助。看起来dblink是一个明显的选择。

为什么不在插入之后和引发最后一个异常之前发出提交?@RicardoC-ASOAN不能-自定义函数在事务内部而不是外部运行。@RichardHuxton right。。。我刚刚了解到Postgres没有嵌套事务。嗯,也许是储蓄点?我想我们需要从ASOAN确定他是否想要回滚在调用函数之前所采取的操作,因为函数中的提交可能仍然是答案。。。我认为,@RicardoC-是的,savepoint是一个嵌套事务,这就是上面用来捕获异常的内容。不过,这并不是他在这里需要的——这是一个独立/分离的事务,因此即使回滚“main”事务,也可以提交write-to-log表。