PL/pgSQL 函数不会 运行 在 pgAdmin 之外正确

PL/pgSQL function won't run correctly outside pgAdmin

我使用 pgAdmin 在 PostgreSQL 10.4 中创建了一个 PL/pgSQL 函数。它 returns 查询并更新同一个 table 中的条目。在 pgAdmin 中调用,它 运行s 符合预期。当来自外部代码的 运行 时,返回 table,但从不更新 运行。想知道这是否与我编写函数的方式有关?

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 函数有问题,所以忽略了我的外部程序 运行 函数。我的用户错误。将更新移至 SELECT 上方后,我注意到我的程序正在查看更新。我忘记在我的外部程序中将更新提交回数据库,所以 table 永远不会更新。添加了一个提交和好。

看起来你可以用这个简单的 更便宜 UPDATE 查询和 RETURNING 子句替换整个函数:

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

如果存在竞争条件,请考虑:

您可以 运行 按原样进行此查询, 无需 函数包装器。如果你想要一个函数包装器,直接将 RETURN QUERY 添加到 return 结果。代码示例:

  • PostgreSQL: ERROR: 42601: a column definition list is required for functions returning "record"