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

Cách dễ dàng để có loại trả về là bảng SETOF cộng với các trường bổ sung?

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 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:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để nâng cấp trong Postgres về xung đột trên một trong 2 cột?

  2. Cập nhật với hàm được gọi một lần cho mỗi hàng trong Postgres 8.4

  3. 3 cách liệt kê tất cả các hàm trong PostgreSQL

  4. PG ::Lỗi trong mệnh đề GROUP BY

  5. Tại sao kết nối với máy chủ Postgres của tôi trong Azure không thành công nếu ứng dụng của tôi không được bật SSL?