postgresql - 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 之后写入的内存表?还是有更好的方法来实现这一目标?
非常感谢。
解决方案
好的,这就是它现在的样子。
-- (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 - Aurora postgres 10.7 的这个插入查询有什么问题?
- ios - 没有 performSegue 的委托不会被调用 Swift 5
- flutter - Flutter:如何在文本字段文本中间插入文本
- django - Django:AttributeError:'str'对象没有属性'objects'
- r - 为列表的因子分配一个随机值 - 0 或 1
- jenkins - 如何在 Jenkins 中为 C# 运行 Selenium 测试
- ios - 如何正确子类 React 本机 webview 以禁用选择时的上下文菜单?
- javascript - 如何使用 vanilla JavaScript 重新启动 CSS 动画?
- asp.net - 引导轮播在 ASP.NET Core 中不起作用
- perl - 读取文件时 Perl 脚本返回 0