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

JDBC Java Discussion :

[JDBC][SQL] Parser une requête SQL


Sujet :

JDBC Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    Points : 120
    Points
    120
    Par défaut [JDBC][SQL] Parser une requête SQL
    Je souhaiterais analyser une requêtes sql, et obtenir le nombre de champs retournés par celle ci...

    Par exemple:
    select chp1, chp2, decode (chp3, 0, 1), chp4 from matable;

    retourne : 4

    Comme mon application est une interface pour remplir un fichier de configuration, je ne me connecte pas à la base de donnée...
    En effet, je connais les méthodes avec ParameterGetMetaData ou resultSetMetaData, mais pour les utiliser il faut une connection...
    Quelqu'un connait t'il une classe ou une méthode qui me permettrai d'arriver a mes fins sans devoir établir de connection a une base?

    Merci d'avance!
    La naissance est le seul fruit du hasard

  2. #2
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    ben tu peu faire un sudstring de "select" a "from", et compter le nombre de virgule qui sont pas entre parenthese et tu rajoute 1
    C'est pas tres propre mais ca devrai marcher
    "vaste programme"

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    Points : 120
    Points
    120
    Par défaut
    Ben j'avais pensé a ca...mais le problème c'est qu'on tire un peu dans les coins...
    Par exemple, si j'ai:

    select chp1, chp2, decode(chp3,0,1) from matable...
    Ben la ca me retourne 5 au lieu de 3....donc pas possible...
    Et s'il faut que je crée des cas particulierS....y en a tellement en sql que j'ai pas fini...
    Mais merci quand même pour ta réponse...
    La naissance est le seul fruit du hasard

  4. #4
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    oui mai si tu enleve tous les bous de string entre parenthese ? de maniere a avoir : "chp1, chp2, decode, chp4"
    "vaste programme"

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    Points : 120
    Points
    120
    Par défaut
    Bah ca pourrai être une solution...mais j'ai peur d'avoir des surprises au vu des requetes qu'on utilise...
    J'espère trouver un parseur sql qui fonctionne bien...histoire de ne rien raté!
    Mais c'est une bonne idée...
    La naissance est le seul fruit du hasard

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par tomca
    J'espère trouver un parseur sql qui fonctionne bien...histoire de ne rien raté!
    google java parser sql
    ou
    yahoo java parser sql

    Il me semble que cela donne de bon résultat... non ?

    a++

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    Points : 120
    Points
    120
    Par défaut
    Ben j'avais essayé ca...
    Mais j'ai pas trouvé mon bonheur...souvent il existe des choses pour faire ca, mais qui sont propriétaires....Je me demandais juste s'il n'existait pas un moyen de faire ca simplement avec des librairies de bases, ou si quelqu'un connait un parser SQL qui fonctionne bien...
    La naissance est le seul fruit du hasard

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    Points : 120
    Points
    120
    Par défaut
    Bon, est bien j'ai essayé de mettre en place la solution proposée par BainE....mais c'est la galère:
    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
     
     
    String req = jt_req_sqlTT.getText().replaceAll("\n"," ");
    			String[] tab=req.split(" ");
    			String new_str="";
    			boolean mutex=false;
    			for(int i=0; i<tab.length;i++){
    				if(tab[i].equals("select")){
    					mutex=true;
    				}
    				if(tab[i].equals("from")){
    					mutex=false;
    				}
    				if(mutex){
    					if(!tab[i].equals("select")){
    						new_str+=tab[i]+" ";
    					}
    				}
    			}
    			System.out.println("Voila "+tab.length+" -- "+new_str);
     
    			String clean_str=new_str.replaceAll("\\([^\\)]*\\)","");
    			System.out.println("Voila "+clean_str);
    Ca fonctionne pour des requêtes simples...mais dès qu'on attaque des requetes comme par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select 
      rownum id_temps, 
      1997+trunc((rownum-1)/12) annee, 
      decode(mod(rownum-1, 12), 0, 1, 1, 1, 2, 1, 3, 1, 4, 1, 5, 1, 2) semestre,
      decode(mod(rownum-1, 12), 0, 1, 1, 1, 2, 1, 3, 2, 4, 2, 5, 2, 6, 3, 7, 3, 8, 3, 4) trimestre,
      1+mod(rownum-1, 12) mois
    from all_objects
    where rownum <= :nbmois
    Ben ca marche plus...(a cause de l'imbrication de parenthèses...)
    Et puis ca fais vraiment usine a gaz...
    J'ai regardé sur google, etc ce qui existe... (avant même qu'AdiGuba trouve nécessaire de m'en faire la remarque... ) mais je n'y ai trouvé que des classes permettant de parser le sql en shareware...ou bien sans doc...
    Donc si quelqu'un a une piste, merci d'avance...
    La naissance est le seul fruit du hasard

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    Points : 120
    Points
    120
    Par défaut
    Je recherche toujours un moyen de parser une requête en SQL sans l'éxecuter...
    Si quelqu'un a une idée...merci d'avance...
    (En fait, je souhaite juste savoir a partir d'une requete sql combien de champs vont m'être retournés (combien d'éléments dans le select...))
    SVP....je coince...
    La naissance est le seul fruit du hasard

  10. #10
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    A mon avis, t'as pas trop le choix que d'écrire un analyseur syntaxique maison, et là, c'est la galère...

    Du détail, du détail, du détail !!!
    Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    Points : 120
    Points
    120
    Par défaut
    Bah ca intéresse paut être personne...mais j'ai donc fais une petite méthode qui permet d'obtenir le nombre de chamlps retournés par un select, sans l'exécuter...
    (Ca fais un peu usine a gaz...mais bon, rien trouvé de plus élégant...)

    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
     
    public int get_nb_chp_select(String requete){
    		int res =0;
    		//int lg_req=requete.length();
    		String req = requete.replaceAll("[\n\t]"," ");
    		String[] tab=req.split(" ");
            String new_str="";
            boolean mutex=false;
            for(int i=0; i<tab.length;i++){
               if(tab[i].equals("select")){
                  mutex=true;
               }
               if(tab[i].equals("from")){
                  mutex=false;
               }
               if(mutex){
                  if(!tab[i].equals("select")){
                     new_str+=tab[i]+" ";
                  }
               }
            }
            String clean_str="";
            int nb_parenthese_open=0;
            for(int index=0; index<new_str.length(); index++){
            	char char_tmp = new_str.charAt(index);
            	if(char_tmp == '('){
            		nb_parenthese_open++;
            	}
            	if(char_tmp == ')'){
            		nb_parenthese_open--;
            	}
            	if(nb_parenthese_open == 0){
            		clean_str+=char_tmp;
            	}
     
            }
            String[] tab2=clean_str.split(",");
            if(tab2.length==1){
            	res=0;
            }
            else{
            	res=tab2.length;
            }
            System.out.println("Nb elt select "+res);
    		return res;
    	}
    La naissance est le seul fruit du hasard

  12. #12
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Dans le genre gratuit pas shareware, il y a ANTLR si vous avez besoin d'un parser.
    Pour une grammaire SQL, vous pouvez voir là : http://www.antlr.org/grammar/1057863397080/index.html (mais c'est juste un exemple).
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

Discussions similaires

  1. [XL-2007] Parser une chaine de caractère SQL avec un code en VBA
    Par Sosthy10 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/06/2015, 11h49
  2. Réponses: 2
    Dernier message: 26/05/2010, 16h29
  3. Comment parser une requete sql sans l'executer
    Par FABFAB125 dans le forum SQL
    Réponses: 2
    Dernier message: 30/11/2007, 17h21
  4. [SQL] faire une moyenne : PHP ou SQL ?
    Par [Hugo] dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 17/10/2007, 19h30
  5. Parser une requête SQL pour MySQL
    Par gassla dans le forum SGBD
    Réponses: 3
    Dernier message: 02/08/2006, 15h36

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