Một hàm cần khai báo kiểu trả về. Một mảng chỉ có thể dựa trên một loại phần tử đã biết. Hồ sơ ẩn danh không được phép. Vì vậy, hãy tạo một kiểu kết hợp phù hợp với nhu cầu của bạn (trừ khi có một bảng hoặc dạng xem đã xác định loại hàng).
CREATE TYPE my_type (
ts text
, alertlevel int
, time_passed interval
);
Đối với mục đích thử nghiệm, bạn cũng có thể tạo một bảng tạm thời để đăng ký một loại kết hợp trong thời gian của một phiên:
CREATE TEMP TABLE my_type ( ...)
(Một bảng tạm thời bị xóa vào cuối phiên, bất kỳ cấu trúc chức năng nào trên loại này sẽ bị phá vỡ sau đó.)
Sử dụng đó làm kiểu cơ sở cho mảng. Bạn có thể sử dụng một hàm SQL đơn giản cho mục đích:
CREATE OR REPLACE FUNCTION foo()
RETURNS my_type[] AS
$func$
SELECT array_agg(result::my_type) -- you must cast the row type!
FROM (
SELECT to_char("Timestamp", 'YYYY-MM-DD HH24:MI:SS')
, "AlertLevel"
, "Timestamp" - lag("Timestamp") OVER (ORDER BY "Timestamp")
FROM "Judgements"
WHERE "SampleID" = sampleid
AND "Timestamp" >= starttime
AND "Timestamp" <= stoptime
) result
WHERE "AlertLevel" > 0;
$func$
LANGUAGE sql;
Gọi:
SELECT foo();
Thay thế đơn giản với text[]
Bạn cũng có thể truyền sang text
/ text[]
. Bạn mất tên cột và nhập thông tin, nhưng nó hoạt động hiệu quả:
CREATE OR REPLACE FUNCTION foo()
RETURNS text[] AS
$func$
SELECT array_agg(result::text) -- cast the record to text!
FROM ( ... ) result
...;
$func$
LANGUAGE sql;
Nếu bạn không thực sự cần một mảng, bạn có thể loại bỏ array_agg()
, trả về các hàng riêng lẻ và khai báo kiểu trả về với RETURNS TABLE (...)
. Tìm kiếm SO cho plpgsql
, bạn sẽ tìm thấy nhiều ví dụ ..
Hãy nhớ gọi hàm set-return bằng:
SELECT * FROM foo();