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 Oracle Discussion :

bind variable et nom de table


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 115
    Points : 59
    Points
    59
    Par défaut bind variable et nom de table
    Bonjour,

    Savez-vous comment faire pour récupérer un nom de table dans une variable et utiliser cette variable dans la partie FROM d'une requête SQL.

    Je m'explique, mon nom de table change tous les mois et j'aimerais récupérer ce nom de table de façon automatique pour l'utiliser dans mes requêtes.

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    DEFINE ValAnnee = TO_CHAR(2008)
    VARIABLE ValMois VARCHAR2(2);
    VARIABLE ValPeriode VARCHAR2(6);
    VARIABLE TableTemp VARCHAR2(28);
     
    BEGIN
     IF sysdate BETWEEN TO_DATE('02/2008','mm/yyyy') AND TO_DATE('12/2008','mm/yyyy') THEN
       :ValMois := LPAD(TO_CHAR(ADD_MONTHS(sysdate,-1),'mm'),2,'0'); 
       :ValPeriode := TO_CHAR(&ValAnnee||:ValMois);
     ELSIF sysdate >= TO_DATE('01/2009','mm/yyyy') THEN
       :ValMois := '12'; 
       :ValPeriode := TO_CHAR(&ValAnnee||TO_CHAR(sysdate,'mm')+11);
     END IF;
     :TableTemp :=TO_CHAR('NomSchema.NomTable_'||SUBSTR(:ValPeriode,5,2));
     :ValMois := TO_NUMBER(:ValMois);
    END;
    /
     
    INSERT INTO AutreTable (champ1, champ2)
    SELECT champ1, champ2 FROM :TableTemp 
    WHERE WHERE annee=&ValAnnee AND periode=:ValPeriode;
    Pour simplifier,
    en mars 2008 je récupère '200802' pour ValPeriode, 2 pour ValMois et 'NomSchema.NomTable_02' pour la table ;
    en février 2009, j'aurais '200813', 12 et 'NomSchema.NomTable_13' ;
    en mai 2009, j'aurai '200816', 12 et 'NomSchema.NomTable_16'
    ... (et ainsi de suite).


    Lorsque je lance mon script (via un fichier .bat), j'obtiens le message d'erreur suivant : ORA-00903: nom de table non valide

    Avez-vous une idée pour que le nom de table récupéré soit valide ?

    Je vous remercie
    MarieO

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Ca marche pas
    La solution est SQL dynamique.
    Mais je me dit que ce problème est généré par une mauvais MCD, n'est pas vrai ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Points : 341
    Points
    341
    Par défaut
    Il faut faire du sql dynamique en utilisant execute immediate:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    declare 
     
    vsql varchar2(255);
     
    begin
    vsql:= 'INSERT INTO AutreTable (champ1, champ2) SELECT champ1, champ2 FROM' ||  :TableTemp || 'where .....';
     
    execute immediate (vsql);
    end;
    /

  4. #4
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 115
    Points : 59
    Points
    59
    Par défaut
    j'ai bien essayé de cette façon là, mais j'ai de nouveau un message d'erreur :
    ERREUR à la ligne 1 :
    ORA-00936: expression absente
    ORA-06512: à ligne 13

    Voici le code complet que je lance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    DEFINE ValAnnee = TO_CHAR(2007)
    DEFINE TableLots  = Schema.TableLots
    VARIABLE ValMois VARCHAR2(2);
    VARIABLE ValPeriode VARCHAR2(6);
    VARIABLE TableTemp VARCHAR2(28);
    VARIABLE iDateCalcul VARCHAR2(19);
     
     
    BEGIN
     IF sysdate BETWEEN TO_DATE('02/2007','mm/yyyy') AND TO_DATE('12/2007','mm/yyyy') THEN
       :ValMois := LPAD(TO_CHAR(ADD_MONTHS(sysdate,-1),'mm'),2,'0'); 
       :ValPeriode := TO_CHAR(&ValAnnee||:ValMois);
     ELSIF sysdate >= TO_DATE('01/2008','mm/yyyy') THEN
       :ValMois := '12'; 
       :ValPeriode := TO_CHAR(&ValAnnee||TO_CHAR(sysdate,'mm')+11);
     END IF;
     :TableTemp :=TO_CHAR('Schema.Table_'||SUBSTR(:ValPeriode,5,2));
     :ValMois := TO_NUMBER(:ValMois);
    END;
    /
     
    DECLARE vsql VARCHAR2(800);
    BEGIN
     vsql:= 'INSERT INTO &TableLots (champ1, champ2, ...) '|| 
      'SELECT champ1, champ2, ...'||
      'FROM '||:TableTemp||' WHERE annee = &ValAnnee AND periode = '||:ValPeriode;
     EXECUTE IMMEDIATE (vsql);
    END;
    /
    Je ne sais pas quelle taille maximum peut avoir un VARCHAR2(), mais je dois mettre au moins 500 caractères car ma requête est très longue.

    Merci beaucoup pour votre aide
    MarieO

  5. #5
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Sauf que maintenant t'est dans Pl/SQL il n'y plus de place pour des variables de substitution SQL*Plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ... &TableLots ...

  6. #6
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    pas de problème, SQL*Plus va substituer la variable pourvu que ce ne soit pas du PL/SQL stockée en base

  7. #7
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par orafrance Voir le message
    pas de problème, SQL*Plus va substituer la variable pourvu que ce ne soit pas du PL/SQL stockée en base
    Oooops!

  8. #8
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 115
    Points : 59
    Points
    59
    Par défaut
    merci pour vos réponses, mais j'ai tjs mon problème d'expression absente...
    je cherche encore.

    si vous avez des idées, elles sont les bienvenues.

    Merci beaucoup,

    MarieO

  9. #9
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    remplace le EXECUTE IMMEDIATE par un DBMS_OUTPUT.PUT_LINE pour débugger le script

  10. #10
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 115
    Points : 59
    Points
    59
    Par défaut
    Merci beaucoup,
    J'ai effectivement trouvé l'erreur !!!
    Dans mes champs à insérer, je récupérais une valeur NULL... et j'avais oublié de mettre ' ' autour d'un champ au format CHAR.

    MarieO

    Ce post est résolu.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/05/2014, 11h10
  2. Utiliser une variable comme nom de table Access dans une requête SQL
    Par stsym dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/10/2011, 17h11
  3. Réponses: 2
    Dernier message: 12/04/2011, 09h21
  4. variable comme nom de table
    Par battl14 dans le forum Développement
    Réponses: 4
    Dernier message: 29/01/2009, 10h22
  5. donner la valeur d'une variable comme nom de table
    Par cladsam dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 14/10/2005, 15h16

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