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

Comment passer une table ou des lignes à une fonction dans Postgresql ?

Une ligne est représentée par un type composite, comme

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

Vous pouvez utiliser un tel type comme argument de fonction.

Pour chaque table PostgreSQL, il existe automatiquement un type avec le même nom et les mêmes colonnes :

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

Vous pouvez donc créer une fonction qui prend en argument un tableau de ce type :

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

Vous pouvez l'appeler comme ceci (en supposant qu'il y a deux lignes dans mytable ):

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

Alternativement, vous pouvez créer une fonction qui prend un curseur comme argument :

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

Cela peut être appelé dans une transaction comme suit :

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

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

COMMIT;