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

Hvordan sender man en tabel eller rækker til en funktion i Postgresql?

En række er repræsenteret af en sammensat type, f.eks.

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

Du kan bruge sådan en type som funktionsargument.

For hver PostgreSQL-tabel eksisterer der automatisk en type med samme navn og samme kolonner:

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

Så du kan oprette en funktion, der tager et array af denne type som argument:

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

Du kan kalde det sådan (forudsat at der er to rækker i mytable ):

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

Alternativt kan du oprette en funktion, der tager en markør som 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;$$;

Dette kan kaldes i en transaktion som følger:

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

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

COMMIT;


  1. FROM-sætning, der er nødvendig i hver SELECT-sætning

  2. Ydeevne af dynamisk SQL vs. lagrede procedurer på Oracle

  3. MariaDB JSON_VALUE() Forklaret

  4. MySQL-valgstreng med flere specialtegn