2011-07-13 44 views
9

我使用PostgreSQL 8.3版本,並具有以下簡單的函數會返回一個refcursor到客戶端現在調用返回一個指針

CREATE OR REPLACE FUNCTION function_1() RETURNS refcursor AS $$ 
DECLARE 
     ref_cursor REFCURSOR; 
BEGIN 
     OPEN ref_cursor FOR SELECT * FROM some_table; 
     RETURN (ref_cursor);  
END; 
$$ LANGUAGE plpgsql; 

一個功能,我可以使用下面的SQL命令來調用這個函數和操縱返回的光標,但光標名稱將被PostgreSQL

BEGIN; 
SELECT function_1(); --It will output the generated cursor name , for example , "<unnamed portal 11>" ; 
FETCH 4 from "<unnamed portal 11>"; 
COMMIT; 

自動生成此外,顯式地聲明由38.7.3.5. Returning Cursors。可我去描述的光標名稱作爲函數的輸入參數clare我自己的遊標名稱並使用此遊標名稱來操縱返回的遊標而不是Postgresql會自動爲我生成?如果沒有,是否有任何命令可以獲取生成的遊標名稱?

+0

+1,有趣的問題 –

回答

3

是,使用:

CREATE OR REPLACE FUNCTION function_1(refcursor) RETURNS refcursor AS $$ 
BEGIN 
     OPEN $1 FOR SELECT * FROM some_table; 
     RETURN $1;  
END; 
$$ LANGUAGE plpgsql; 

結果:

SELECT function_1('myowncursorname'); 
    function_1 
----------------- 
myowncursorname 
(1 row) 

它看起來像自動生成的名稱爲<unnamed portal n>,其中n是自然數(1)。

編輯:

的另一種方式,你可以使用pg_cursors鑑於這樣的查詢來獲取生成光標名稱:

SELECT name FROM pg_cursors WHERE statement LIKE 'SELECT * FROM some_table'; 

例如:

BEGIN; 
SELECT function_1(); 
SELECT name FROM pg_cursors WHERE statement LIKE 'SELECT * FROM some_table'; 
COMMIT; 

結果:

 function_1 
-------------------- 
<unnamed portal 3> 
(1 row) 

     name 
-------------------- 
<unnamed portal 3> 
(1 row) 
+0

謝謝。但問題是'function_1'由其他方提供,我無法更改此函數的輸入參數。 –

+0

我認爲這是提供自定義遊標名稱的唯一方法,但是我不能100%確定。 –

+0

@Ken:如何從'pg_cursors'系統目錄中獲取遊標的名字(如上)? –

12

我不是Postgre的至極版本相當肯定這是可以(在8.4它是有效的),但我發現最簡單的比較,當你把它聲明,像這樣來定義遊標名稱:

CREATE OR REPLACE FUNCTION function_1() RETURNS refcursor AS $$ 
DECLARE 
     ref_cursor REFCURSOR := 'mycursor'; 
BEGIN 
     OPEN ref_cursor FOR SELECT * FROM some_table; 
     RETURN (ref_cursor);  
END; 
$$ LANGUAGE plpgsql; 

而且那麼你可以這樣得到它:

BEGIN; 
SELECT function_1(); 
FETCH 4 from mycursor; 
COMMIT; 

我覺得這個方法不麻煩。 希望有所幫助。

+2

感謝您的解決方案。它也在8.3.12中提供 – Nenad