我使用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。我忘记了将更新提交回我的外部程序中的数据库,因此该表从未更新过。添加了提交内容和有益之处。
答案 0 :(得分:0)
似乎您可以用这个简单,便宜得多的UPDATE
查询和一个RETURNING
子句替换整个函数:
UPDATE table1
SET val = val + 1
WHERE status IS NULL
RETURNING id, name AS t1, data AS t2;
如果可能存在比赛条件,请考虑:
您可以直接使用 函数包装器运行此查询。如果要使用函数包装,请在RETURN QUERY
前面直接返回结果。代码示例: