Mọi thứ được thử nghiệm trong Postgres 9.4 .
Postgres có một số điểm yếu trong cú pháp xử lý các loại ROW. Bạn không thể truyền trực tiếp từ bảng (bí danh):
SELECT w::waypoint FROM waypoints w;
Giải pháp chỉ còn một bước nữa:phân rã hàng trong một truy vấn con, sau đó ép kiểu hoạt động. Bằng cách này, các giá trị cột được phân tách và gói thành kiểu mới trực tiếp mà không cần truyền sang text
và quay lại. Không cần liệt kê tất cả các cột riêng lẻ và bạn cũng không cần tạo dàn diễn viên tùy chỉnh:
SELECT (w.*)::waypoint FROM (SELECT * FROM waypoints) w;
Hoặc ngắn hơn:
SELECT w.*::waypoint FROM (TABLE waypoints) w;
Hoặc ngắn hơn, nhưng:
SELECT w::waypoint FROM (TABLE waypoints) w;
Điều đó ngắn hơn và nhanh hơn, trong một thử nghiệm nhanh với 30 nghìn hàng và các loại đơn giản nhanh hơn 10 lần hơn là truyền sang text
và quay lại. Nếu bạn có (big) jsonb
cột hoặc bất kỳ kiểu phức tạp nào (chuyển đổi đắt tiền thành / từ text
), sự khác biệt sẽ lớn hơn nhiều.
Quan trọng hơn, bạn không cần một loại kết hợp tùy chỉnh (ROW) khác. Mỗi bảng đã có hàng của nó được xác định là loại tự động. Chỉ cần sử dụng loại waypoints
hiện có thay vì waypoint
(nếu tất cả khả thi). Sau đó, tất cả những gì bạn cần là:
SELECT w FROM waypoints w;
Hoặc, ví dụ của bạn:
SELECT everything(t) FROM temp t; -- using type waypoints
SELECT everything(t::waypoint) FROM (TABLE temp) t; -- using type waypoint
Bên cạnh:
- Một bảng không có "đối số" mà có cột.
-
Bạn không không chuyển một tham số bảng
table parameter to this function
, mà là giá trị hàng . Đó là cách bạn chuyển một bảng theo tên:Bạn không thể "truyền toàn bộ bảng" làm tham số trực tiếp trong Postgres, không có biến bảng. Bạn sẽ sử dụng con trỏ hoặc bảng tạm thời cho việc đó.
Chức năng
Hàm của bạn có khai báo kiểu không hợp lệ và không cần thiết phải phức tạp. Tôi thực sự nghi ngờ bạn muốn tạo chế độ xem:
CREATE FUNCTION everything(_wp waypoint) -- or use type waypoints
RETURNS TABLE(node int, xy text[]) AS
$func$
BEGIN
RETURN QUERY
SELECT ...
END
$func$ LANGUAGE plpgsql;
text array
không phải là cú pháp hợp lệ, sử dụng text[]
thay vào đó để khai báo một mảng text
.
Thay vì sử dụng bảng / tên loại waypoints
dưới dạng tên tham số hàm, điều này khiến bạn gặp phải các lỗi khó hiểu.
Hoặc chỉ sử dụng một hàm SQL đơn giản nếu trường hợp của bạn đơn giản như minh họa:
CREATE FUNCTION everything(_wp waypoint) -- or use type waypoints
RETURNS TABLE(node int, xy text[]) AS
$func$
SELECT ...
$func$ LANGUAGE sql;
Không trích dẫn tên ngôn ngữ. Đó là một số nhận dạng.