Nếu bởi "dựa trên một bảng đã biết" thì ý của bạn là "chính xác như một bảng đã biết", thì có .
SQL là một ngôn ngữ được định kiểu nghiêm ngặt và các hàm phải được tạo với kiểu trả về được xác định rõ ràng. Bạn có thể quay lại hồ sơ ẩn danh như bạn rõ ràng đã làm (với RETURNS SETOF record
), nhưng sau đó bạn được yêu cầu thêm danh sách định nghĩa cột cho mọi cuộc gọi, giống như thông báo lỗi cho bạn biết. Một cái gì đó như:
SELECT *
FROM my_function('foo') AS foo (
colum_name1 integer -- name and data type for every column
, colum_name2 text
, colum_name3 real);
Và điều này hầu như không động.
Câu hỏi của bạn còn chỗ để giải thích, nhưng "dựa trên một bảng đã biết" sẽ chỉ ra rằng một hàm đa hình có thể thực hiện thủ thuật. Kiểu trả về có thể dựa trên bất kỳ kiểu hàng đã đăng ký nào một cách động và có một kiểu tự động cho mọi bảng trong hệ thống. Ví dụ về mã Barebone:
CREATE OR REPLACE FUNCTION my_function(_rowtype anyelement)
RETURNS SETOF anyelement AS
$func$
BEGIN
RETURN QUERY EXECUTE format(
'SELECT * FROM %s LIMIT 10'
, pg_typeof(_rowtype) -- pg_typeof() returns regtype, quoted where necessary
);
END
$func$ LANGUAGE plpgsql;
Gọi:
SELECT * FROM my_function(NULL::my_table);
Hướng dẫn chi tiết trong câu trả lời liên quan này (xem chương cuối cùng "Các loại bảng hoàn chỉnh khác nhau" ):