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

SQL Firebird Discussion :

Utilisation d'une variable dans le WHERE d'une requête


Sujet :

SQL Firebird

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 50
    Points : 32
    Points
    32
    Par défaut Utilisation d'une variable dans le WHERE d'une requête
    Bonjour,

    Je suis en train de créer une procédure stockée sous Firebird 1.5.

    Je récupère le nom d'une table que je stocke dans une variable (:NOM_TABLE). Je récupère également le nom de la clé en passant par les tables RDB$INDICES et RDB$INDEX_SEGMENTS.

    Maintenant je voudrais utiliser ces variables dans une requête pour avoir la valeur de la clé de la table trouvée :

    SELECT :NOM_CLE FROM :NOM_TABLE INTO :VALEUR_CLE

    Cette requête ne semble pas fonctionner, il y a une erreur au niveau du FROM.

    Avez-vous une solution pour utiliser une variable dans une requête ?

    Merci

  2. #2
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 911
    Points : 6 032
    Points
    6 032
    Par défaut
    La syntaxe du select est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT [TRANSACTION transaction]
    [DISTINCT | ALL]
    {* | <val> [, <val> …]}
    [INTO : var [, : var …]]
    FROM <tableref> [, <tableref> …]
    [WHERE <search_condition>]


    INTO avant le FROM
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 50
    Points : 32
    Points
    32
    Par défaut
    le but principal de ma question est donc :
    est ce que <val> et <tableref> peuvent être des variables (du style :var) ?

  4. #4
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 911
    Points : 6 032
    Points
    6 032
    Par défaut
    Of course !

    Ce système permet de parser n'importe quoi, et dès lors que la requète finale est syntaxiquement et fonctionnellement correcte, il ne devrait pas y avoir de problème.

    Le parse doit arriver au même résultat que si tu construisais dynamiquement ta requète genre (sous delphi)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaQuery:='SELECT '+MaColonne+' FROM '+MaTable;
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 50
    Points : 32
    Points
    32
    Par défaut
    Je ne comprend pas bien ta réponse.

    Quand je fais une requête du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT :NOM_INDEX FROM :NOM_TABLE;
    Il me dit à compilation de ma procédure qu'il y a une erreur au niveau de :NOM_TABLE avec les ":". J'enlève donc les ":" mais après il ne connais pas la table NOM_TABLE.

    J'ai également des problèmes au niveau du :NOM_INDEX. Je l'ai déclaré en temps que VARCHAR(30). Quand je debugge ma procedure, il remplace bien la valeur de la variable mais avec plein de blancs derrière. J'ai donc fait un TRIM(:NOM_INDEX) mais cela ne lui plait pas non plus.

  6. #6
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 911
    Points : 6 032
    Points
    6 032
    Par défaut
    Tu développes avec quel outil ?
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 50
    Points : 32
    Points
    32
    Par défaut
    je développe ma procedure stockée sous EMS Interbase/Firebird Manager.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Juin 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 23
    Points : 28
    Points
    28
    Par défaut
    Ca fait longtemps que je n'ai pas toché à interbase, mais si je me souviens bien, voilà ce que l'on peut te répondre:

    on ne peut pas utiliser de variable en lieu et place d'un nom de table ou d'un nom de colonne dans une requete SQL dynamique.

    On peut seulement y remplacer la valeur d'une constante par le nom d'une variable.

    Ainsi je peux écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     SELECT nom, prenom FROM personnes WHERE age < :max_age
    au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     SELECT nom, prenom FROM personnes WHERE age < 200
    Mais je ne peux pas par contre écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     SELECT :col_A, :col_B FROM :table_E WHERE age < 200
    La solution proposée par qi130 est gérer le problème au moment de l'écriture de la requête, en concaténant les morceaux de requête adéquats:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    " SELECT " + col_A + " , " + col_B + " FROM " + table_E + " WHERE age < 200 "
    Mais cette solution n'est pas adaptée à l'écriture d'une procédure stockée qui exige de connaitre la requête au moment de la création de la procédure, et non au moment de son exécution.

    Il faut donc trouver une autre solution pour ton problème :

    - écrire toutes les requètes possible et sélectionner la bonne à l'exécution
    - écrire une fonction utilsateur en C et concaténer le texte de la requete au moment de l'exécution de la fonction ( exécuter la requête par un appel SQL depuis le C ! )
    - faire autrement.

  9. #9
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    On ne peut faire des les PS et trigger des requetes dynamiques (créés à la vollées).

    En fait les requetes sont compilées ds la PS, ce qui augmente la vitesse d'exécution de celle ci.

    Cependant dans fb1.5 il est maintenant possible de créer et d'interpréter une requete dynamique.

    La commande est execute statement.

    Cependant elle a de nombreuses limites en plus (des problemes connue du au requetes dynamique (moins performantes, plus difficile a optimiser et gérer (maintenance)).

    On peut faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for execute statement MaChaine into :mavar1, :marvar2 do
    ....
    On voit bien là la limite ce qui est dynamique se sont les noms des colonnes, le nom des tables mais il faudra qu'au final le résultat ait le même nombre de colonne que de variables INTO et de même type (ou transtypable).

    Voilà donc celà peux dépanner. Mais pour les cas vraiment dynamique et complexe, soit il faut revoir la conception de la base soit le faire depuis un programme client.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 50
    Points : 32
    Points
    32
    Par défaut
    Merci à vous , vous m'avez compris 8)

    Je vais voir avec "execute statement" sinon je vais me rabattre vers un programme client.

    Le "EXECUTE STATEMENT" fonctionne bien sauf que mon éditeur me met une erreur au niveau du "INTO" après. Ca passe quand même.

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

Discussions similaires

  1. insérer une variable dans le nom d'une variable
    Par leninelenine dans le forum Général Python
    Réponses: 11
    Dernier message: 28/05/2015, 08h25
  2. [2012] Utiliser une variable dans un WHERE différent
    Par CrasherSEP dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/07/2013, 15h27
  3. Réponses: 2
    Dernier message: 27/07/2011, 14h31
  4. Mettre une variable dans l'appel d'une variable de session
    Par PrinceMaster77 dans le forum Langage
    Réponses: 2
    Dernier message: 13/04/2011, 10h12
  5. Réponses: 2
    Dernier message: 16/11/2006, 13h28

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