PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Tester les fonctions PostgreSQL qui consomment et renvoient le refcursor

Q1

Votre "petit test" peut être en 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;

Exécutez COMMIT / ROLLBACK après vous avez inspecté les résultats. La plupart des clients n'affichent que le résultat de la commande lat.

Plus d'informations dans le chapitre Renvoi des curseurs du manuel.

Q2

Et si nous ne connaissons pas le type de ligne renvoyé, comment pourrions-nous le faire ?

Étant donné que vous souhaitez uniquement inspecter les résultats, vous pouvez convertir l'intégralité de l'enregistrement en text .De cette façon, vous évitez complètement le problème avec les types de retour dynamiques pour la fonction.

Considérez cette démo :

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