postgresql - PostGreSQL-控制交易

标签 postgresql error-handling transactions

我有一个存储过程,该存储过程又调用了其他几个存储过程。它们每个都返回true或false,并通过将错误存储到表中在内部进行处理。
像这样:

-- (MAIN STORED PROCEDURE)
BEGIN
 CALL STORED_PROC_1('WW','TT','FF',result);
 IF result = TRUE then
    CALL STORED_PROC_2('a','b','c',result);
    ...
 END IF;
END;

IF result != TRUE THEN
 ROLLBACK;
ELSE
 COMMIT;
END IF;

-- (END MAIN STORED PROCEDURE)

-------
--Example of Stored Procedure 1
CREATE OR REPLACE PROCEDURE STORED_PROC_1 (IN a TEXT, IN b TEXT, IN c TEXT, INOUT result boolean)
AS $BODY$
BEGIN

 -- DO SOME STUFF HERE

 IF ERROR_FOUND THEN
   INSERT INTO ERROR_LOG VALUES ('Error','Type of Error',CURRENT_DATE);
   --COMMIT; (I cannot do this commit here but I would like to save the information going into the ERROR_LOG table)
   result := FALSE;
 ELSE
   result := TRUE;
 END IF;
END;
$BODY$;

这实际上是我想要的;仅在全部返回TRUE时才提交;
问题是,在STORED_PROC_1或_2内,有一些错误处理会写入错误日志表,并且...如果有错误,它们将在结果中返回FALSE,进而将调用回滚,而我将丢失错误日志。
有没有一种方法可以创建一种可以向我加载错误信息并在ROLLBACK之后将其写入的内存表?还是有更好的方法来实现这一目标?
非常感谢。

最佳答案

好的,这就是现在的样子。

-- (MAIN STORED PROCEDURE)
BEGIN
 CALL STORED_PROC_1('WW','TT','FF',result);
 IF result = TRUE then
    CALL STORED_PROC_2('a','b','c',result);
    ...
 END IF;
END;

IF result != TRUE THEN
 ROLLBACK;
ELSE
 COMMIT;
END IF;

-- (END MAIN STORED PROCEDURE)

-------
--Example of Stored Procedure 1
CREATE OR REPLACE PROCEDURE STORED_PROC_1 (IN a TEXT, IN b TEXT, IN c TEXT, INOUT result boolean)
AS $BODY$
BEGIN

 -- DO SOME STUFF HERE

 IF ERROR_FOUND THEN
   PERFORM * FROM "Schema".func_errlog('Error','Type of Error',CURRENT_DATE);
        IF FOUND
        THEN
          result := FALSE;
        END IF; 
 ELSE
   result := TRUE;
 END IF;
END;
$BODY$;
该功能是您基本上在此处提供的功能的副本。
因此,我仍然有相同的错误。在Main过程中,如果我调用ROLLBACK(由于错误,我想回滚所有内容,但是我想保存该错误,并且函数会保存它,但是稍后会受到ROLLBACK的影响...
难道我做错了什么?据我了解,这应该现在就可以工作了...
谢谢你的支持。

关于postgresql - PostGreSQL-控制交易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63673634/

相关文章:

haskell - 在 Haskell 中使用哪个 monad 来聚合执行一系列语句时可能发生的异常?

java - Hibernate 中的 beginTransaction 是否分配新的数据库连接?

sql - 如何在 PostgreSQL 事务中使用变量

sql-server - 我可以创建用于测试的环境事务吗?

php - 如何修复此错误 XML 解析错误 : not well-formed

c# - 简单的Excel创建不会打开文件已损坏

mysql - 数据类型和查询速度

sql - 如何在同一查询中选择不符合两个条件的元组?

sql - 将 bigint 转换为 date 以便我可以在 where 子句中使用

python - 适用于容器的 Azure Web 应用程序无法连接到适用于 Postgres 的 Azure DB