我有一个存储过程,该存储过程又调用了其他几个存储过程。它们每个都返回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/