sql >> Database >  >> RDS >> PostgreSQL

Testen van PostgreSQL-functies die refcursor verbruiken en retourneren

Q1

Uw "kleine test" kan gewoon SQL zijn:

BEGIN;
SELECT get_function_that_returns_cursor('ret', 4100, 'foo', 123); -- note: 'ret'
FETCH ALL IN ret; -- works for any rowtype

COMMIT;  -- or ROLLBACK;

Voer COMMIT uit / ROLLBACK na je hebt de resultaten bekeken. De meeste clients geven alleen het resultaat van het lat-commando weer.

Meer in het hoofdstuk Terugkerende cursors van de handleiding.

Q2

En als we het rijtype dat wordt geretourneerd niet weten, hoe kunnen we dat dan doen?

Aangezien u alleen de resultaten wilt inspecteren, kunt u het hele record casten naar text Op deze manier vermijd je het probleem met dynamische retourtypes voor de functie.

Overweeg deze demo:

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. Een datum-/tijdwaarde converteren naar een tekenreeks in SQL Server met CONVERT()

  2. Opgeslagen MySQL-procedures maken en gebruiken - een zelfstudie

  3. Een overzicht van de nieuwe opgeslagen procedures in PostgreSQL 11

  4. Een procedure uitvoeren binnen een pakket in Oracle