【问题标题】:Function with cursor in postgreSQLpostgreSQL 中带光标的函数
【发布时间】:2016-06-11 23:14:08
【问题描述】:

我想在 postgreSQL 中创建一个函数,它使用游标读取查询结果并将结果返回到表中。我对游标不是很熟悉,但我努力了但没有结果。输出是一个空白表。这是我的代码:

CREATE OR REPLACE FUNCTION getquery()
RETURNS TABLE(ID INT, Totalprice DECIMAL) AS $$

DECLARE 
query_cursor CURSOR FOR SELECT CustomerID, TotalDue  from SalesOrderHeader where TotalDue =( select max(TotalDue) from SalesOrderHeader);

 BEGIN
 OPEN query_cursor;

CLOSE query_cursor;

RETURN;
END;$$

LANGUAGE plpgsql;

【问题讨论】:

  • CURSOR 可能是“我想慢慢来”的同义词。甚至还有一种尝试一次处理一行的反模式:RBAR - Row By Agonizing Row。光标有意义的场景极为罕见。

标签: postgresql cursors


【解决方案1】:

您根本不需要CURSOR 来执行此操作,甚至不需要函数。但是,如果您真的想要 CURSOR,那么您必须从中获取 FETCH 行并返回结果。您必须将结果作为SETOF sometype 返回,因为您不能将CURSORRETURNS TABLE 结合使用。 一般来说是这样的:

CREATE TYPE soh AS (ID integer, Totalprice decimal);

CREATE FUNCTION getquery() RETURNS SETOF soh AS $$
DECLARE 
  query_cursor CURSOR FOR SELECT CustomerID, TotalDue FROM SalesOrderHeader
                          WHERE TotalDue = (select max(TotalDue) from SalesOrderHeader);
  rec soh;
BEGIN
  OPEN query_cursor;
  FETCH query_cursor INTO rec.ID, rec.Totalprice;    -- Read a row from the cursor
  WHILE FOUND LOOP
    RETURN NEXT rec;                                 -- Return the data to the caller
    FETCH query_cursor INTO rec.ID, rec.Totalprice;  -- Keep on reading rows
  END LOOP;
  CLOSE query_cursor;
  RETURN;
END;
$$ LANGUAGE plpgsql;

然而,您的查询将只返回一行,因此这里不需要LOOP。而且您的查询会更有效,如下所示:

SELECT CustomerID, TotalDue FROM SalesOrderHeader
ORDER BY TotalDue DESC LIMIT 1;

【讨论】:

  • 我试过了,现在输出只有2列和行数,没有数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-23
  • 2021-09-09
  • 2013-07-22
  • 1970-01-01
  • 2016-05-09
  • 2023-03-06
  • 1970-01-01
相关资源
最近更新 更多