IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

ERREUR - "le plan en cache ne doit pas modifier le type en résultat" [9.2]


Sujet :

PostgreSQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 20
    Points : 16
    Points
    16
    Par défaut ERREUR - "le plan en cache ne doit pas modifier le type en résultat"
    Bonjour à tous ,

    Je travaille avec Delphi Xe2, couplé des composants AnyDac qui me permettent une liaison native avec PostGreSQL 9.3.

    Depuis quelques temps, j'ai cette erreur en faisant appel à une procédure stockée :

    EPgNativeException avec le message '[AnyDAC][Phys][PG][libpq] ERREUR: le plan en cache ne doit pas modifier le type en résultat'.
    ou
    cached plan must not change result type
    selon la langue de la base.

    Je n'ai fait aucune modification de la procédure depuis plusieurs mois, et elle fonctionnait très bien.

    J'ai modifié le type de deux champs en base, mais ma procédure ne les lit pas, et les renvoie encore moins.
    Lorsque je fais des "Raise Log", je vois que la procédure s’exécute en entier sans problème etfichier pg_hba.conf depuis j'ai redémarré les configs, le service, le pc, et bien sûr recompilé l'application et relancé plusieurs fois.
    J'ai aussi lancé un vacuum après avoir lu que cela pouvait résoudre mon problème... sans succès bien sûr.

    Aujourd'hui je n'ai plus d'idées , alors je compte sur les vôtres.

    Merci d'avance !

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    J'ai un petit peu avancé dans mes recherches.

    Ma procédure 1 appelle une procédure 2.
    Lorsque j’enlève cet appel, le programme fonctionne.

    Ma procédure 2 crée des tables temporaires. Lorsque j'enlève ces tables, cela fonctionne.
    Seulement j'ai besoin de ces tables.

    create LOCAL temporary table IF NOT EXISTS MATABLE(
    id integer
    ) /*on commit drop*/;
    Avec on sans le on commit, le programme plante.

    J'ai lu sur différents topics que ces tables "temporary" étaient détruites à la fin de la transaction. Je pense que le problème vient de là, lors du drop, mais je ne sais pas pourquoi.
    Comme expliqué dans le programme ci-dessus, cela a déjà fonctionné auparavant. Je ne sais pas ce qui c'est passé.

    En espérant que cela va vous permettre de me donner une réponse,

    merci d'avance

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Et si vous bougez la création des tables temporaires dans la proc 1, ça plante toujours ?

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 739
    Points : 52 451
    Points
    52 451
    Billets dans le blog
    5
    Par défaut
    Le fait de créer des tables temporaires invalide le cache et la procédure est recompilée. En effet le mélange de DDL (create, alter, drop...) interdit la compilation puisque la compilation se base sur une syntaxe avec des objets existants. Dès lorsqu'un objet est créé dynamiquement, le compilateur n'a pas d'autre choix que de s'arrêter avant la commande DDL et recommencer la compilation après l'exécution de l'ordre DDL.
    Voyez si en plaçant la création de vos tables temporaires avant tout autre code (donc dans la 1ere procédure), cela ira mieux.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    Ah OK ! Je comprends mieux maintenant.

    Pour ma part j'ai résolu le problème en remplaçant les par des Cela fonctionne, mes tables sont créées une fois et jamais détruites.
    Je fais ensuite des truncate dessus à chaque nouvel appel de procédure.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Toutes versions] Erreur de compilation dans module caché
    Par fransky dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 06/01/2010, 13h20
  2. Réponses: 4
    Dernier message: 29/08/2009, 12h44
  3. Réponses: 2
    Dernier message: 12/03/2009, 14h29
  4. [VBA-E] vérification des erreurs d'arrière plan
    Par WagaSeb dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/02/2007, 14h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo