2011-07-13 6 views
9

J'utilise Postgresql 8.3 et ont la fonction simple suivante qui renverra un refcursor au clientAppel d'une fonction qui retourne une 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; 

Maintenant, je peux utiliser les commandes SQL suivantes pour appeler cette fonction et manipuler le curseur de retour, mais le nom du curseur est généré automatiquement par le PostgreSQL

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

en outre, déclarant explicitement le nom du curseur en tant que paramètre d'entrée de la fonction comme décrit par 38.7.3.5. Returning Cursors .Peut I de clare mon propre nom de curseur et utilise ce nom de curseur pour manipuler le curseur retourné au lieu de Postgresql génère automatiquement pour moi? Si non, existe-t-il des commandes pouvant obtenir le nom du curseur généré?

+0

+1, question intéressante –

Répondre

3

Oui, utilisez:

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

Résultat:

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

Il ressemble à un nom généré automatiquement est <unnamed portal n>, où n est nombre naturel (de 1).

EDIT:

Comme une autre façon, vous pouvez utiliser pg_cursors vue avec une telle requête pour obtenir généré le nom du curseur:

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

Par exemple:

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

Résultat:

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

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

Merci. Mais le problème est que le 'function_1' est fourni par d'autres parties et je ne peux pas changer les paramètres d'entrée pour cette fonction. –

+0

Je pense que c'est seulement la façon de fournir un nom de curseur personnalisé, mais je ne suis pas sûr à 100% avec ça. –

+0

@Ken: Qu'en est-il aller chercher le nom du curseur du catalogue système 'pg_cursors' (comme ci-dessus)? –

12

Je ne suis pas tout à fait sûr de la version Wich de Postgre il est disponible (en 8.4 il est valide) mais je l'ai trouvé tout à fait facile de définir le nom du curseur lorsque vous déclarez, comme ceci:

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; 

Et vous pouvez l'obtenir comme ceci:

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

Je trouve cette méthode moins lourde. Espérons que cela aide.

+2

curosr Merci pour la solution. Il est également disponible en 8.3.12 – Nenad

Questions connexes