From: | Alain Benard <alain(dot)benard(at)inrae(dot)fr> |
---|---|
To: | "pgsql-fr-generale(at)postgresql(dot)org" <pgsql-fr-generale(at)postgresql(dot)org> |
Subject: | Bug exécution successive même procedure plpgsql |
Date: | 2022-09-08 12:24:30 |
Message-ID: | 9c78ac30ef364d6692446ce5656c94fd@IDFDCPRIPEXMU06.inra.local |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-fr-generale |
Bonjour,
Je suis devant un problème qui me dépasse lorsque j'exécute plusieurs fois une même procédure stockée avec des arguments différents en me retournant un message tel que le suivant :
Erreur maprocedure - le type de paramètre 12 (double precision) ne correspond pas à celui préparé dans le plan (integer)
La partie déclarative :
Cette procédure prend 2 arguments et retourne setof record avec 3 colonnes :
CREATE OR REPLACE FUNCTION public.ps_genere_xy (
nom_table varchar,
type_geometrie varchar,
out cle varchar,
out x double precision,
out y double precision
)
RETURNS SETOF record AS
$body$
DECLARE
curs_xy refcursor; -- Curseur recevant les informations XY
rec_xy record; -- Enregistrement contenant la ligne (champ) en cours de traitement
requete varchar; -- Chaine pour la construction des requetes
Le code qui produit les lignes est globalement :
open curs_xy FOR EXECUTE(requete) ;
LOOP
FETCH curs_xy into rec_xy;
if found then
cle = rec_xy.cle::varchar;
x = rec_xy.x::DOUBLE PRECISION;
y = rec_xy.y::DOUBLE PRECISION;
return next;
ELSE
exit;
end if;
end loop;
En fonction des arguments d'appel de la fonction rec_xy.x et rec_xy.y retournent des integer ou des double ce qui explique que je caste en double precision.
Voici le cas nominal :
select (ps_genere_xy('geo_vecteur_lahardt','point' )).*; -- nous sommes dans un cas où les x,y retournés sont des double
select (ps_genere_xy('geo_raster_france_8km_safran','raster' )).*; -- nous sommes dans un cas où les x,y retournés sont des integer
Je ne peux exécuter ces 2 instructions l'une derrière l'autre (sauf si je ferme et réouvre la connexion). C'est comme si il y avait une mémorisation du plan qui bloque sur un type de données intermédiaire. Naturellement si j'inverse lo'rdre d'appel de ces 2 instruction le message surligné en leu au début de message deviens : le type de paramètre 12 (integer) ne correspond pas à celui préparé dans le plan (double precision)
Comment puis-je m'en sortir ? Peut-on forcer postgres à ne pas conserver quelque chose qui n'a pas lieu d'être ? Une autre façon de procéder (sachant que ce serait pénalisant de devoir connaître à l'avance le type retourné et ne pas caster).
Merci par avance.
Alain.
From | Date | Subject | |
---|---|---|---|
Next Message | Guillaume Lelarge | 2022-09-08 20:25:30 | Re: Bug exécution successive même procedure plpgsql |
Previous Message | Guillaume Lelarge | 2022-08-04 12:46:53 | Relecture de la traduction du manuel de PostgreSQL |