2009-09-30 9 views
1

J'ai une fonction écrite en pl/pgsql qui fonctionne de la même manière que celle décrite ci-dessous:refcursor en pl/pgsql

CREATE FUNCTION reffunc(text) RETURNS refcursor AS ' 
BEGIN 
    OPEN $1 FOR SELECT col FROM test WHERE c1=$1; 
    RETURN $1; 
END; 
' LANGUAGE plpgsql; 

Je veux être en mesure de l'utiliser avec une seule commande de sélection comme opposé à la manière documentée (en utilisant une transaction) est:

BEGIN; 
SELECT reffunc('funccursor'); 
FETCH ALL IN "<unnamed cursor 1>"; 
COMMIT; 

Je suis sûr que je suis en mesure de le faire avant, mais je ne me souviens pas comment je l'ai fait, ou trouver documenté. Est-ce possible? Ou est-il possible d'écrire cette fonction de telle sorte qu'elle puisse être sortie sans utiliser un refcursor.

Je m'attends à plusieurs lignes à retourner et une vérification des données est effectuée dans la fonction avant qu'elle ne soit retournée. D'où la nécessité de l'utilisation d'une procédure stockée.

Répondre

3

Bien sûr, il est possible de retourner sans curseur.

Exemple:

CREATE FUNCTION reffunc(in_c1 text) RETURNS setof test AS ' 
DECLARE 
    temprec test; 
BEGIN 
    FOR temprec in SELECT col FROM test WHERE c1 = in_c1 LOOP 
     return next temprec; 
    END LOOP; 
    RETURN; 
END; 
' LANGUAGE plpgsql; 
select * from reffunc('funccursor'); 

Si vous utilisez 8.4, vous pouvez également utiliser "RETURN QUERY" qui est encore plus agréable.

1
create or replace function reffunc(in_c1 text) 
returns setof refcursor as 
$body$ 
declare 
     temprec refcursor; 
/* 
    MODULE NAME   DEVELOPER NAME  CREATED DATE MODIFIED DATE 
         MOHAMMED SHAKIR  9-6-2011 
*/ 
Begin 
    open temprec for 
      select col from test where c1 = in_c1; 
RETURN NEXT REF1; 
end; 
$body$ 

LANGUAGE 'plpgsql' VOLATILE 
Questions connexes