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

Oracle Discussion :

Parser une requête et trouver tous les champs utilisés


Sujet :

Oracle

  1. #1
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut Parser une requête et trouver tous les champs utilisés
    Bonjour.

    Je voudrais savoir si quelqu'un a déjà trouvé un moyen de parser une requête, allant d'un simple select d'une table à une imbrication de sous-requêtes avec des opérateurs ensemblistes, pour en retirer les champs (et tables) utilisés dedans.

    J'ai trouvé ça et ça mais ça ne répond pas tout à fait à ma problématique. J'ai regardé DBMS_SQL et DBMS_UTILITY aussi mais je n'ai pas trouvé mon bonheur.

    En fait j'aurai besoin d'une commande / API distribuée par Oracle et qui analyse sémantiquement la requête et renvoie la liste des colonnes utilisées dedans, que ce soit en restitution, en filtre ou en jointure. Oracle a forcément ce genre fonction en interne, sinon comment ferait le parser pour déterminer qu'une table ou un champ n'existe, mais est-ce qu'ils l'ont rendu accessible ? Je ne sais pas.

    Une technique à laquelle j'ai pensé consiste à prendre la requête (valide) et à volontairement introduire des caractères improbables à la fin de chaque "mot" pour provoquer une erreur de parsing et donc savoir que ce "mot" était un nom de table (ORA-00942) ou de champ (ORA-00904) mais déjà c'est une technique très "force brute" et surtout un ORA-00904 ne me permet pas de faire la différence entre un nom de fonction et un nom de champ. J'ai pensé aussi à utiliser DBMS_UTILITY.NAME_RESOLVE mais cette méthode ne fonctionne que pour les tables.

    Il y a aussi des parser SQL en java, notamment un distribué par Oracle mais j'ai moyennement confiance sur la qualité du parsing, surtout que chez mon client, quand on créé une vue c'est justement pour éviter une requête très compliquée.

    Bref je sèche un peu sur le sujet...

    Fonctionnellement, le but est de pouvoir faire automatiquement des analyses d'impact pour déterminer quelle requête ou vue peut être impactée par une modification DML ou DDL. Je peux déjà le faire d'une manière très macro (au niveau des tables) avec ALL_DEPENDENCIES mais je voudrais vraiment pouvoir descendre au niveau du champ.

    Merci de vos idées / conseils / astuces

    PS : Oracle 10g mais si ça marche en 9i c'est bien aussi (comme ça je pourrais ré-utiliser la solution ailleurs).
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Points : 344
    Points
    344
    Par défaut
    Salut,

    Une piste serait d'utiliser le parametre _dump_qbc_tree et de voir/traiter la tracefile.
    Voir le lien suivant:
    http://blog.tanelpoder.com/2007/09/1...mns-in-oracle/

    ---
    Farid

  3. #3
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Bonjour,

    effectivement cela donne une piste, mais le problème c'est que je n'ai pas forcément envie d'aller jusqu'au bout de l'empilement des vues, juste de savoir les objets utilisés dans une vue ou une requête, pour de l'analyse d'impact.

    Cependant le fait que ce paramètre soit non documenté me laisse penser que ma recherche est vaine, Oracle ne met pas à disposition ce genre d'API.
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

Discussions similaires

  1. Réponses: 7
    Dernier message: 12/03/2015, 06h23
  2. [MySQL] renommage de tous les champs renvoyés par une requête
    Par o.deb dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 19/09/2012, 21h46
  3. Réponses: 4
    Dernier message: 27/07/2009, 12h15
  4. Sélection de tous les champs d'une sous-Requête que je redéfini
    Par electrosat03 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 28/06/2007, 16h43
  5. afficher tous les champs d'une table
    Par julio84 dans le forum ASP
    Réponses: 8
    Dernier message: 19/01/2005, 10h31

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