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