postgreSQL中带游标的函数

postgreSQL中带游标的函数,postgresql,cursors,Postgresql,Cursors,我想在postgreSQL中创建一个函数,用游标读取查询结果并在表中返回结果。我不太熟悉游标,但我已经努力了,但没有结果。输出是一个空白表。这是我的密码: CREATE OR REPLACE FUNCTION getquery() RETURNS TABLE(ID INT, Totalprice DECIMAL) AS $$ DECLARE query_cursor CURSOR FOR SELECT CustomerID, TotalDue from SalesOrderHeader w

我想在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;

要做到这一点,您根本不需要
光标,甚至不需要函数。但是如果你真的想要一个
光标
,那么你必须
从中获取
行并返回结果。由于不能将
光标
返回表
组合,因此必须将结果作为某个类型的
返回。一般来说,情况如下:

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;
但是,您的查询将只返回一行,因此这里不需要
循环。您的查询将更加高效,如下所示:

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

我试过了,现在输出的只是2列和行数,没有数据。CURSOR可能是“我想慢下来”的同义词。甚至还有一种尝试一次处理一行的反模式:RBAR-row-By-Agonizing row。光标有意义的场景非常罕见。