Vous n'êtes pas identifié(e).

#1 16/03/2009 14:26:25

mourad
Membre

Appel d'une fonction retournant un curseur

Bjr tout le monde, voici la fonction que j'ai crée
<Code>

CREATE OR REPLACE FUNCTION "theriaque"."get_the_infos" (varchar) RETURNS "pg_catalog"."refcursor" AS
$body$
DECLARE
  NA ALIAS FOR $1;
  curRet REFCURSOR;
BEGIN
    OPEN curRet FOR
    SELECT DEXTR_VER_THER_PK AS VERS, DEXTR_DATE_EXTR_PK AS DATE_EXT FROM DEXTR_DATE_EXTRACTION;
  RETURN curRet;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;
</Code>

Elle marche convenablement et je peux l'exécuter avec l'outil que j'utilise SQL Manager 2007 Lite for PostgreSQL.
Mais lorsque je veux l'exécuter autrement avec l'éditeur de commande en suivant le lien http://postgresql.developpez.com/faq...kees#appelproc, j'ai utilisé
<Code> SELECT * FROM GET_THE_INFOS('') AS (VERS varchar(10), DATE_EXTR date); </Code>

mais j'ai toujours l'erreur suivante : ERROR: a column definition list is only allowed for functions returning "record".
Est ce que quelqu'un pourrait m'orienter pour trouver mon erreur.
Merci d'avance.
Cordialement

Hors ligne

#2 16/03/2009 18:31:48

gleu
Administrateur

Re : Appel d'une fonction retournant un curseur

Tu déclares renvoyer un curseur seul. Donc la fonction doit se trouver dans la partie SELECT. Quelque chose comme :

SELECT GET_THE_INFOS('')

Guillaume.

Hors ligne

#3 17/03/2009 09:38:41

mourad
Membre

Re : Appel d'une fonction retournant un curseur

J'ai essayé cela mais j'ai comme sortie "unnamed portal 1". Je ne sais pas c'est du à quoi?

Hors ligne

#4 17/03/2009 11:16:37

gleu
Administrateur

Re : Appel d'une fonction retournant un curseur

Au fait que tu renvoies un curseur seulement. Pourquoi renvoies-tu un curseur ? pourquoi ne pas renvoyer les données de la requête du curseur ?

Pour tout savoir sur les curseurs dans les fonctions PL/pgsql, lire http://docs.postgresql.fr/8.3/plpgsql-cursors.html


Guillaume.

Hors ligne

#5 24/03/2009 11:57:33

mourad
Membre

Re : Appel d'une fonction retournant un curseur

En fait je suis au tout début avec PostgreSQL. Et comment faire pour envoyer directement les donnée de la requête du curseur. Est ce que je dois changer les paramètres de sortie et retourner les noms des colonnes et leur type au lieu d'un curseur ?
Merci pour votre collaboration.

Hors ligne

#6 24/03/2009 12:54:57

gleu
Administrateur

Re : Appel d'une fonction retournant un curseur

En fait, il n'est même pas utile de passer par un curseur. On peut renvoyer le retour d'une requête sans plus de traitement :

CREATE OR REPLACE FUNCTION get_the_infos()
 RETURNS SETOF matable
 LANGUAGE 'plpgsql'
 AS
$body$
BEGIN
 RETURN QUERY (SELECT * FROM matable);
END;

comme on peut renvoyer des données traitées après exécution de la requête:

CREATE OR REPLACE FUNCTION get_the_infos()
 RETURNS SETOF matable
 LANGUAGE 'plpgsql'
 AS
$body$
DECLARE
  r RECORD;
BEGIN
 FOR r IN SELECT * FROM matable
 LOOP
  RETURN NEXT r;
 END LOOP;
 RETURN;
END;

Guillaume.

Hors ligne

#7 24/03/2009 18:23:25

mourad
Membre

Re : Appel d'une fonction retournant un curseur

merci pour ces informations utiles.

Hors ligne

Pied de page des forums