首页 > 解决方案 > PostGreSQL - 控制事务

问题描述

我有一个存储过程,它依次调用其他几个存储过程;它们中的每一个都返回 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 之后写入的内存表?还是有更好的方法来实现这一目标?

非常感谢。

标签: postgresqlerror-handlingtransactions

解决方案


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

-- (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 的影响......我是做错了什么?据我了解,现在应该可以了……感谢您的支持。


推荐阅读