13

私は Postgresql 8.3 を使用しておりrefcursor 、クライアントに a を返す次の単純な関数があります。

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で説明されているように、関数の入力パラメーターとしてカーソル名を明示的に宣言する以外に 。Cursorsを返します。Postgresql が自動的に生成する代わりに、独自のカーソル名を宣言し、このカーソル名を使用して返されたカーソルを操作できますか?

そうでない場合、生成されたカーソル名を取得できるコマンドはありますか?

4

2 に答える 2

17

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;

この方法はそれほど面倒ではないと思います。お役に立てば幸いです。

于 2012-09-18T18:54:57.547 に答える
6

はい、次を使用します。

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)
于 2011-07-13T08:15:28.123 に答える