2016-06-11 42 views
0

我想在postgreSQL中創建一個函數,它使用遊標讀取查詢的結果並將結果返回到表中。我對遊標不是很熟悉,但是我沒有結果就努力了。輸出是一張空白表格。這裏是我的代碼:帶光標的函數在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; 
+0

CURSOR可能是「我想要慢」的同義詞。甚至有一個嘗試與一行同時工作的反模式:RBAR - Row By Agonizing Row。遊標有意義的場景極爲罕見。 –

回答

0

你並不需要一個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; 
+0

我試過了,現在輸出只有2列和行數,沒有數據。 – georgia

+0

它現在有效,非常感謝! – georgia