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

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 4
    Points : 2
    Points
    2
    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 confirmé
    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
    Points : 639
    Points
    639
    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...
    Des chercheurs qui cherchent, on en trouve, mais des chercheurs qui trouvent, on en cherche !

  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
    Points : 3 609
    Points
    3 609
    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
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  4. #4
    Membre confirmé
    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
    Points : 639
    Points
    639
    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...
    Des chercheurs qui cherchent, on en trouve, mais des chercheurs qui trouvent, on en cherche !

  5. #5
    Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 4
    Points : 2
    Points
    2
    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 du Club
    Inscrit en
    Août 2005
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 80
    Points : 56
    Points
    56
    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

  7. #7
    Membre habitué Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 196
    Points
    196
    Par défaut
    Je pense que le code serait plutôt ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    declare
              LC$Requete varchar(256);
          begin
              LC$Requete:='SELECT dkey from GED.BAIL_GED WHERE codimm=:1 and codbai=:2';
          execute immediate LC$Requete into w_dkey using w_codimm, w_codbai;
    ;
          end;
    tu peux avoir plus d'info ici : http://download.oracle.com/docs/cd/B...ent.htm#i33888

  8. #8
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Symbole "IMMEDIATE" rencontré à la place d'un des symboles suivants :
    := . ( @ % ;
    Toi t'es pas sous sqlplus, mais plutôt dans un programme en côté client comme Forms, non ?

    Edit 15h50 : Sous forms, c'est un autre message qui apparait : "Not supported ..."
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  9. #9
    Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Oui effectivement je suis sous Forms en version 6 (désolé de ne pas l'avoir dis plus tôt).
    Quand je cherche de l'aide sous Forms il ne connaît pas "execute immediate".
    Du coup là je ne sais pas trop comment faire...

    Loyd1974 j'ai essayé ta proposition de code, malheureusement ça ne fonctionne pas non plus et ce toujours avec la même erreur

  10. #10
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Ce n'est pas une fonction supportée côté client.

    Il faut que tu fasse une procédure basée que tu appelles depuis ta Forme
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  11. #11
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par Loyd1974 Voir le message
    Je pense que le code serait plutôt ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    declare
              LC$Requete varchar(256);
          begin
              LC$Requete:='SELECT dkey from GED.BAIL_GED WHERE codimm=:1 and codbai=:2';
          execute immediate LC$Requete into w_dkey using w_codimm, w_codbai;
    ;
          end;
    tu peux avoir plus d'info ici : http://download.oracle.com/docs/cd/B...ent.htm#i33888
    le using ici va chercher à interpréter des variables à binder.
    elles ne sont déclarées nulle part

    donc pour que ce code compile :
    - soit w_codimm, w_codbai sont des paramètres d'entrées IN de la procédure stockée
    - soit il faut les déclarer en tant que variables dans la section prévue à cet effet

    DECLARE
    w_codimm MyFormat:=Myvalue;
    w_codbai MyFormat:=MyValue;

    ..

    BEGIN

    ...

    END;

    @
    PpPool

  12. #12
    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
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par McM Voir le message
    Ce n'est pas une fonction supportée côté client.

    Il faut que tu fasse une procédure basée que tu appelles depuis ta Forme
    Ou que tu utilises le package exec_sql de forms ou encore plus simplement un bloc de données basé.
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  13. #13
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par plaineR Voir le message
    ou encore plus simplement un bloc de données basé.
    La table peut ne pas exister => Baser un bloc sur une table inexistante.. ça va pas compiler.
    S'il faut changer la table du bloc et faire un execute query juste pour un select, c'est lourd.

    Moi, j'ai la solution d'un package avec plusieurs function / proc qui suivant les types de retour permettent du sql_dynamique dynamique (suivant le nb de paramètres pour les binds).
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

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