sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur skickar man en tabell eller rader till en funktion i Postgresql?

En rad representeras av en sammansatt typ, som

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

Du kan använda en sådan typ som funktionsargument.

För varje PostgreSQL-tabell finns det automatiskt en typ med samma namn och kolumner:

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

Så du kan skapa en funktion som tar en array av denna typ 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 kalla det så här (förutsatt att det finns två rader i mytable ):

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

Alternativt kan du skapa en funktion som tar 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;$$;

Detta kan anropas i en transaktion enligt följande:

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

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

COMMIT;


  1. Vilka är sätten att flytta data äldre än 'Y' dagar till en arkiv-/historiktabell i MySQL?

  2. Ställ automatiskt in mysql autoincrement till min värde

  3. Konvertera ett mySQL-datum till Javascript-datum

  4. Hur man hämtar data från en sammanfogad tabell