Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#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