函数/触发器的返回类型?
因此,后终于得到关于PostgreSQL的触发器和功能有点了解,我似乎无法找出什么是错在这里:函数/触发器的返回类型?
我创建一个触发器功能:
CREATE OR REPLACE FUNCTION upd_totaal_telling()
RETURNS trigger AS
$BODY$
BEGIN
UPDATE totaal_telling
SET telling_getal = (SELECT SUM(pers_salaris) FROM personeel)
RETURNING telling_getal;
END;
$BODY$
LANGUAGE PLPGSQL;
然后我创建触发器吧:
CREATE TRIGGER trig_totaal_telling
AFTER INSERT OR UPDATE ON personeel
FOR EACH ROW
EXECUTE PROCEDURE upd_totaal_telling();
但是,当我尝试插入一个值表,我得到这个错误:
ERROR: query has no destination for result data CONTEXT: PL/pgSQL function upd_totaal_telling() line 3 at SQL statement ********** Error **********
ERROR: query has no destination for result data SQL state: 42601 Context: PL/pgSQL function upd_totaal_telling() line 3 at SQL statement
UPDATE
声明末尾的RETURNING telling_getal
等同于具有SELECT telling_getal FROM ...
查询。如果你自己运行它,你会得到一个结果集作为查询的输出。
但是PostgreSQL函数 - 不管它是否是触发函数 - 都不能以这种方式产生结果集,只能返回一个值。一个空的SELECT
(或RETURNING
)不会自动成为函数的返回值。这就是“没有结果数据的目的地”的意思 - 你试图“输出”一些数据,但没有什么“输出”去。
在这种特殊情况下,您的触发器似乎已完成其工作,并且不需要输出任何内容。既然你已经定义它在目标更新之后运行,它不需要返回任何特定的东西,但你需要返回一些东西。要做到这一点,你需要添加a RETURN
statement;作为page on trigger functions说:
The return value of a row-level trigger fired AFTER ... is always ignored; it might as well be null.
所以,你需要在你的函数的末尾添加,更新语句不是它的一部分后的线,是很简单:
RETURN NULL;
谢谢您的回答。但是,当我删除返回的部分并尝试添加一个值来触发触发器时,我收到另一个错误: 错误:控制到达触发器过程的末尾而没有返回 – Nerotix
此外,在手动中找到了这一点:触发器函数必须返回NULL或者是一个记录/行值,它具有触发器触发的表的结构。 – Nerotix
啊,我的歉意,我想你可以完全省略return语句。返回NULL的正确方法很简单,就是'RETURN NULL;' - 我将用引用更新答案。 – IMSoP