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

PL/SQL Oracle Discussion :

PLSQL : Analyse syntaxe


Sujet :

PL/SQL Oracle

  1. #1
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut PLSQL : Analyse syntaxe
    J'ai besoin d'analyser des requetes SQL saisie par des utilisateurs (avertis)
    pour ensuite générer de manière dynamique ces requetes entre elles.

    8) Exemple :
    J'ai une table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Table Entete (
    C1 number(4),
    C2 varchar2(10),
    C3 char(5),
    C4 date
    )

    J'ai une requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    V_requete := 'Select C1,C2,C3,C4  from Entete';
    Existe t'il un package ORACLE permettant de faire l'analyse de "V_requete"
    a savoir :
    le nombre de colonne sélectionnés (Ici 4)
    le type et le nom des colonnes sélectionnées
    C1 number(4),
    C2 varchar2(10),
    C3 char(5),
    C4 date

    Le but de cette analyse est de générer un curseur "PL/SQL" à partir de "V_requete"
    Signé : Capitaine Jean-Luc Picard

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    pourquoi ne pas utiliser la vue all_tab_columns ?

  3. #3
    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
    Le package DBMS_SQL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dbms_sql.open_cursor;
    dbms_sql.parse();
    dbms_sql.execute();
    dbms_sql.describe_columns2();
    dbms_sql.close_cursor();
    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

  4. #4
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut
    V_requete est le resultat d'une saisie
    c'est juste un exemple , je ne sais absolument pas quel est le contenu de la requete . la seule chose que je connais : c'est le contenu d'un varchar2 ==> V_requete que je doit analyser et ensuite lancer pour recuperer les valeurs selectionnées . Ces valeures seront ensuite réutilisées pour générer d'autres "Requete SQL" elles meme analysées et lancées .

    PS : En ProC c'est possible avec les structures et fonctions fournies avec "SQLDA" mais je ne sait pas (Encore) comment réaliser la meme chose en PL/SQL
    Signé : Capitaine Jean-Luc Picard

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Tu peux très bien faire une boucle sur cette requête :

    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
    DECLARE
     
    TYPE t_ref_cursor IS REF CURSOR;
    list_values      t_ref_cursor;
    V_requete VARCHAR2(4000);
     
    mavaleur ???
     
    BEGIN
     
    V_requete := 'Select C1,C2,C3,C4  from Entete';
    OPEN list_values FOR V_requete;
     
    LOOP
    FETCH list_values INTO mavaleur;
    EXIT WHEN list_values%NOTFOUND;
     
    END LOOP;
    END;
    /
    ton probléme c'est que tu ne sais pas comment définir mavaleur, c'est bien ça ?

  6. #6
    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
    Orafrance il veut faire une analyse du parse de sa requête

    nombre de colonnes
    quel type
    etc...

    package DBMS_SQL quoi...
    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

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    non non, pas seulement : V_requete que je doit analyser et ensuite lancer pour recuperer les valeurs selectionnées

    c'est donc bien ce que je demande... je crois

  8. #8
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut
    Merci SheikYerbouti ... orafrance itoo !!!
    par contre j'ai rien trouvé dans la doc ORACLE sur "dbms_sql.describe_columns2" (2) ==> :


    et pour ceux que cela interesse !!! 8)

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    Set serveroutput on;
     
    declare
      curseur number;     /* Pointeur sur le Curseur Dynamique  */
      result number;      /* Resultat sur l'ordre de la requete (OK/KO) */
      nbr_col integer;    /* Nbre de colonne de la requete      */
      les_colonnes dbms_sql.desc_tab;  /* Structure donnant le descriptif des colonnes */
     
     
      procedure decrit_la_colonne(rec in dbms_sql.desc_rec) is
      begin
        dbms_output.put_line('-----------------------------------------------------------');
        dbms_output.put_line('col_type            =    ' || rec.col_type);
        dbms_output.put_line('col_maxlen          =    ' || rec.col_max_len);
        dbms_output.put_line('col_name            =    ' || rec.col_name);
        dbms_output.put_line('col_name_len        =    ' || rec.col_name_len);
        dbms_output.put_line('col_schema_name     =    ' || rec.col_schema_name);
        dbms_output.put_line('col_schema_name_len =    ' || rec.col_schema_name_len);
        dbms_output.put_line('col_precision       =    ' || rec.col_precision);
        dbms_output.put_line('col_scale           =    ' || rec.col_scale);
        dbms_output.put('col_null_ok         =    ');
     
        if (rec.col_null_ok) Then
               dbms_output.put_line('Oui'); 
        else    
               dbms_output.put_line('Non'); 
        end if;
      end;
     
    begin
      curseur := dbms_sql.open_cursor;
      dbms_sql.parse(curseur, 'select par_code,par_nom,par_lib,''OK'' TestOK , sysdate LA_DATE from par', dbms_sql.native);
      result := dbms_sql.execute(curseur);
      dbms_sql.describe_columns(curseur, nbr_col, les_colonnes);
     
      ----------------------------------------------------------------
      --   Je decrit les colonnes de ma requete
      ----------------------------------------------------------------
      For j in 1..nbr_col Loop
          decrit_la_colonne(les_colonnes(j));
      End Loop;
     
      dbms_sql.close_cursor(curseur);
    end;
    /
    Le resultat est le 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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    -----------------------------------------------------------
    col_type            =    2
    col_maxlen          =    22
    col_name            =    PAR_CODE
    col_name_len        =    8
    col_schema_name     =
    col_schema_name_len =    0
    col_precision       =    2
    col_scale           =    0
    col_null_ok         =    Non
    -----------------------------------------------------------
    col_type            =    1
    col_maxlen          =    12
    col_name            =    PAR_NOM
    col_name_len        =    7
    col_schema_name     =
    col_schema_name_len =    0
    col_precision       =    0
    col_scale           =    0
    col_null_ok         =    Non
    -----------------------------------------------------------
    col_type            =    1
    col_maxlen          =    40
    col_name            =    PAR_LIB
    col_name_len        =    7
    col_schema_name     =
    col_schema_name_len =    0
    col_precision       =    0
    col_scale           =    0
    col_null_ok         =    Oui
    -----------------------------------------------------------
    col_type            =    96
    col_maxlen          =    2
    col_name            =    TESTOK
    col_name_len        =    6
    col_schema_name     =
    col_schema_name_len =    0
    col_precision       =    0
    col_scale           =    0
    col_null_ok         =    Oui
    -----------------------------------------------------------
    col_type            =    12
    col_maxlen          =    7
    col_name            =    LA_DATE
    col_name_len        =    7
    col_schema_name     =
    col_schema_name_len =    0
    col_precision       =    0
    col_scale           =    0
    col_null_ok         =    Oui
     
    PL/SQL procedure successfully completed.
    Signé : Capitaine Jean-Luc Picard

  9. #9
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut
    Citation Envoyé par orafrance
    Tu peux très bien faire une boucle sur cette requête :

    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
    DECLARE
     
    TYPE t_ref_cursor IS REF CURSOR;
    list_values      t_ref_cursor;
    V_requete VARCHAR2(4000);
     
    mavaleur ???
     
    BEGIN
     
    V_requete := 'Select C1,C2,C3,C4  from Entete';
    OPEN list_values FOR V_requete;
     
    LOOP
    FETCH list_values INTO mavaleur;
    EXIT WHEN list_values%NOTFOUND;
     
    END LOOP;
    END;
    /
    ton probléme c'est que tu ne sais pas comment définir mavaleur, c'est bien ça ?
    Orafrance , je trouve ton idée interessante : mais justement comment declares tu "mavaleur"
    en list_values%ROWTYPE ??? ==> C'est possible ça ???
    Signé : Capitaine Jean-Luc Picard

  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 : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    bah je ne crois pas, et je suis bien embêté parce que je ne sais pas moi-même

  11. #11
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2003
    Messages : 412
    Points : 1 326
    Points
    1 326
    Par défaut
    Citation Envoyé par argoet
    Orafrance , je trouve ton idée interessante : mais justement comment declares tu "mavaleur"
    en list_values%ROWTYPE ??? ==> C'est possible ça ???
    Non c'est pas possible. Il faut que tu te construise la variable de "réception" avec un type de donnée précis.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    c'est bien ce que je pensais

  13. #13
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut
    Pendant que le sujet est encore chaud ...
    Kestion 1 : connaissez vous les différences entre dbms_sql.describe_columns2
    Et dbms_sql.describe_columns :

    Kestion 2 : Y a t'il une fct ou une Procedure dans dbms_sql qui fasse cette meme analyse sur la condition "where" :
    Signé : Capitaine Jean-Luc Picard

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    non, il n'y a pas sur la clause where... pour la différence, tout ce que je peux te dire c'est que j'ai jamais réussi à faire marché describe_columns , alors que describe_columns2 marche nickel

  15. #15
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 120
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par argoet
    Pendant que le sujet est encore chaud ...
    Kestion 1 : connaissez vous les différences entre dbms_sql.describe_columns2 et dbms_sql.describe_columns :
    Je remonte ce très vieux topic, car il vient de me servir.

    Donc, si tu utilises dbms_sql.describe_columns avec certaines requêtes, tu obtiens ce message d'erreur très explicite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ORA-06502: PL/SQL: numeric or value error: dbms_sql.describe_columns overflow, col_name_len=33. Use describe_columns2
    ORA-06512: at "SYS.DBMS_SYS_SQL", line 1569
    ORA-06512: at "SYS.DBMS_SQL", line 621
    ORA-06512: at line 62
    Donc a priori, mieux vaut utiliser dbms_sql.describe_columns2 . Je suppose que dbms_sql.describe_columns est l'implantation d'origine, et que les gens d'Oracle se sont rendus compte de ses faiblesses?

    Merci aux gens qui ont contribué à ce topic qui m'a bien aidé.

    Nico'

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    probablement... j'ai toujours utilisé le 2 pour ma part

  17. #17
    Nouveau Candidat au Club
    Inscrit en
    Avril 2007
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut votre solution d'ouvrir un curseur sur une chaine ne parche pa
    comment ca marche pour vous , open cur for chaine ca marche pa
    quelkun peut maidé

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

Discussions similaires

  1. [AC-2010] Analyse croisée SQL : erreur de syntaxe (opérateur absent)
    Par lptht dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 21/01/2015, 12h42
  2. Syntaxe Plsql ORACLE
    Par debutantjava38 dans le forum Débuter
    Réponses: 6
    Dernier message: 22/03/2010, 17h29
  3. Outil d'analyse statique du code PLSQL
    Par BREMARD dans le forum PL/SQL
    Réponses: 0
    Dernier message: 17/12/2008, 14h51
  4. [analyse de syntaxe] pour C et C++ sur Linux
    Par Madmac dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 10/07/2004, 06h37

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