【问题标题】:Return a table when a trigger function is called调用触发函数时返回一个表
【发布时间】:2021-12-10 14:08:57
【问题描述】:

我需要在触发之前执行some_fun()。它将返回一个表格。

我运行了这个:

INSERT INTO SomeTable(some_bool) VALUES (true);

我预料到了:

 returnColHeader
------------------
12
23
23
(3 row)

但我得到了这个:

ERROR:  query has no destination for result data
HINT:  If you want to discard the results of a SELECT, use PERFORM instead.

我已阅读有关 TRIGGERS https://www.postgresql.org/docs/current/plpgsql-trigger.html 的文档 还有RETURNING CLAUSEhttps://www.postgresql.org/docs/9.5/dml-returning.html 和其他一些postgres 相关的读数,但我仍然无法解决我的问题。

DROP TRIGGER IF EXISTS run_some_fun on SomeTable CASCADE;

CREATE TRIGGER run_some_fun
BEFORE INSERT ON SomeTable
FOR EACH ROW WHEN (NEW.some_bool = TRUE)
EXECUTE FUNCTION run_some_fun();

CREATE OR REPLACE FUNCTION run_some_fun()
RETURNS TRIGGER AS $$
BEGIN
    SELECT some_fun(NEW.eid); -- This is wrong and throws error
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION some_fun(eID INT)
RETURNS TABLE (returnColHeader INT) AS $$
BEGIN
    RETURN QUERY
    SELECT eid FROM Joins j1;
END;
$$ LANGUAGE plpgsql;

【问题讨论】:

    标签: sql postgresql triggers plpgsql


    【解决方案1】:

    您不能从触发后返回任何内容。触发函数可以返回复合类型的值,但是触发后的返回值被忽略。你想要的没有任何机会。而且看起来有点吓人。

    【讨论】:

    • 但即使我使用 BEFORE TRIGGER,它也不会返回我想要的内容
    • @Peter - 当然 - 您使用的方法永远无法正常工作。但是如果使用 BEFORE 触发器,则可以修改表中的内容,并且可以使用 RETURNING 子句。
    • 感谢您的回复,但是如果我改为BEFORE触发器,我还需要更改什么?
    • @Peter - 从触发器之前的行开始,您可以返回新变量。接下来在INSERT 语句中使用RETURNING clause。请阅读文档。描述得很好 - postgresql.org/docs/current/plpgsql-trigger.html
    • 我想你误解了我的问题?我需要触发函数来返回一个表,但文档没有提到它是否可能。我知道触发函数的返回类型必须是TRIGGER,那有什么办法让我得到一张表吗?
    猜你喜欢
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 2020-03-11
    • 2021-12-13
    • 1970-01-01
    • 2020-07-10
    相关资源
    最近更新 更多