Bug exécution successive même procedure plpgsql

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.

Responses

Browse pgsql-fr-generale by date

  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