PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Testen von PostgreSQL-Funktionen, die Refcursor verwenden und zurückgeben

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