Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 函数/触发器的返回类型?_Sql_Postgresql_Function_Triggers - Fatal编程技术网

Sql 函数/触发器的返回类型?

Sql 函数/触发器的返回类型?,sql,postgresql,function,triggers,Sql,Postgresql,Function,Triggers,因此,在最终了解了一些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; E

因此,在最终了解了一些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();
但当我尝试向表中插入值时,会出现以下错误:

错误:查询没有结果数据上下文的目标:PL/pgSQL 函数upd_totaal_告诉SQL语句第3行 **********错误**********

错误:查询没有结果数据的目标SQL状态:42601 上下文:PL/pgSQL函数upd_totaal_告诉SQL第3行 声明

UPDATE语句末尾返回的telling_getal相当于从。。。查询如果您自己运行它,您将得到一个结果集作为查询的输出

但是PostgreSQL函数——不管它是否是触发器函数——不能以这种方式生成结果集,只能生成一个返回值。简单的选择或返回不会自动成为函数的返回值。这就是“结果数据无目的地”的含义——您正试图输出一些数据,但输出无处可去

在这种特殊情况下,您的触发器似乎已经完成了工作,不需要输出任何内容。因为您已经将它定义为在目标更新之后运行,所以它不需要返回任何特定的内容,但您确实需要返回一些内容。要做到这一点,您需要添加;正如政府所说:

在。。。总是被忽视;它也可能是空的

因此,您需要在函数末尾添加的行,在update语句之后,而不是它的一部分,非常简单:

RETURN NULL;

谢谢你的回答。然而,当我删除返回部分并尝试添加一个值来触发触发器时,我得到了另一个错误:错误:控件到达触发器过程的末尾,但没有返回。另外,在手册中发现:触发器函数必须返回NULL或一个记录/行值,该值正好是触发触发器的表的结构。啊,很抱歉,我想你可以完全省略回执。返回NULL的正确方法很简单,就是返回NULL;-我会用参考资料更新答案。就在我读到你的回复时,我发现了,呵呵。我不得不做一次讨论;在设置告诉_getal=从personeel中选择我没有选择的SUMpers_salaris之后,然后返回NULL;