2011-07-13 81 views
9

Tôi đang sử dụng PostgreSQL 8.3 và có chức năng đơn giản sau đây sẽ trả về một refcursor cho khách hàngGọi một hàm trả về một refcursor

CREATE OR REPLACE FUNCTION function_1() RETURNS refcursor AS $$ 
DECLARE 
     ref_cursor REFCURSOR; 
BEGIN 
     OPEN ref_cursor FOR SELECT * FROM some_table; 
     RETURN (ref_cursor);  
END; 
$$ LANGUAGE plpgsql; 

Bây giờ, tôi có thể sử dụng SQL sau lệnh để gọi chức năng này và thao tác con trỏ trở về, nhưng tên con trỏ sẽ tự động được tạo ra bởi các PostgreSQL

BEGIN; 
SELECT function_1(); --It will output the generated cursor name , for example , "<unnamed portal 11>" ; 
FETCH 4 from "<unnamed portal 11>"; 
COMMIT; 

Bên cạnh đó, tuyên bố một cách rõ ràng tên con trỏ như tham số đầu vào của hàm như mô tả của 38.7.3.5. Returning Cursors .Can tôi de clare tên con trỏ của riêng tôi và sử dụng tên con trỏ này để thao tác con trỏ trả về thay vì Postgresql tự động tạo cho tôi? Nếu không, có bất kỳ lệnh nào có thể lấy tên con trỏ được tạo không?

+0

+1, câu hỏi thú vị –

Trả lời

3

Có, sử dụng:

CREATE OR REPLACE FUNCTION function_1(refcursor) RETURNS refcursor AS $$ 
BEGIN 
     OPEN $1 FOR SELECT * FROM some_table; 
     RETURN $1;  
END; 
$$ LANGUAGE plpgsql; 

Kết quả:

SELECT function_1('myowncursorname'); 
    function_1 
----------------- 
myowncursorname 
(1 row) 

Dường như tên tự động tạo ra là <unnamed portal n>, nơi n là số tự nhiên (từ 1).

EDIT:

Như một cách khác để bạn có thể sử dụng pg_cursors xem với truy vấn như vậy để có được tên con trỏ tạo:

SELECT name FROM pg_cursors WHERE statement LIKE 'SELECT * FROM some_table'; 

Ví dụ:

BEGIN; 
SELECT function_1(); 
SELECT name FROM pg_cursors WHERE statement LIKE 'SELECT * FROM some_table'; 
COMMIT; 

Kết quả:

 function_1 
-------------------- 
<unnamed portal 3> 
(1 row) 

     name 
-------------------- 
<unnamed portal 3> 
(1 row) 
+0

Cảm ơn. Nhưng vấn đề là 'function_1' được cung cấp bởi các bên khác và tôi không thể thay đổi các tham số đầu vào cho hàm này. –

+0

Tôi nghĩ rằng đó là cách duy nhất để cung cấp tên con trỏ tùy chỉnh, tuy nhiên tôi không chắc chắn 100% với điều đó. –

+0

@Ken: Việc tìm nạp tên của con trỏ từ danh mục hệ thống 'pg_cursors' (như trên) thì sao? –

12

Tôi không khá chắc chắn từ phiên bản Mà của Postgre này hiện có sẵn (trong 8.4 nó là hợp lệ) nhưng tôi tìm thấy khá dễ nhất để xác định tên con trỏ khi bạn khai báo nó, như thế này:

CREATE OR REPLACE FUNCTION function_1() RETURNS refcursor AS $$ 
DECLARE 
     ref_cursor REFCURSOR := 'mycursor'; 
BEGIN 
     OPEN ref_cursor FOR SELECT * FROM some_table; 
     RETURN (ref_cursor);  
END; 
$$ LANGUAGE plpgsql; 

Và sau đó bạn có thể làm như sau:

BEGIN; 
SELECT function_1(); 
FETCH 4 from mycursor; 
COMMIT; 

Tôi thấy phương pháp này ít cồng kềnh. Hy vọng điều đó sẽ hữu ích.

+2

Cảm ơn giải pháp. Nó cũng có sẵn trong 8.3.12 – Nenad

Các vấn đề liên quan