2012-06-21 34 views
5

Tôi có một chức năng some_func() trả về refcursor:Làm thế nào để chọn tất cả các hàng từ refcursor được trả về bởi hàm PL/pgSQL?

CREATE OR REPLACE FUNCTION some_func() RETURNS refcursor AS (...) 

Tôi muốn gọi chức năng này từ giao diện điều khiển và hiển thị kết quả thiết lập từ con trỏ trả về bởi nó. Trong Oracle tôi sẽ viết:

SELECT * FROM TABLE(some_func()); 

Tương đương với cấu trúc đó trên PosgreSQL là gì?

Trả lời

4

Một refcursor được gọi bằng tên của nó, hoặc tự động tạo ra hoặc lựa chọn của bạn. Điều này page of the doc đưa ra một ví dụ cho mỗi loại.

Để tìm nạp kết quả từ trình chỉnh sửa, bạn phải có tên của con trỏ. Trong trường hợp tên được tạo sẽ giống như tên của <unnamed portal 1>". Sau đó, bạn có thể:

FETCH ALL FROM "<unnamed portal 1>"; 

Tên con trỏ được trả về từ hàm là kết quả refcursor, do đó bạn có thể lấy nó từ đó.

+0

Có, nhưng vì tên của con trỏ không được xác định, tôi không biết và tôi không thể thực hiện ... –

+0

Chỉ khi bạn sử dụng tên được tạo tự động. Xem ví dụ đầu tiên của tài liệu nơi người gọi chỉ định tên cố định. –

+0

Vâng, có một thực tế là tác giả của thủ tục đã không chỉ định tên cố định. Vì vậy, tôi đang tìm kiếm giải pháp chung. –

0

Cho phép nói rằng bạn có chức năng postgres được viết theo cách trả lại một con trỏ;

CREATE OR REPLACE FUNCTION "com.mkindika"."myfunction" ("refcursor", other input parameters) RETURNS "pg_catalog"."refcursor" AS 
$body$ 
DECLARE 

---- query 

END; 
$body$ 
LANGUAGE 'plpgsql' STABLE CALLED ON NULL INPUT SECURITY INVOKER; 

Nếu bạn muốn in con trỏ, bạn có thể sử dụng các dòng mã sau đây;

BEGIN; 
SELECT "com.mkindika"."myfunction" ("refcursor",other input parameters); 
FETCH ALL IN "refcursor"; 
Các vấn đề liên quan