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 :

Pb avec utilisation d'une requête dynamique


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 4
    Par défaut Pb avec utilisation d'une requête dynamique
    Bonjour à tous !
    Voilà je désire exécuter une requête dynamique ne retournant qu'un seul élément (et un seul enregistrement).

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    declare
          	LC$Requete varchar(256);
          begin
          	LC$Requete:='SELECT dkey from GED.BAIL_GED WHERE codimm=w_codimm and codbai=w_codbai';
          execute immediate LC$Requete into w_dkey;
          end;
    Ce code ne compile pas :
    Symbole "IMMEDIATE" rencontré à la place d'un des symboles suivants :
    := . ( @ % ;
    A noter :
    - les variables "w_dkey, w_codimm" et "w_codbai" ont été déclarées avant.
    - je travaille sous Oracle 9i (version censée supporter le SQl dynamique

    Est-ce que quelqu'un voit d'où ça peut venir ?
    Merci d'avance .

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Par défaut
    Oui, la 9i supporte le SQL dynamique, mais il ne faut pas faire n'importe quoi :
    1. Je ne pense pas que tu puisses faire suivre le "execute immediate" d'un "into" ==> il faut remonter le "into" dans le "select" : "SELECT dkey into w_dkey from ..."
    2. Tel que c'est codé, les variables w_codimm et w_codbai sont prises comme du texte, et par conséquent ne peuvent pas être évaluées.
    3. Je ne vois pas l'intérêt de faire du SQL dynamique dans ton cas, et plus généralement pour des ordres DML.

    Conclusion : Arrête le dynamique et remonte le "into" dans le "select", on verra après...

  3. #3
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Citation Envoyé par dgi77 Voir le message
    1. Je ne pense pas que tu puisses faire suivre le "execute immediate" d'un "into" ==> il faut remonter le "into" dans le "select" : "SELECT dkey into w_dkey from ..."
    Il existe bien une clause into pour execute immediate :
    http://sheikyerbouti.developpez.com/...mmediate/#L4.2

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Par défaut
    Autant pour moi.
    Dans ce cas, le problème doit venir des variables w_codimm et w_codbai qui ne sont pas interprétées. Le lien donné par plaineR montre aussi comment passer des variables de substitution dans du dynamique.
    Donc, on doit pouvoir le faire, mais ça me paraît bien compliqué, c'est vraiment histoire de dire qu'on a fait du dynamique...

  5. #5
    Futur Membre du Club
    Inscrit en
    Avril 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 4
    Par défaut
    Ok déjà merci beaucoup à vous 2.

    Alors oui effectivement je n'ai pas expliqué pourquoi je voulais faire du dynamique :
    En fait c'est par ce que la table GED.BAIL_GED n'existe pas toujours dans la base de données. Du coup si je reste en statique et que la table n'existe pas le programme ne compile pas !
    J'utilise donc du dynamique pour pouvoir mettre ma requête dans une chaîne de caractères (y compris le nom de ma table). De cette manière le compilateur ne prend pas en compte le nom de la table.

    Voilà j'espère que j'ai été assez clair.

    Sinon non je viens d'essayer ce nouveau code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    declare
          	LC$Requete varchar(256);
          begin
          	LC$Requete:='SELECT dkey from GED.BAIL_GED WHERE codimm='||w_codimm||' and codbai='||w_codbai||'';
          execute immediate LC$Requete into w_dkey;
          end;
    Et j'ai toujours la même erreur ! .

  6. #6
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 80
    Par défaut
    salut,
    si elle n'existe pas alors tu la crées au moment de la compile? Si c'est le cas le query "select into" marchera. L'important c'est que la table soit crée avant le query.
    fazo

Discussions similaires

  1. Utilisation de SUBSTR avec WHERE dans une requête SQL
    Par thipyt dans le forum Requêtes
    Réponses: 4
    Dernier message: 27/10/2016, 15h54
  2. Réponses: 0
    Dernier message: 09/11/2010, 12h44
  3. Utilisation de MAX avec String dans une requête SQL
    Par Sun03 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 30/04/2010, 12h22
  4. utilisation de insert or update : (une requête dynamique de mise à jour)
    Par demahom_INFO dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 22/10/2008, 17h45
  5. [FREETEXT][Sql2000] Utilisation dans une requête ?
    Par SoaB dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 18/10/2005, 14h49

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