PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara melewatkan tabel atau baris ke suatu fungsi di Postgresql?

Baris diwakili oleh tipe komposit, seperti

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

Anda dapat menggunakan tipe seperti argumen fungsi.

Untuk setiap tabel PostgreSQL, secara otomatis terdapat tipe dengan nama dan kolom yang sama:

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

Jadi, Anda dapat membuat fungsi yang menggunakan array jenis ini sebagai argumen:

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

Anda dapat menyebutnya seperti ini (dengan asumsi bahwa ada dua baris di mytable ):

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

Atau, Anda dapat membuat fungsi yang menggunakan kursor sebagai argumen:

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

Ini dapat disebut dalam transaksi sebagai berikut:

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. psycopg2 dan keamanan injeksi SQL

  2. Tidak dapat memasukkan JSON dari PostgreSQL ke elasticsearch. Mendapatkan kesalahan - "Pengecualian saat menjalankan kueri JDBC"

  3. PostgreSQL:RANGE ANTARA INTERVAL '10 HARI' DAN BARIS LANCAR

  4. Nama tabel sebagai parameter fungsi PostgreSQL

  5. solusi jOOQ EXTRACT(EPOCH FROM [field])?