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;