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 confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    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!

  2. #2
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    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

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    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...

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

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    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...

  6. #6
    Expert éminent
    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
    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 confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    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...

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    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...

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    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...

  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
    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...

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    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;
    	}

  12. #12
    Membre émérite

    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
    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).

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