2011-07-13 17 views
9

estoy usando PostgreSQL 8.3 y tienen la siguiente función simple que devolverá un refcursor al clienteLlamar a una función que devuelve un 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; 

Ahora, puede utilizar los siguientes comandos SQL para llamar a esta función y manipular el cursor vuelto, pero el nombre del cursor se genera automáticamente por el PostgreSQL

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

Además, se declara explícitamente el nombre de cursor como el parámetro de entrada de la función como se describe por 38.7.3.5. Returning Cursors .Can I de Clare mi propio nombre de cursor y use este nombre de cursor para manipular el cursor devuelto en lugar de Postgresql genera automáticamente para mí? Si no, ¿hay algún comando que pueda obtener el nombre del cursor generado?

+0

+1, pregunta interesante –

Respuesta

3

Sí, utilice:

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

Resultado:

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

Parece que el nombre autogenerado es <unnamed portal n>, donde es n número natural (de 1).

EDIT:

Como otra forma podría utilizar pg_cursors vista con tanta consulta para obtener generada nombre del cursor:

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

Por ejemplo:

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

Resultado:

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

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

Gracias. Pero el problema es que el 'function_1' es proporcionado por otras partes y no puedo cambiar los parámetros de entrada para esta función. –

+0

Creo que es la única forma de proporcionar un nombre de cursor personalizado, sin embargo, no estoy 100% seguro con eso. –

+0

@Ken: ¿Qué hay de obtener el nombre del cursor del catálogo del sistema 'pg_cursors' (como se indicó anteriormente)? –

12

No estoy muy seguro de la versión de PostgreSQL wich esto está disponible (en 8.4 es válido), pero me pareció bastante más sencilla de definir el nombre del cursor cuando se declara que, de esta manera:

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; 

Y entonces puede obtenerlo así:

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

Encuentro este método menos incómodo. Espero que ayude.

+2

Gracias por la solución. También está disponible en 8.3.12 – Nenad

Cuestiones relacionadas