2011-07-13 4 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; 

refcursorを返します。次の簡単な機能を持つ関数を呼び出すと、私は次のSQLは、この関数を呼び出してコマンドを使用することができます返されたカーソルを操作するが、カーソル名が自動的38.7.3.5. Returning Cursors .Can Iデによって記載されるように明示的関数の入力パラメータとしてカーソル名を宣言し、他にはPostgreSQL

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

によって生成されます私自身のカーソル名を壊して、このカーソル名を使って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) 

自動生成名がnは、(1)からの自然数である<unnamed portal n>、あるように見えます。

EDIT:たとえば

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

:あなたが生成されたカーソル名を取得するために、このようなクエリでpg_cursorsビューを使用することができ、別の方法として

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

関連する問題