首页 > 解决方案 > 如何在 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

标签: sqlpostgresqlplpgsqlrecord

解决方案


如果你想从表函数中得到一些结果,你应该填写相关变量(在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(在这种情况下为自连接),并迭代一个循环而不是嵌套两个循环。


推荐阅读