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 05/02/2010 10:52:00

sophonie
Membre

Transformation de type d'une expression sous PL/pgSQL

Bonjour à toutes, et à tous,

Je continue mon extrapolation du langage de procédure de PostgreSQL.
Le but de cet exercice (purement pédagogique) est de récupérer l'ensemble des records
du champ d'une table et de les stocker dans le champ d'une autre table.
J'utilise donc un curseur pour "balayer" tous les tuples, voici mon code

CREATE OR REPLACE FUNCTION stockerLesValeurs() RETURNS INTEGER AS
$$
DECLARE
	c_table CURSOR FOR SELECT resultat FROM multiplication;
	val table3.num3%TYPE;
BEGIN
	FOR val IN c_table LOOP
	 INSERT INTO table3(num3) VALUES(val);
	END LOOP;
	RETURN val;
END;
$$ LANGUAGE plpgsql;

Sous psql, j'ai le message suivant dès que j'invoque la fonction stockerLesValeurs()

initiation=# SELECT * FROM stockerlesvaleurs();
ERREUR:  la colonne « num3 » est de type integer mais l'expression est de type record
LIGNE 1 : INSERT INTO table3(num3) VALUES( $1 )
                                           ^
ASTUCE : Vous devez réécrire l'expression ou lui appliquer une transformation de type.
REQUÊTE : INSERT INTO table3(num3) VALUES( $1 )
CONTEXTE : PL/pgSQL function "stockerlesvaleurs" line 6 at instruction SQL

Je comprends bien qu'il s'agit d'un problème de conversion de type, par contre appliquer une transformation de type à l'expression. Comment procéder à cette opération?

Merci d'avance pour votre aide.
Sophonie.

Dernière modification par sophonie (06/02/2010 10:52:47)

Hors ligne

#2 05/02/2010 13:07:30

sophonie
Membre

Re : Transformation de type d'une expression sous PL/pgSQL

Résolu.

En fait, la variable val déclarée dans la boucle FOR est automatiquement définie avec le type record,
[et existe seulement dans la boucle].
La colonne devant récupérer cette valeur (num3) est de type integer. Donc il faut modifier l'expression

INSERT INTO table3(num3) VALUES(val);

pour que la valeur à l'intérieur de VALUES() puisse être une donnée de type integer.

Ainsi il faut écrire

INSERT INTO table3(num3) VALUES(val.resultat);

resultat étant le nom de la colonne de la table multiplication.

En souhaitant que ce post puisse servir à d'autres.

Bonne journée.
Sophonie.

Hors ligne

Pied de page des forums