Q1
「小さなテスト」は単純なSQLにすることができます:
BEGIN;
SELECT get_function_that_returns_cursor('ret', 4100, 'foo', 123); -- note: 'ret'
FETCH ALL IN ret; -- works for any rowtype
COMMIT; -- or ROLLBACK;
COMMIT
を実行します / ROLLBACK
後 結果を調べました。ほとんどのクライアントは、latコマンドの結果のみを表示します。
カーソルを返すの章の詳細 マニュアルの。
Q2
そして、返される行タイプがわからない場合、どうすればよいでしょうか?
結果のみを検査したいので、レコード全体をtext
にキャストできます。 。このようにして、関数の動的リターンタイプの問題を完全に回避します。
このデモを検討してください:
CREATE TABLE a (a_id int PRIMARY KEY, a text);
INSERT INTO a VALUES (1, 'foo'), (2, 'bar');
CREATE OR REPLACE FUNCTION reffunc(INOUT ret refcursor) AS -- INOUT param :)
$func$
BEGIN
OPEN ret FOR SELECT * FROM a;
END
$func$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION ctest()
RETURNS SETOF text AS
$func$
DECLARE
curs1 refcursor;
rec record;
BEGIN
curs1 := reffunc('ret'); -- simple assignment
LOOP
FETCH curs1 INTO rec;
EXIT WHEN NOT FOUND; -- note the placement!
RETURN NEXT rec::text;
END LOOP;
END
$func$ LANGUAGE plpgsql;
-> SQLfiddle