2011-07-13 7 views
9

Używam PostgreSQL 8.3 i mieć następującą prostą funkcję, która będzie zwracać refcursor do klientaWywołanie funkcji, która zwraca 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; 

Teraz mogę używać komend następujące SQL, aby wywołać tę funkcję i manipulować zwracana kursor, a nazwa kursor jest automatycznie generowany przez PostgreSQL

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

Poza wyraźnie deklarowania nazwę kursora jako parametr wejściowy w funkcji, jak opisano w 38.7.3.5. Returning Cursors .Can I de Czy mam własną nazwę kursora i używam tej nazwy kursora do manipulowania zwróconym kursorem zamiast automatycznie generuje dla mnie Postgresql? Jeśli nie, czy są jakieś polecenia, które mogą uzyskać nazwę wygenerowanego kursora?

+0

+1, interesujące pytanie –

Odpowiedz

3

Tak, użyj:

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

Wynik:

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

Wygląda na to auto generowane nazwy jest <unnamed portal n>, gdzie n jest liczbą naturalną (z 1).

EDIT:

Jako inny sposób można wykorzystać pg_cursors widok z takim zapytaniem do uzyskania generowane nazwę kursora:

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

Na przykład:

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

Wynik:

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

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

Dzięki. Problem polega jednak na tym, że funkcja "function_1" jest dostarczana przez inne podmioty i nie mogę zmienić parametrów wejściowych dla tej funkcji. –

+0

Myślę, że to tylko sposób na podanie niestandardowej nazwy kursora, jednak nie jestem w 100% pewny. –

+0

@Ken: Co powiesz na pobranie nazwy kursora z katalogu systemowego 'pg_cursors' (jak wyżej)? –

12

Nie jestem pewien, od wersji Wich z Postgre ten jest dostępny (w 8.4 jest ważne), ale znalazłem dość najłatwiej określić nazwę kursora podczas zadeklarować ją tak:

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; 

I wtedy możesz dostać to w ten sposób:

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

Uważam tę metodę za mniej uciążliwą. Nadzieję, że pomaga.

+2

Dzięki za rozwiązanie. Jest również dostępny w wersji 8.3.12 – Nenad