2015-09-19 100 views
0

因此,后终于得到关于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

回答

2

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; 
+0

谢谢您的回答。但是,当我删除返回的部分并尝试添加一个值来触发触发器时,我收到另一个错误: 错误:控制到达触发器过程的末尾而没有返回 – Nerotix

+0

此外,在手动中找到了这一点:触发器函数必须返回NULL或者是一个记录/行值,它具有触发器触发的表的结构。 – Nerotix

+1

啊,我的歉意,我想你可以完全省略return语句。返回NULL的正确方法很简单,就是'RETURN NULL;' - 我将用引用更新答案。 – IMSoP