sql - PL/pgSQL 函数在 pgAdmin 之外无法正确运行
问题描述
我使用 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
直接返回结果。代码示例:
推荐阅读
- javascript - 使用带有 javascript 的正则表达式来货币字符串转换
- reactjs - 在 React 测试库中测试依赖于 Stateful Context Providers 链的 React 组件
- reactjs - 通过 Context API 传递异步获取的数据
- c# - 在控制器中将数据作为应用程序/json发送时如何使用多个参数
- javascript - 使用“this”在翻转时更改 SVG 的填充颜色
- javascript - 特定键/ID上的互斥锁
- php - 为什么我从 /public/js/ 目录中的 JS 脚本向命名路由发送 JQuery $.ajax() 请求时收到“404 Not Found”?
- kubernetes - 为 helm 安装的 prometheus-operator 设置 service-discovery 的命名空间
- amazon-web-services - start_query_execution 针对不正确的数据库
- java - 服务器返回 HTTP 响应代码:400 用于 URL:https://idcs-82972921e42641b1bf08128c3d93a19c.identity.c9dev2.oc9qadev.com/oauth2/v1/token