加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 15:52:53 所属栏目:百科 来源:网络整理
导读:我在plpgsql函数中有一个sql UPDATE语句.我现在想为每个更新的行调用pg_notify函数,并且不确定我的解决方案是否是最好的可能性. 我不知道在UPDATE语句中我可以应用该函数的任何位置.我不认为在SET部分中是可能的,如果我将在WHERE部分中应用该函数,它将被应用
我在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

好的,我可能会想要使用触发器Eg

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');

我已经测试了这个,它运行正常

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读