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

Langage SQL Discussion :

Script avec variables SQL ?


Sujet :

Langage SQL

  1. #1
    Membre averti
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Par défaut Script avec variables SQL ?
    Bonjour,

    Je débute, et je souhaiterai savoir si l'on peu dans un requête SQL, insérer une variable qui serait le nom d'un champ ?
    Je m'explique. J'essaie pour me former de réaliser une petite application destinée à un service informatique.
    Cette dernière doit permettre de réceptionner les demandes d'intervention sur le logiciel ou le materiel .
    Pour simplifier, j'ai 4 tables :

    - tbl_dde (id_dde, dde_date, id_famille (FK --> tbl_famille.id_famille), id_outil (FK --> tbl_mat.id_mat ou tbl_log.id_log), ...)

    - tbl_famille (id_famille (FK --> tbl_dde.id_famille), famille_nom, famille_var)
    1 MATERIEL mat
    2 LOGICIEL log

    -tbl_mat (id_mat(FK --> tbl_dde.id_outil) mat_nom)
    1 UC
    2 ECRAN

    -tbl_log (id_log(FK --> tbl_dde.id_outil), log_nom)
    1 WORD
    2 EXCEL

    Si c'est possible, ce que je souhaiterai, c'est de ne réaliser qu'une seule requête sur les tables tbl_mat ou tbl_log (même structure).
    la finalité est d'afficher en fonction de la famille(id) le Materiel ou Logiciel faisant l'objet d'une demande.

    Il faudrait faire une jointure entre "id_dde.id_famille = id_famille.id_famille" pour récupérer "famille_var"
    et injecter le "famille_var" dans une requête pour récupérer tbl_log.log_nom ou tbl_mat.mat_nom :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT (famille_var + '_nom') 
    FROM ('tbl_' + famille_var) 
    WHERE tbl_dde.id_objet = ('tbl_' + famille.var).('id_' + famille.var)
    En exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT mat_nom 
    FROM tbl_mat 
    WHERE tbl_dde.id_objet = tbl_mat.id_mat
    Merci

  2. #2
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Par défaut
    Bonjour,
    Sauf erreur de ma part il te faudrait non pas une variable mais une sous requête... SQL n'est pas dynamique, les variables se gére par l'application.
    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  3. #3
    Membre averti
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Par défaut
    Merci de ta réponse Chtulus,

    Pour ce qui concerne les variables c'est OK.
    Il me reste donc à effectuer une sous requête qui me retournera ce que j'appelai "variable" c'est à dire dans le cas présent id_famille.famille_var.

    Peux tu me dire comment concaténer le résultat de ma sous_requête avec les éléments composant ma requête ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT (result_sous_requête + '_nom') 
    FROM ('tbl_' + result_sous_requête) 
    WHERE tbl_dde.id_objet = ('tbl_' + result_sous_requête).('id_' + result_sous_requête)
    Ma sous requête donnera pour résultat "log" ou "mat", ce qui devrait donner en final:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT mat_nom 
    FROM tbl_mat 
    WHERE tbl_dde.id_objet = tbl_mat.id_mat
    Merci

  4. #4
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Par défaut
    Cela dépend de ton SGBD mais la norme SQL est || (Cela fera plaisir à certains )
    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  5. #5
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    Vous compliquez votre problème a cause d'un mauvais schéma.

    si tbl_mat et tbl_log ont la même structure, pourquoi la dupliquer ??
    Créez une table équipement unique avec votre structure standard et une colonne qui typera votre équipement (Soft/Hard)

    Vos requêtes deviendront subitement beaucoup plus simples.

    Bon courage

  6. #6
    Membre averti
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Par défaut
    Bonjour Chtulus, bonjour Yanika_bzh,

    Je me suis mal exprimé, quand je parlais de "même structure" je voulais dire que :

    - toutes mes tables sont nommées de la même façon, c'est à dire avec le préfixe "tbl_"
    - il en est de même pour les index ou le préfixe est "id_" suivit du nom de la table
    - ainsi que pour le nom de l'élément qui est nommé avec le suffixe "_nom", précédé du nom que la table

    Exemple :
    tbl_log (id_log, log_nom)

    A part ces éléments, les autres champs des tables tbl_log et tbl_mat sont différents.

    Chtulus, mon projet repose sur MySql. Peux tu me me confirmer la syntaxe ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT (sous_requête) || '_nom' 
    FROM 'tbl_' || (sous_requête)
    WHERE tbl_dde.id_objet = 'tbl_' || (sous_requête).'id_' || (sous_requête)
    La sous requête devant retourner log ou mat

    Merci et Bonne journée

  7. #7
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Par défaut
    Bonjour,

    Sur MySQL, la synthaxe doit être hors norme (||)
    Il faut te lancer...

    En ce qui concerne ta requête proprement dite non plus d'ailleur, sans connaitre exactement tes sous-requêtes...
    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  8. #8
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    Si je ne me trompe pas, en MySQL, il faut utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CONCAT(string1, string2, ..., stringn)

  9. #9
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    Si vous voulez faire du SQL dynamique avec MySQL, il faut passer par les commandes préparées (Prepare, execute et deallocate prepare).

    Bon courage

  10. #10
    Membre averti
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Par défaut
    Merci de vos réponses.

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

Discussions similaires

  1. [11gR2] [Requête paramétrée] Fichier Script SQL avec variables
    Par Psuchoo dans le forum Sql*Plus
    Réponses: 6
    Dernier message: 26/04/2015, 21h45
  2. Appel script avec variable
    Par nico_17 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 15/09/2014, 16h57
  3. Script shell pour exécuter script sql avec variable
    Par Thibault69009 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 22/08/2014, 15h39
  4. Éxecution dynamique de script avec variables
    Par StripMat dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/06/2014, 10h17
  5. Réponses: 7
    Dernier message: 24/10/2011, 21h49

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