Có một cách.
Đưa ra một bảng t
và một hàm f()
trả về một bản ghi ẩn danh phù hợp với loại bảng đó:
CREATE TABLE t (id int, d date);
Bạn không thể chỉ tạo bản ghi ẩn danh, vì danh sách định nghĩa cột là bắt buộc cho
SELECT * FROM f()
Trích dẫn hướng dẫn trên lệnh SELECT :
Nếu hàm đã được xác định là trả về kiểu dữ liệu bản ghi, thì phải có một bí danh hoặc từ khóa AS
, theo sau là danh sách định nghĩa cột trong biểu mẫu ...
Nhấn mạnh đậm của tôi.
Vì vậy, trong khi tất cả các truy vấn này hoạt động:
SELECT '(1,2013-11-11)'::t;
SELECT ('(1,2013-11-11)'::t).*;
SELECT f(); -- returning anonymous record
SELECT * FROM f() AS f(id int, d date);
Không ai trong số này làm:
SELECT * FROM f();
SELECT * FROM f()::t;
Cái sau đưa ra một ngoại lệ:
LRI: không thể truyền bản ghi loại tới t
Bạn có thể gói SELECT
danh sách định nghĩa cột vào một VIEW
hoặc một hàm như @a_horse và @deszo đề xuất. Điều đó sẽ làm việc tốt:
CREATE OR REPLACE VIEW v1 AS
SELECT * FROM f() AS f(id int, d date);
Nhưng điều đó sẽ không trả lời câu hỏi của bạn:
chuyển đổi bản ghi (hoặc loại trả về bản ghi setof) thành hàng T
mà không liệt kê các thuộc tính?
Giải pháp cho hàng đơn
Trong khi một diễn viên thất bại, một nhiệm vụ trong plpgsql hoạt động.
CREATE OR REPLACE function f1(OUT rec t) AS
$func$
BEGIN
rec := f(); -- assignment succeeds where cast failed (!)
END
$func$ LANGUAGE plpgsql;
Gọi:
SELECT * FROM f1();
Mặc dù bạn cũng có thể viết hàm trả về tập hợp với mẫu đó nhưng tôi không tìm thấy cách nào SELECT
từ hàm trả về tập mà không cung cấp danh sách định nghĩa cột ...
-> SQLfiddle