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 :

sql dynamic : passage de parametre entre quotes


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 22
    Points
    22
    Par défaut sql dynamic : passage de parametre entre quotes
    bonjour,

    je travaille en oracle 8i et je desire construire une requete dynamic en passant des parametres qui peuvent etre des caracateres ou des nombres.

    voici un bout de mon code , il se trouve dans une procedure stockee.
    je dois extraire à partir de plusieurs tables ( 5 en tout ) des informations que je dois integrer dans plusieurs autres tables. ceci uniquement en mode creation.
    et donc pour eviter les exceptions, je dois verifier pour chaque FETCH si j'ai deja inserer ces elements dans mes nouvelles tables.
    je me sers des champs du FETCH que je passe dans ma requete dynamic.

    et si je n'ai pas sql@found je passe en insertion.



    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
     
    Sql_Smt := 'select count(*) from vdi_vet_grille where cod_dip :=1 and cod_vrs_vdi :=2 and cod_etp :=3 and cod_vrs_vet :=4 and cod_ann :=5';
    .....
    FETCH ....
    LOOP
    ....
    BEGIN
                   EXECUTE IMMEDIATE Sql_Smt
                      USING Rec_Vdi.Cod_Dip, Rec_Vdi.Cod_Vrs_Vdi, Rec_Vet.Cod_Etp, Rec_Vet.Cod_Vrs_Vet, Cod_Ann;
                EXCEPTION
                   WHEN OTHERS THEN
                      Dbms_Output.Put_Line('Pb traitement : ' || SQLCODE || ' ' ||
                                           SQLERRM);
                END;
    if sql@notfound then
    end if;
    ....
    FETCH ....
    END LOOP
    la boucle se fait correctement, mais j'ai un message d'erreur
    -920 ORA-00920: Opérateur relationnel non valide
    je pense que cela vient du fait que je ne met pas entre quote les variables passees en parametre dans la requete dynamic.

    j'espere avoir ete clair.

    ou si vous avez un autre solution pour realiser ce traitement, n'hesitez pas je suis preneur.

    merci d'avance pour vos reponses.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 87
    Points : 78
    Points
    78
    Par défaut
    bonjour,

    avec des fonctions pl/sql tu ressouds facilement ton problème

    Tu intègre ton select dans une fonction qui te renvoie (-1 erreur,0 pas de ligne,1 au moins une ligne)
    Dans ton traitement tu tests le retour de la fonction et tu fais ton insertion au besoin ( retour 0)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 22
    Points
    22
    Par défaut
    mais est-ce que cela ne deporte pas le pb

    dans ma fonction , j'aurais tjrs ma requete dynamic qu'il faudra que j'initialise avec des variables.

    comment mettre ces variables entre quotes ?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 87
    Points : 78
    Points
    78
    Par défaut
    Tu passes tes variables en argument IN de ta fonction et tu n'as plus de problème

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 22
    Points
    22
    Par défaut
    je vais essayer, je te tiens au courant

    merci

  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
    le probléme est très simple dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'select count(*) from vdi_vet_grille where cod_dip :=1 and cod_vrs_vdi :=2 and cod_etp :=3 and cod_vrs_vet :=4 and cod_ann :=5';
    il faut remplacer les := par des = tout simplement.

    Il est essentiel lorsqu'on fait du SQL dynamique et même du PL/SQL de vérifier que les requêtes sont correctes et passent sous SQL*Plus

  7. #7
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    En fait, s'il s'agit de variables de remplacement valorisées via la clause USING, la syntaxe est colonne = :1
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  8. #8
    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
    oui, c'est donc = et non :=

    d'où = :n° position

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 22
    Points
    22
    Par défaut
    donc si je veux utiliser USING dans une requete dynamic, comment dois-je faire pour passer une variable de type varchar2.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    lib varchar2(20) := "TEST DE LIBELLE";
    sqlsmt := 'select * from table where libelle :=1';
    execute immediate sqlsmt using lib;
    je veux que dans le tampon du slqsmt on ait :
    select * from table where libelle = 'TEST DE LIBELLE'
    dois-je mettre libelle =1 ou libelle :=1


    merci

  10. #10
    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
    libelle = :1

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 22
    Points
    22
    Par défaut
    j'ai teste le code suivant

    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
     
    SQL> declare
      2  sqlsmt varchar2(2000);
      3  libelle varchar2(60);
      4  begin
      5  select lib_ann into libelle from annee_grille where cod_ann = '2004';
      6  dbms_output.put_line('libelle :'||libelle);
      7  sqlsmt := 'select * from annee_grille where lib_ann = :1';
      8  execute immediate sqlsmt
      9  using libelle;
     10  if sql%notfound then
     11  dbms_output.put_line('pas de selection');
     12  end if;
     13  dbms_output.put_line('nbr enreg :'||sql%rowcount);
     14  exception
     15  when others then
     16  dbms_output.put_line('fin : '||sqlcode||' '||sqlerrm);
     17  end;
     18  /
    libelle :annee universitaire 2004/2005
    pas de selection
    nbr enreg :0
     
    Procédure PL/SQL terminée avec succès.
     
    SQL> select * from annee_grille where lib_ann = 'annee universitaire 2004/2005';
     
    COD_ LIB_ANN                                  T DAT_CRE_
    ---- ---------------------------------------- - --------
    2004 annee universitaire 2004/2005            O 24/05/04
    je selectionne dans la table annee_grille le libelle correspondant à l'annee 2004 puis je passe en parametre ce libelle dans ma requete dynamic.
    :

  12. #12
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    7 sqlsmt := 'select * from annee_grille where lib_ann = :1';
    8 execute immediate sqlsmt
    9 using libelle;
    Ce n'est pas comme cela que ça fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Declare
    ... 
    LR$Rec   annee_grille%rowtype ;
    ...
    Begin
      execute immediate sqlsmt into LR$Rec using libelle ;
      dbms_output.put_line( LR$Rec.lib_ann ) ;
    ...
    End ;
    mais là, vous ne pouvez gérer qu'une ligne.

    sinon, utilisez un curseur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Declare
      TYPE TCUR is REF CURSOR ;
      cur  TCUR;
    ...
    Begin
    Open cur For sqlsmt ;
    Loop
      Fetch sqlsmt into LR$Rec ;
      exit when sqlmst%NOT_FOUND ;
      dbms_output.put_line( LR$Rec...... ) ;
    End loop ;
    End ;

    Au besoin, consultez l'article sur le SQL dynamique natif dans les tutoriels de la section SGBD (Oracle)
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 47
    Points : 22
    Points
    22
    Par défaut
    ok
    a chaque select en pl/sql il faut le mot cle INTO meme si on s'en sert de verification.

    merci de votre patience à tous les 2

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

Discussions similaires

  1. Passage de parametres entre webcontroles
    Par C_C dans le forum SharePoint
    Réponses: 1
    Dernier message: 26/05/2007, 09h34
  2. Réponses: 2
    Dernier message: 23/06/2006, 21h45
  3. Passage de parametre entre deux formulaires
    Par Rcanada dans le forum Access
    Réponses: 3
    Dernier message: 28/04/2006, 11h05
  4. [C#] Passage de paramètre entre forms
    Par farfadet dans le forum ASP.NET
    Réponses: 2
    Dernier message: 13/02/2006, 14h36
  5. passage de parametre entre deux page asp
    Par tomtom25 dans le forum ASP
    Réponses: 4
    Dernier message: 01/04/2005, 16h16

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