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

Khai báo cấu trúc tuple của một bản ghi trong PL / pgSQL

Bạn đang trộn cú pháp để trả về SETOF các giá trị có cú pháp để trả về một hàng hoặc một giá trị.

- Một câu hỏi liên quan là - làm cách nào để trả lại bản ghi duy nhất 'r' từ

Khi bạn khai báo một hàm với RETURNS TABLE , bạn phải sử dụng RETURN NEXT trong nội dung để trả về một hàng (hoặc giá trị vô hướng). Và nếu bạn muốn sử dụng record biến với nó phải phù hợp với kiểu trả về. Tham khảo thêm các ví dụ mã.

Trả về một giá trị hoặc một hàng

Nếu bạn chỉ muốn trả lại một hàng duy nhất, thì không cần cho một bản ghi của loại không xác định. @Kevin đã chứng minh hai cách. Tôi sẽ thêm một phiên bản đơn giản với OUT thông số:

CREATE OR REPLACE FUNCTION my_func(OUT a integer, OUT b text)
   AS
$func$
BEGIN
   a := ...;
   b := ...;
END
$func$ LANGUAGE plpgsql;

Bạn thậm chí không cần thêm RETURN; trong phần thân hàm, giá trị của OUT được khai báo các tham số sẽ được trả về tự động ở cuối hàm - NULL cho bất kỳ tham số nào chưa được chỉ định.
Và bạn không cần khai báo RETURNS RECORD bởi vì điều đó đã rõ ràng khỏi OUT tham số.

Trả về một tập hợp các hàng

Nếu bạn thực sự muốn trả về nhiều hàng (bao gồm khả năng cho 0 hoặc 1 hàng), bạn có thể xác định kiểu trả về là RETURNS ...

  • SETOF some_type , trong đó some_type có thể là bất kỳ kiểu vô hướng hoặc hỗn hợp đã đăng ký nào.

  • TABLE (col1 type1, col2 type2) - định nghĩa loại hàng đặc biệt.

  • SETOF record cộng với OUT tham số để xác định tên và loại cột.
    100% tương đương với RETURNS TABLE .

  • SETOF record mà không cần định nghĩa thêm. Nhưng sau đó các hàng được trả về là không xác định và bạn cần bao gồm danh sách định nghĩa cột với mọi lệnh gọi (xem ví dụ).

Hướng dẫn về loại bản ghi:

Các biến bản ghi tương tự như các biến kiểu hàng, nhưng chúng có cấu trúc không được xác định. Chúng đảm nhận cấu trúc hàng thực tế của mũi tên mà chúng được chỉ định trong lệnh SELECT hoặc FOR.

Còn nữa, đọc sách hướng dẫn.

Bạn có thể sử dụng biến bản ghi mà không chỉ định loại đã xác định, bạn có thể thậm chí trả về các bản ghi không xác định như vậy:

CREATE OR REPLACE FUNCTION my_func()
  RETURNS SETOF record AS
$func$
DECLARE
    r record;
BEGIN
    r := (1::int, 'foo'::text); RETURN NEXT r; -- works with undefined record
    r := (2::int, 'bar'::text); RETURN NEXT r;
END
$func$ LANGUAGE plpgsql;

Gọi:

SELECT * FROM my_func() AS x(a int, b text);

Nhưng điều này rất khó sử dụng vì bạn phải cung cấp danh sách định nghĩa cột với mọi cuộc gọi. Nói chung, nó có thể được thay thế bằng một cái gì đó thanh lịch hơn:

  • Nếu bạn biết kiểu tại thời điểm tạo hàm, hãy khai báo nó ngay lập tức (RETURNS TABLE hoặc bạn bè).

CREATE OR REPLACE FUNCTION my_func()
  RETURNS SETOF tbl_or_type AS
$func$
DECLARE
    r tbl_or_type;
BEGIN
    SELECT INTO tbl_or_type  * FROM tbl WHERE id = 10;
    RETURN NEXT r;  -- type matches

    SELECT INTO tbl_or_type  * FROM tbl WHERE id = 12;
    RETURN NEXT r;

    -- Or simpler:
    RETURN QUERY
    SELECT * FROM tbl WHERE id = 14;
END
$func$ LANGUAGE plpgsql;
  • Nếu bạn biết loại tại thời điểm gọi hàm , có nhiều cách đơn giản hơn khi sử dụng các kiểu đa hình:
    Refactor một hàm PL / pgSQL để trả về kết quả đầu ra của các truy vấn SELECT khác nhau

Câu hỏi của bạn không rõ ràng về những gì bạn cần chính xác.



  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 di chuyển JSON sang JSONB

  2. Trích xuất năm từ một ngày trong PostgreSQL

  3. Vòng lặp trên các bảng với PL / pgSQL trong Postgres 9.0+

  4. Nâng cấp lên PostgreSQL 11 với Logical Replication

  5. Chuyển đổi mảng PostgreSQL sang mảng PHP