PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie übergebe ich eine Tabelle oder Zeilen an eine Funktion in Postgresql?

Eine Zeile wird durch einen zusammengesetzten Typ wie

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

Sie können einen solchen Typ als Funktionsargument verwenden.

Für jede PostgreSQL-Tabelle existiert automatisch ein Typ mit demselben Namen und denselben Spalten:

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

Sie können also eine Funktion erstellen, die ein Array dieses Typs als Argument akzeptiert:

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

Sie können es so nennen (vorausgesetzt, es gibt zwei Zeilen in mytable ):

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

Alternativ können Sie eine Funktion erstellen, die einen Cursor als Argument akzeptiert:

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

Dies kann in einer Transaktion wie folgt aufgerufen werden:

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

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

COMMIT;