PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come passare una tabella o righe a una funzione in Postgresql?

Una riga è rappresentata da un tipo composto, come

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

Puoi usare un tipo come argomento di funzione.

Per ogni tabella PostgreSQL esiste automaticamente un tipo con lo stesso nome e le stesse colonne:

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

Quindi puoi creare una funzione che accetta un array di questo tipo come argomento:

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;$$;

Puoi chiamarlo in questo modo (supponendo che ci siano due righe in mytable ):

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

In alternativa, puoi creare una funzione che accetta un cursore come argomento:

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;$$;

Questo può essere chiamato in una transazione come segue:

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

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

COMMIT;