如何在plpgsql中编辑和返回游标?

9gm1akwq  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(473)

我在一个函数中做一个简单的查询,需要更改值​​但仅供参考。我不需要这样更新表。我设法编辑了这些值​​但我不知道怎么归还。

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)

如你所见,这个查询没有给我带来任何东西。
感谢您的帮助,我为使用google翻译程序道歉:d

q3aa0525

q3aa05251#

如果您想从表函数得到一些结果,您应该填充相关的变量(定义在 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 (在本例中是自连接),并在一个循环上迭代,而不是嵌套两个循环。

相关问题