gpt4 book ai didi

postgresql - 取消用户定义函数中的先前操作

转载 作者:行者123 更新时间:2023-11-29 12:05:53 25 4
gpt4 key购买 nike

是否可以在用户定义的函数中取消之前的操作?

例如:

CREATE OR REPLACE FUNCTION transact_test () RETURNS BOOLEAN
AS $$
BEGIN

UPDATE table1 SET ...

UPDATE table2 SET ...

IF some_condition THEN
--Here is possible to cancel all above operations?
RETURN FALSE;
END IF;

RETURN TRUE;
END;
$$
LANGUAGE plpgsql;

最佳答案

到目前为止,这两个答案都不正确。
如果您尝试在 plpgsql 函数中启动事务或使用 SAVEPOINT,您会收到如下错误消息:

ERROR:  cannot begin/end transactions in PL/pgSQL
HINT: Use a BEGIN block with an EXCEPTION clause instead.
CONTEXT: PL/pgSQL function "f_savepoint" line 6 at SQL statement

如果您在普通 SQL 函数中尝试 SAVEPOINT:

ERROR:  SAVEPOINT is not allowed in a SQL function
CONTEXT: SQL function "f_savepoint2" during startup

按照错误消息的指示,使用 BEGIN block而不是在 plpgsql 函数中。您的演示可能如下所示:

CREATE OR REPLACE FUNCTION transact_test(boolean)
RETURNS boolean AS
$func$
BEGIN -- start a nested BEGIN block
UPDATE t SET i = i+1 WHERE i = 1;
UPDATE t SET i = i+1 WHERE i = 3;
IF $1 THEN
RAISE EXCEPTION 'foo'; -- cancels all of the above
END IF;

RETURN TRUE;

EXCEPTION WHEN OTHERS THEN
RETURN FALSE;
-- do nothing
END
$func$ LANGUAGE plpgsql;

-> SQLfiddle展示这一切。

关于postgresql - 取消用户定义函数中的先前操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16691246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com