Re: Bug exécution successive même procedure plpgsql

From: Guillaume Lelarge <guillaume(at)lelarge(dot)info>
To: Alain Benard <alain(dot)benard(at)inrae(dot)fr>
Cc: "pgsql-fr-generale(at)postgresql(dot)org" <pgsql-fr-generale(at)postgresql(dot)org>
Subject: Re: Bug exécution successive même procedure plpgsql
Date: 2022-09-08 20:25:30
Message-ID: CAECtzeVmzaj+piZ7ftRUt-_c29QfXMvSXW0jd8ZP4WFjbR=9WQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

Bonsoir,

Le jeu. 8 sept. 2022 à 14:33, Alain Benard <alain(dot)benard(at)inrae(dot)fr> a écrit :

> 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).
>

Les plans des routines PL/pgsql sont conservés en mémoire par la session,
c'est peut être cela qui entre en jeu ici. Cela peut être autre chose. Sans
exemple concret et complet (et un message d'erreur en anglais), difficile
d'en dire plus.

--
Guillaume.

In response to

Responses

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Julien Rouhaud 2022-09-09 04:05:27 Re: Bug exécution successive même procedure plpgsql
Previous Message Alain Benard 2022-09-08 12:24:30 Bug exécution successive même procedure plpgsql