sql >> Databasteknik >  >> RDS >> PostgreSQL

Testar PostgreSQL-funktioner som konsumerar och returnerar refkursor

Q1

Ditt "lilla test" kan vara vanlig 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;

Kör COMMIT / ROLLBACK efter du inspekterade resultaten. De flesta klienter visar bara resultatet av lat-kommandot.

Mer i kapitlet Återvändande markörer i manualen.

Q2

Och om vi inte vet vilken radtyp som returneras, hur skulle vi kunna göra det?

Eftersom du bara vill inspektera resultaten kan du casta hela posten till text .På detta sätt undviker du problemet med dynamiska returtyper för funktionen helt och hållet.

Tänk på den här demon:

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



  1. Hur använder man enums i Oracle?

  2. Multi Datacenter-inställningar med PostgreSQL

  3. JSON_SET() – Infoga eller uppdatera värden i ett JSON-dokument i MySQL

  4. pivottabell Oracle - hur man ändrar radobjekt till kolumner