gpt4 book ai didi

postgresql - 为postgresql中的每个更新行调用一个函数

转载 作者:行者123 更新时间:2023-11-29 11:36:55 24 4
gpt4 key购买 nike

我在 plpgsql 函数中有一个 sql UPDATE 语句。我现在想为每个更新的行调用 pg_notify 函数,并且不确定我的解决方案是否是最佳方案。

我不知道 UPDATE 语句本身有任何位置可以应用该函数。我不认为这在 SET 部分是可能的,如果我将在 WHERE 部分应用该功能,它将在检查时应用于每一行并且不仅是更新的行,对吗?

因此我认为我可以将 RETURNING 部分用于我的目的并设计如下函数:

CREATE OR REPLACE FUNCTION function_name() RETURNS VOID AS $BODY$
BEGIN
UPDATE table1
SET a = TRUE
FROM table2
WHERE table1.b = table2.c
AND <more conditions>
RETURNING pg_notify('notification_name', table1.pk);
END;
$BODY$ LANGUAGE 'plpgsql' VOLATILE;

不幸的是,这给了我一个错误,说我没有在任何地方使用或存储查询的返回值。因此,我尝试将 PERFORM 放在查询的前面,但这在语法上似乎是不正确的。

在用 PERFORM 尝试不同的组合后,我的最终解决方案是:

CREATE OR REPLACE FUNCTION function_name() RETURNS VOID AS $BODY$
DECLARE
dev_null INTEGER;
BEGIN
WITH updated AS (
UPDATE table1
SET a = TRUE
FROM table2
WHERE table1.b = table2.c
AND <more conditions>
RETURNING pg_notify('notification_name', table1.pk)
)
SELECT 1 INTO dev_null;

END;
$BODY$ LANGUAGE 'plpgsql' VOLATILE;

这按预期工作,但我觉得应该有一个更好的解决方案,它不会临时存储无用的结果,也不会使用无用的变量。

感谢您的帮助。

** 编辑 1 **

从@pnorton 的回答中可以看出,在大多数情况下,触发器就可以解决问题。然而,对我来说,它不适用,因为通知的接收者有时也会更新表格,我不想在这种情况下生成通知

最佳答案

"I have a sql UPDATE statement in a plpgsql function. I now want to call the pg_notify function for each updated row "

好吧,我可能会想使用触发器,例如

    CREATE TABLE foobar (id serial primary key, name varchar);

CREATE OR REPLACE FUNCTION notify_trigger() RETURNS trigger AS $$
DECLARE
BEGIN
PERFORM pg_notify('watch_tb_update', TG_TABLE_NAME || ',id,' || NEW.id );
RETURN new;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER foobar_trigger AFTER INSERT ON foobar
FOR EACH ROW EXECUTE PROCEDURE notify_trigger();

LISTEN watch_tb_update;

INSERT into foobar(id, name) values(1,'test_name');

我已经测试过了,它工作正常

关于postgresql - 为postgresql中的每个更新行调用一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31782433/

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