sql - 如何在 plpgsql 中编辑和返回游标?
问题描述
我在一个函数里面做一个简单的查询,我需要改变这个查询的值,但只是为了信息。我不需要像这样更新表格。我设法编辑了值,但我不知道如何返回它们。
CREATE OR REPLACE FUNCTION setDetails(INTEGER,INTEGER) RETURNS TABLE (
id INTEGER,
name TEXT,
subsidy TEXT,
stratum_id NUMERIC,
price TEXT,
total FLOAT
) AS $$
DECLARE
service Record;
subscibed_services Record;
BEGIN
for service in SELECT services.*, false as subscribed, (CAST(services.price AS float) - CAST(services.subsidy AS float)) AS total FROM services WHERE services.stratum_id = $1 loop
for subscibed_services in SELECT services.id FROM services WHERE id IN (SELECT DISTINCT charge_details.service_id FROM charge_details WHERE charge_details.charge_id = $2) loop
if (CAST(subscibed_services.id as INTEGER) = CAST(service.id as INTEGER)) then
service.subscribed := true;
EXIT;
else
service.total := 0;
end if;
end loop;
end loop;
END;
$$ LANGUAGE plpgsql;
而下面这个函数会被执行
SELECT setDetails(2,6320)
感谢您的帮助,我为使用谷歌翻译道歉:D
解决方案
如果你想从表函数中得到一些结果,你应该填写相关变量(在table
子句列表中定义),然后你应该使用RETURN NEXT
语句。文档对此进行了很好的描述。
简单的例子:
CREATE OR REPLACE FUNCTION foo(n int)
RETURNS TABLE(a int, b int)
AS $$
BEGIN
FOR i IN 1 .. n
LOOP
a := i; b := i + 1;
RETURN NEXT;
END LOOP;
END;
$$ LANGUAGE plpgsql;
SELECT * FROM foo(10);
您的代码有另一个性能错误。查询上的两个嵌套循环可能很慢。您可以使用JOIN
(在这种情况下为自连接),并迭代一个循环而不是嵌套两个循环。
推荐阅读
- apache-spark - 在写入 S3 时,为什么我得到 FileNotFoundException
- sql - 在休眠中定义唯一键以及如何定义?
- azure - 在 Microsoft 合作伙伴中心和 Azure AD 门户中删除域/租户或关闭帐户
- javascript - Project Euler #39:有没有更有效的方法来解决这个问题?
- python - 如果该值在范围内,则查找值
- javascript - 如何使所选项目在反应js的侧栏中处于活动状态?
- python - Spyder 更新后打不开
- python - 在Python中没有ORM的http服务器(Flask)中处理sql连接的最佳方法是什么?
- c# - 如何将一个 HttpClient 注入多个服务
- ruby-on-rails - 可以使用关联来过滤 rails where 子句中的数据吗?