Q1
Ihr "kleiner Test" kann einfaches SQL sein:
BEGIN;
SELECT get_function_that_returns_cursor('ret', 4100, 'foo', 123); -- note: 'ret'
FETCH ALL IN ret; -- works for any rowtype
COMMIT; -- or ROLLBACK;
Führen Sie COMMIT
aus / ROLLBACK
nach Sie haben die Ergebnisse überprüft. Die meisten Clients zeigen nur das Ergebnis des lat-Befehls an.
Mehr dazu im Kapitel Cursor zurückgeben des Handbuchs.
Q2
Und wenn wir den zurückgegebenen Zeilentyp nicht kennen, wie können wir das tun?
Da Sie nur die Ergebnisse überprüfen möchten, könnten Sie den gesamten Datensatz in text
umwandeln .Auf diese Weise vermeiden Sie das Problem mit dynamischen Rückgabetypen für die Funktion vollständig.
Sehen Sie sich diese Demo an:
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