PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm cách nào để chuyển một bảng hoặc các hàng cho một hàm trong Postgresql?

Một hàng được biểu thị bằng kiểu kết hợp, như

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

Bạn có thể sử dụng kiểu như vậy làm đối số hàm.

Đối với mỗi bảng PostgreSQL, tự động tồn tại một loại có cùng tên và các cột:

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

Vì vậy, bạn có thể tạo một hàm nhận một mảng kiểu này làm đối số:

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

Bạn có thể gọi nó như thế này (giả sử rằng có hai hàng trong mytable ):

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

Ngoài ra, bạn có thể tạo một hàm lấy con trỏ làm đối số:

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

Điều này có thể được gọi trong một giao dịch như sau:

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. Làm cách nào để chuyển cơ sở dữ liệu sản xuất sang dàn dựng trên Heroku bằng cách sử dụng pgbackups? Bắt lỗi

  2. Đăng ký sớm cho PGDay.IT 2011

  3. Django get_or_create không đặt được trường khi được sử dụng với iexact

  4. Các ký tự tối đa trong nhãn (tên bảng, cột, v.v.)

  5. sê-ri trong postgres đang được tăng lên mặc dù tôi đã thêm vào cuộc xung đột không làm gì cả