PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да предам таблица или редове към функция в Postgresql?

Редът се представя от съставен тип, като

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

Можете да използвате такъв тип като аргумент на функцията.

За всяка таблица на PostgreSQL автоматично съществува тип със същото име и колони:

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

Така че можете да създадете функция, която приема масив от този тип като аргумент:

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

Можете да го наречете така (ако приемем, че има два реда в mytable ):

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

Като алтернатива можете да създадете функция, която приема курсор като аргумент:

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

Това може да се извика в транзакция, както следва:

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

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

COMMIT;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sqlalchemy с postgres:вмъкнете в таблица, чиито колони имат скоби

  2. pgpredict – Предсказуем анализ в PostgreSQL

  3. PostgreSQL:попълнете NULL стойности в заявка за времева серия с предишна стойност

  4. PostgreSQL 9.2 JDBC драйвер използва клиентска часова зона?

  5. PostgreSQL - релация [таблица] не съществува