Tôi sử dụng Postgresql 9.1, với Ubuntu 12.04.
Lấy cảm hứng từ câu trả lời của Craig cho câu hỏi của tôi Concatenation loại setof hoặc hồ sơ setof Tôi nghĩ tôi sẽ suôn sẻ với việc sử dụng return query
, setof record
và một máy phát điện hàng loạt vào chức năng plpgsql này:
create or replace function compute_all_pair_by_craig(id_obj bigint)
returns setof record as $$
begin
return query select o.id, generate_series(0,o.value) from m_obj as o;
end;
$$ language plpgsql;
Trong quá trình thực thi tôi gặp lỗi:
ERROR: set_valued function called in context that cannot accept a set
Chuyện gì thế ? Trái với Craig tôi bảo hàm trả về setof record
.
Tôi có thể đạt được một cái gì đó hoạt động chính xác như Craig, tức là bằng cách xác định một loại create type pair_id_value as (idx bigint, value integer)
và hàm plpgsql của tôi trả về setof of pair_id_value
thay vì a setof record
.
Nhưng ngay cả với giải pháp làm việc này, tôi vẫn không hiểu tại sao select id, generate_series(0,13)
một mình sẽ trả về một kết quả trong hai cột ... và ngược lại gọi hàm (trả về setof cặp_id_value) return query select id, generate_series(0,my_obj.value) from my_obj
sẽ trả về kết quả chỉ trong một cột có trường trông như thế nào this "(123123,0)" "(123123,1)" "(123123,2)" (3 hàng) rõ ràng là bộ dữ liệu.
Đây có phải là trường hợp một bảng tạm thời phải / nên được tạo không?
BEGIN
và thiếu một dấu sauRETURN QUERY
. Sau khi sửa những lỗi đó tôi xác nhận lỗi khi quay lạirecord
; sẽ giải thích trong câu trả lời.