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

Tự động xác định các loại hàng trả về dựa trên một bảng đã cho đã truyền trong plpgsql?

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

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




  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 cách nào để thực hiện truy vấn LIKE cho khóa jsonb?

  2. Tại sao postgis của tôi không sử dụng chỉ mục trên trường hình học?

  3. PostgreSQL:cách cập nhật các hàng trong CTE

  4. Ngoại lệ Postgres:Không có kết quả nào được trả về bởi truy vấn.

  5. Postgresql và tên bảng unicode:Tại sao tôi không thể chọn tên bảng từ giản đồ thông tin khi nó chứa các ký tự unicode?