【发布时间】:2019-01-04 03:55:09
【问题描述】:
我使用 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。我忘记在我的外部程序中将更新提交回数据库,所以表永远不会更新。添加了一个 commit 和 good to。
【问题讨论】:
-
没有“pgSQL”。你是说plpgsql吗?请(总是!)提供您的 Postgres 版本。
SELECT version();有帮助。还有一个完整的函数定义,即使它不起作用。 -
这是你现在的实际功能吗?
status=NULL始终为 NULL,并且永远不会返回任何行。你想要status IS NULL。你有并发写权限吗? -
你是对的。我无法直接复制/粘贴我的代码,所以我不得不重新输入并打错字。我对并发写访问不是 100%,但我相信如此。必须仔细检查。
标签: sql postgresql sql-update plpgsql