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ớiOUT
tham số để xác định tên và loại cột.
100% tương đương vớiRETURNS 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.