Bạn có thể trả về toàn bộ hàng dưới dạng loại hỗn hợp và thêm một số hàng khác:
CREATE OR REPLACE FUNCTION f_rowplus()
RETURNS TABLE (rec demo, add_int int, add_txt text) AS
$func$
SELECT d, 5, 'baz'::text FROM demo d;
$func$ LANGUAGE sql;
Nhưng sau đó, khi bạn sử dụng lệnh gọi đơn giản:
SELECT * FROM f_rowplus();
Bạn lấy hàng từ bảng demo
như loại hỗn hợp riêng biệt. Bạn phải gọi:
SELECT (rec).*, add_int, add_txt FROM f_rowplus();
để có được tất cả cá nhân cột. Bắt buộc phải có dấu ngoặc đơn.
Postgres có một chút mâu thuẫn ở đây. Nếu bạn tạo một hàm với:
CREATE OR REPLACE FUNCTION f_row2()
RETURNS TABLE (rec demo) AS
...
thì kiểu kết hợp demo
được chuyển đổi âm thầm thành các cột riêng lẻ (bị phân hủy). Không có liên kết đến loại hỗn hợp ban đầu vẫn còn. Bạn không thể tham chiếu cột đầu ra đã khai báo rec
ở tất cả, vì cột đó đã được thay thế bằng các cột của loại phân tách. Cuộc gọi này sẽ dẫn đến một thông báo lỗi:
SELECT rec FROM f_row2();
Tương tự ở đây:
CREATE OR REPLACE FUNCTION f_row3(OUT rec demo)
RETURNS SETOF demo AS
...
Tuy nhiên , ngay sau khi bạn thêm bất kỳ thêm OUT
, kiểu hỗn hợp được giữ nguyên như đã khai báo (không bị phân tách) và bạn có thể:
SELECT rec FROM f_rowplus();
với chức năng đầu tiên.
Tôi đã tạo SQL Fiddle trình diễn các biến thể.
Bên cạnh
Khi sử dụng một hàm trả về nhiều cột trong FROM
danh sách (dưới dạng hàm bảng) và phân rã trong SELECT
danh sách như thế này:
SELECT (rec).* FROM f_rowplus();
... hàm vẫn được đánh giá một lần chỉ - khi đang gọi và phân hủy trong SELECT
liệt kê trực tiếp như thế này:
SELECT (f_rowplus()).*; -- also: different result
... sẽ đánh giá một lần cho mọi cột trong kiểu trả về. Chi tiết: