sql >> Databáze >  >> RDS >> PostgreSQL

Jak předat tabulku nebo řádky funkci v Postgresql?

Řádek je reprezentován složeným typem, jako je

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

Takový typ můžete použít jako argument funkce.

Pro každou PostgreSQL tabulku automaticky existuje typ se stejným názvem a sloupci:

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

Můžete tedy vytvořit funkci, která vezme pole tohoto typu jako 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;$$;

Můžete to nazvat takto (za předpokladu, že v mytable jsou dva řádky ):

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

Alternativně můžete vytvořit funkci, která přebírá kurzor jako 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;$$;

To lze v transakci volat následovně:

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

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

COMMIT;


  1. Když jdeme na křížovou aplikaci a když jdeme na vnitřní spojení v SQL Server 2012

  2. Nejjednodušší způsob migrace projektu Django z MySQL do PostgreSQL

  3. Chyba instalace SQL Server 2008:Předchozí verze Microsoft Visual Studio 2008

  4. Porovnání celých čísel MySQL ignoruje koncové alfa znaky