sql - PL/pgSQL 函数在 pgAdmin 之外无法正确运行

标签 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。我忘记在我的外部程序中将更新提交回数据库,所以该表永远不会更新。添加了一个提交并很好。

最佳答案

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

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

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

您可以按原样运行此查询,没有 函数包装器。如果您想要一个函数包装器,请在前面加上 RETURN QUERY 以直接返回结果。代码示例:

关于sql - PL/pgSQL 函数在 pgAdmin 之外无法正确运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54032925/

相关文章:

sql - 如何在 t-sql 上的 union 子句上获得更好的性能

php - 通过 MySQL 获取最少随机记录集

postgresql - 如果字段为 True,Postgres 检查相关表是否有条目

java - 尝试使用 Java 更新 SQL 表

sql - tSQL - 从 varchar 到数字的转换适用于除整数之外的所有字符

php - 如何显示group by中的所有列

sql - 如何找到拥有最活跃卖家(每个用户每天软件销售量最高)的团队?

postgresql - Postgres查询错误

mysql - 当列具有相同值时删除行,并将这些行与 MySQL 中的相同主键相关联

android - 使用来自服务器的数据加载本地表