Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 03/03/2013 08:56:19
- damalaan
- Membre
RESOLU - utilisation d'un curseur
Bonjour,
Pour m'apprendre à utiliser le PL/pgSQL, j'ai écrit cette fonction (qui présente peu d'intérêt en soi !) : le but est de parcourir la table tbl_analyse_ana et de récupérer le ana_id de chaque ligne puis de concaténer le résultat dans une variable de manière à avoir en sortie qqc du genre 1;2;3;4;5 etc.
Mais j'ai du louper qqc car la fonction ne génère pas d'erreur mais ne retourne rien
-- Function: test()
CREATE OR REPLACE FUNCTION test()
RETURNS TEXT AS
$BODY$
DECLARE
s RECORD;
s1 TEXT;
cur CURSOR FOR SELECT ana_id FROM tbl_analyse_ana;
BEGIN
open cur;
LOOP
FETCH cur INTO s;
s1 := s1 || ';' || s.ana_id || ';';
END LOOP;
CLOSE cur;
RETURN s1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION test()
OWNER TO postgres;
merci de votre aide
Dernière modification par damalaan (04/03/2013 16:42:59)
Hors ligne
#2 03/03/2013 12:36:23
- rjuju
- Administrateur
Re : RESOLU - utilisation d'un curseur
Bonjour,
tout d'abord votre variable s1 n'est pas initialisée. La concaténation d'un NULL avec une valeur renverra NULL. Vous pouvez soit utiliser coalesce soit l'initialiser avant. De plus, il n'y a pas de condition de sortie de votre boucle. Il faut rajouter un "EXIT WHEN NOT FOUND", ou remplacer votre curseur manuel par une boucle de type "FOR s IN SELECT ana_id FROM tbl_analyse_ana LOOP .... END LOOP".
Julien.
https://rjuju.github.io/
Hors ligne
#3 03/03/2013 21:35:36
- damalaan
- Membre
Re : RESOLU - utilisation d'un curseur
ok pour le "EXIT WHEN NOT FOUND".
par contre pour initialiser la variable, comment fait on?
Hors ligne
#4 03/03/2013 22:26:23
- rjuju
- Administrateur
Hors ligne
#5 04/03/2013 09:47:03
- damalaan
- Membre
Re : RESOLU - utilisation d'un curseur
J'ai ajouté la ligne EXIT WHEN NOT FOUND, j'ai initialisé s1.... et toujours rien
CREATE OR REPLACE FUNCTION test()
RETURNS text AS
$BODY$
DECLARE
s RECORD;
s1 TEXT := '';
cur CURSOR FOR SELECT ana_id FROM tbl_analyse_ana;
BEGIN
OPEN cur;
LOOP
FETCH cur INTO s;
s1 := s1 || ';' || s.ana_id || ';';
EXIT WHEN NOT FOUND;
END LOOP;
CLOSE cur;
RETURN s1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION test() OWNER TO postgres;
Hors ligne
#6 04/03/2013 16:34:29
- damalaan
- Membre
Re : RESOLU - utilisation d'un curseur
ça y est !!
-- Function: test()
DROP FUNCTION test();
CREATE OR REPLACE FUNCTION test()
RETURNS text AS
$BODY$
DECLARE
s RECORD;
s1 TEXT := '';
cur CURSOR FOR SELECT ana_id FROM tbl_analyse_ana ORDER BY ana_id;
BEGIN
OPEN cur;
LOOP
FETCH NEXT FROM cur INTO s;
EXIT WHEN NOT FOUND;
s1 := s1 || ';' || s.ana_id ;
END LOOP;
CLOSE cur;
RETURN s1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION test() OWNER TO postgres;
La condition de sortie de la boucle était mal placé : après concaténation au lieu d'avant !
Pourriez-vous m'indiquer un bon tuto sur le plpgSQL (à l'instar de celui ci pour plsql ftp://ftp-developpez.com/sheikyerbouti/ … l_sql.pdf)?
Hors ligne
#7 10/03/2013 23:58:41
- gleu
- Administrateur
Re : RESOLU - utilisation d'un curseur
Je n'en connais pas. La documentation est la référence mais ne constitue pas un tutoriel. Cependant, le langage est tellement simple que je ne vois pas un grand intérêt à l'écriture d'un tel tutoriel.
Guillaume.
Hors ligne
Pages : 1