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

From: Alain Benard <alain(dot)benard(at)inrae(dot)fr>
To: Julien Rouhaud <rjuju123(at)gmail(dot)com>, Guillaume Lelarge <guillaume(at)lelarge(dot)info>
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-09 06:56:19
Message-ID: 1b6af5f40cb047758a22b8e319d3f30a@IDFDCPRIPEXMU06.inra.local
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

Bonjour à tous,
Guillaume a parfaitement ciblé le souci : postgres conserve le plan en mémoire durant la session (dommage qu'on n'ait pas la main pour forcer un recalcul).
Julien a solutionné le souci : en effet en transformant la requête (qui n'était pas fournie) il faut caster les sorties plutôt que les caster comme je le faisait au moment d'alimenter le recordset de sortie :
requete = format('SELECT cle::varchar, x::double precision, y::double precision FROM %I', nom_table);
De cette façon quelque soit le contexte le résultat de cette requête sera de type identique et le plan élaboré par PG restera applicable.
PS : le message d'erreur que j'avais indiqué n'est certes pas en anglais mais est bien issu de postgres lui-même : raise exception 'Erreur ps_genere_xy - %', sqlerrm;
Merci à vous 2. Problème réglé.
Alain.

-----Message d'origine-----
De : Julien Rouhaud <rjuju123(at)gmail(dot)com>
Envoyé : vendredi 9 septembre 2022 06:05
À : Guillaume Lelarge <guillaume(at)lelarge(dot)info>
Cc : Alain Benard <alain(dot)benard(at)inrae(dot)fr>; pgsql-fr-generale(at)postgresql(dot)org
Objet : Re: Bug exécution successive même procedure plpgsql

On Thu, Sep 08, 2022 at 10:25:30PM +0200, Guillaume Lelarge wrote:
>
> 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)
>
> 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.

J'imagine que la partie manquante dans la fonction ressemble à

requete = format('SELECT cle, x, y FROM %I', nom_table);

Et effectivement cela posera problème en cas de changement de type dans la relation source. Vous pouvez résoudre le problème en castant dans la requête et non lors de l'affectation, quelquechose comme:

requete = format('SELECT cle, x::double precision, y::double precision FROM %I', nom_table);

In response to

Browse pgsql-fr-generale by date

  From Date Subject
Next Message celati Laurent 2022-09-18 18:18:23 Postgresql/Postgis : Trigger pour historisation/versionnement
Previous Message Julien Rouhaud 2022-09-09 04:05:27 Re: Bug exécution successive même procedure plpgsql