PL / pgSQL函数无法在pgAdmin

时间:2019-01-04 03:55:10

标签: sql postgresql sql-update plpgsql

我使用pgAdmin在PostgreSQL 10.4中创建了PL / pgSQL函数。它返回一个查询并更新同一表中的条目。在pgAdmin中调用,它按预期运行。从外部代码运行时,将返回该表,但更新将永远不会运行。想知道这是否与我编写函数的方式有关吗?

CREATE OR REPLACE FUNCTION report()
RETURNS TABLE(id text, t1 text, t2 text)
LANGUAGE 'plpsql'

AS $BODY$
DECLARE
rec RECORD;

BEGIN
RETURN QUERY
SELECT id,
name AS t1,
data AS t2
FROM table1
WHERE status IS NULL;

IF FOUND THEN
FOR rec IN SELECT id
FROM table1
WHERE status IS NULL
LOOP
UPDATE table1 SET val=val+1
WHERE id=rec.id;
END IF;

RETURN;
END
$BODY$;

编辑:

感谢您的答复。没有其他人可以帮忙看看,因此这对于故障排除非常有帮助。

由于我的PL / pgSQL函数有问题,因此忽略了运行该函数的外部程序。用户方面的错误。将UPDATE移到SELECT上方之后,我注意到程序看到了UPDATE。我忘记了将更新提交回我的外部程序中的数据库,因此该表从未更新过。添加了提交内容和有益之处。

1 个答案:

答案 0 :(得分:0)

似乎您可以用这个简单,便宜得多的UPDATE查询和一个RETURNING子句替换整个函数:

UPDATE table1
SET    val = val + 1
WHERE  status IS NULL
RETURNING id, name AS t1, data AS t2;

如果可能存在比赛条件,请考虑:

您可以直接使用 函数包装器运行此查询。如果要使用函数包装,请在RETURN QUERY前面直接返回结果。代码示例: