PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm cách nào để chuyển một tham số bảng vào hàm này?

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;

SQL Fiddle

Đ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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL:Hình phạt hiệu suất khi tham gia hai bảng trong các lược đồ riêng biệt

  2. Thực hiện nâng cấp alembic trong nhiều lược đồ

  3. HEX () và UNHEX () của MySQL tương đương trong Postgres?

  4. số nguyên ngoài phạm vi và dung lượng đĩa còn lại quá nhỏ để chuyển đổi id thành bigint và các giải pháp khác

  5. Tạo quy tắc hoặc trình kích hoạt Postgres để tự động chuyển đổi một cột thành chữ thường hoặc chữ hoa khi chèn