sql >> Database >  >> RDS >> PostgreSQL

Hoe geef je een tabel of rijen door aan een functie in Postgresql?

Een rij wordt weergegeven door een samengesteld type, zoals

CREATE TYPE mytype  AS (
   id integer,
   name text,
   fromdate timestamp with time zone
);

Je kunt zo'n type gebruiken als functieargument.

Voor elke PostgreSQL-tabel bestaat er automatisch een type met dezelfde naam en kolommen:

CREATE TABLE mytable (
   id integer PRIMARY KEY,
   name text,
   fromdate timestamp with time zone NOT NULL
);

U kunt dus een functie maken die een array van dit type als argument nodig heeft:

CREATE OR REPLACE FUNCTION myfunc(arg mytable[]) RETURNS void
   LANGUAGE plpgsql IMMUTABLE STRICT AS
$$DECLARE
   t mytable;
BEGIN
   FOREACH t IN ARRAY arg LOOP
      RAISE NOTICE 'id = %', t.id;
   END LOOP;
END;$$;

Je kunt het zo noemen (ervan uitgaande dat er twee rijen zijn in mytable ):

SELECT myfunc(array_agg(mytable)) FROM mytable;
NOTICE:  id = 1
NOTICE:  id = 2
┌────────┐
│ myfunc │
├────────┤
│        │
└────────┘
(1 row)

Als alternatief kunt u een functie maken die een cursor als argument nodig heeft:

CREATE OR REPLACE FUNCTION myfunc(arg refcursor) RETURNS void
   LANGUAGE plpgsql IMMUTABLE STRICT AS
$$DECLARE
   t mytable;
BEGIN
   LOOP
      FETCH NEXT FROM arg INTO t;
      EXIT WHEN NOT FOUND;
      RAISE NOTICE 'id = %', t.id;
   END LOOP;
END;$$;

Dit kan als volgt in een transactie worden aangeroepen:

BEGIN;
DECLARE c CURSOR FOR SELECT * FROM mytable;
SELECT myfunc('c');

NOTICE:  id = 1
NOTICE:  id = 2
┌────────┐
│ myfunc │
├────────┤
│        │
└────────┘
(1 row)

COMMIT;


  1. Vergelijken met NULL-waarden

  2. Max van somquery

  3. FULL OUTER JOIN om tabellen samen te voegen met PostgreSQL

  4. Wat is de beste manier om database-inserts bulksgewijs vanuit c# in te voeren?