PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#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".

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

Re : RESOLU - utilisation d'un curseur

s1 := ''; par exemple

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

Pied de page des forums