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 :

PL/pgSQL : conflit entre variable et nom de colonne


Sujet :

PostgreSQL

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2003
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 23
    Points : 24
    Points
    24
    Par défaut PL/pgSQL : conflit entre variable et nom de colonne
    Je cherche de la documentation sur le conflit entre un nom

    Partons du code suivant, qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE OR REPLACE FUNCTION test_sur_insert(nom text) RETURNS integer AS $$
    DECLARE
      repid integer;
    BEGIN
     
    SELECT id INTO repid FROM compte WHERE compte.nom=nom;
     
    RETURN repid;
     
    END;
    $$ LANGUAGE plpgsql;
     
    select test_sur_insert('moi');
    Si j'oublie de préfixer la colonne nom en compte.nom, j'obtiens un résultat idiot : si le nom de colonne n'est pas préfixé, il est masqué par la variable nom.

    Par contre, cela ne marche plus

    Ca marche encore si j'essaye de faire la même chose dans la clause INTO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT compte.id INTO id FROM compte WHERE compte.nom=nom;
    C'est la cata par contre si j'essaye de passer une requête INSERT. Il plante sur les préfixes. Si j'essaye de protéger les noms de colonnes avec des guillemets, ca ne marche pas non plus.

    Y a-t-il un document qui référence la façon dont ces conflits sont gérés ? Et une solution pour la méthode INSERT ?

    Archeboc.

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Gie,

    Éviter d'utiliser un nom de colonne pour une variable ?

    Peut-être trop simplissime ?
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2003
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 23
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par droggo Voir le message
    Gie,

    Éviter d'utiliser un nom de colonne pour une variable ?

    Peut-être trop simplissime ?
    Non. trop compliqué.
    1- Cela signifie que je dois en permanence me souvenir dans ma fonction de tous les noms de colonnes que j'utilise.

    2- et puis cela ne me semble pas aberrant de donner aux variables le même nom que les colonnes où je vais les ranger : INSERT INTO compte(compte.nom) VALUES (nom) me semble une syntaxe naturelle et souhaitable.

    3- et puis j'aimerais bien comprendre la logique de la portée des noms de colonne et de variables dans les fonctions PL.

    Archeboc.

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Fie,
    Citation Envoyé par archeboc Voir le message
    Non. trop compliqué.
    1- Cela signifie que je dois en permanence me souvenir dans ma fonction de tous les noms de colonnes que j'utilise.

    2- et puis cela ne me semble pas aberrant de donner aux variables le même nom que les colonnes où je vais les ranger : INSERT INTO compte(compte.nom) VALUES (nom) me semble une syntaxe naturelle et souhaitable.

    3- et puis j'aimerais bien comprendre la logique de la portée des noms de colonne et de variables dans les fonctions PL.

    Archeboc.
    Pour une colonne s'appelant nom, est-il si compliqué d'utiliser une variable nom_.

    Tu te compliques la vie sous prétexte de soi-disant la simplifier.
    Si les cons volaient, il ferait nuit à midi.

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2003
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 23
    Points : 24
    Points
    24
    Par défaut
    Si dans les autres langages de programmation on pratique la notion de surcharge et de portée, je ne pense pas que ce soit pour se compliquer la vie. Depuis la défaite du GOTO, c'est toujours la même logique : on introduit des contraintes qui semblent lourdes et inutiles mais qui en réalité simplifie le travail de conception et la relecture du code.

    Citation Envoyé par archeboc Voir le message
    3- et puis j'aimerais bien comprendre la logique de la portée des noms de colonne et de variables dans les fonctions PL.
    Je maintiens mon interrogation.

    Archeboc.

  6. #6
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    de mon côté, je préfixe tjrs par un _...et ce ds n'importe quel langage.

    puis j'aimerais bien comprendre la logique de la portée des noms de colonne et de variables dans les fonctions PL.
    je vois pas quelle est la logique à comprendre...

    si je t'écris ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id INTO repid FROM compte WHERE nom=nom;
    hors context, est-tu capable de le lire, l'expliquer, etc...?

    ça paraît cohérent que le langage s'embrouille également, pas besoin de chercher midi à quatorze heures.
    Ils ne savaient pas que c'était impossible alors ils l'ont fait (Mark Twain)
    _ _ _ _ _ _ _ _ _

    La planète ne nous appartient pas, elle nous a été prêtée par nos enfants
    _ _ _ _ _ _ _ _ _

    Technos : Access, C++ Builder, SQL, PostgreSQL, Crystal Reports, XML entre autres

  7. #7
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    Si j'oublie de préfixer la colonne nom en compte.nom, j'obtiens un résultat idiot : si le nom de colonne n'est pas préfixé, il est masqué par la variable nom
    cela semble assez logique ici aussi :
    LOCAL en priorité...

    à mon sens, quel que soit le langage, la portée locale est tjrs prioritaire.
    Ils ne savaient pas que c'était impossible alors ils l'ont fait (Mark Twain)
    _ _ _ _ _ _ _ _ _

    La planète ne nous appartient pas, elle nous a été prêtée par nos enfants
    _ _ _ _ _ _ _ _ _

    Technos : Access, C++ Builder, SQL, PostgreSQL, Crystal Reports, XML entre autres

  8. #8
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 734
    Points
    1 734
    Par défaut
    Règle 1 : ne jamais préfixer les noms de colonnes (privilégier "nom" à "compte.nom")
    Règle 2 : utiliser des noms de variables différents des noms de colonnes existants
    Règle 3 : se référer aux règles 1 et 2
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

  9. #9
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    Citation Envoyé par scheu Voir le message
    Règle 1 : ne jamais préfixer les noms de colonnes (privilégier "nom" à "compte.nom")
    pourquoi?????
    une bonne raison? explication?

    Citation Envoyé par scheu Voir le message
    Règle 2 : utiliser des noms de variables différents des noms de colonnes existants
    +1
    Ils ne savaient pas que c'était impossible alors ils l'ont fait (Mark Twain)
    _ _ _ _ _ _ _ _ _

    La planète ne nous appartient pas, elle nous a été prêtée par nos enfants
    _ _ _ _ _ _ _ _ _

    Technos : Access, C++ Builder, SQL, PostgreSQL, Crystal Reports, XML entre autres

  10. #10
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 734
    Points
    1 734
    Par défaut
    Citation Envoyé par say Voir le message
    pourquoi?????
    une bonne raison? explication?
    ... j'oubliais de préciser "pour des requêtes ne portant que sur une seule table", personnellement je ne vois pas bien l'intérêt de préfixer les noms de colonnes par les noms des tables, ça complique la lisibilité. Enfin, c'est mon avis ...
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

  11. #11
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    Citation Envoyé par scheu Voir le message
    ... j'oubliais de préciser "pour des requêtes ne portant que sur une seule table", personnellement je ne vois pas bien l'intérêt de préfixer les noms de colonnes par les noms des tables, ça complique la lisibilité. Enfin, c'est mon avis ...

    ah ben vi !!!

    mais là, tu n'as pas d'argument
    Ils ne savaient pas que c'était impossible alors ils l'ont fait (Mark Twain)
    _ _ _ _ _ _ _ _ _

    La planète ne nous appartient pas, elle nous a été prêtée par nos enfants
    _ _ _ _ _ _ _ _ _

    Technos : Access, C++ Builder, SQL, PostgreSQL, Crystal Reports, XML entre autres

Discussions similaires

  1. [PDO] Variable et nom de colonne
    Par Invité dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 27/10/2012, 22h36
  2. Variables et nom de colonne dynamique
    Par lennelei dans le forum kettle/PDI
    Réponses: 3
    Dernier message: 23/01/2012, 14h03
  3. utilisation d'une variable comme nom de colonne
    Par argonath dans le forum Développement
    Réponses: 11
    Dernier message: 13/08/2010, 14h43
  4. Des variables comme nom de colonnes
    Par Chacha35 dans le forum Développement
    Réponses: 1
    Dernier message: 21/11/2009, 00h39
  5. Procédure stockee avec variable de nom de colonne
    Par nicolasj7777 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/11/2008, 15h43

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