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 :

[10g] Execute immediate, explain plan et bind variables


Sujet :

PL/SQL 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 [10g] Execute immediate, explain plan et bind variables
    Bonjour,

    j'ai un problème avec l'explain plan dans une procédure PL/SQL. J'exécute l'explain avec un EXECUTE IMMEDIATE et je tente d'utiliser des variables bindés. Or cela ne fonctionne pas car la requête n'est pas du texte entre guillemets mais doit être accolée telle quelle au "FOR". Je dois donc réaliser mon explain plan ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    EXECUTE immediate 'delete from plan_table where statement_id=:a' using query_id;
    EXECUTE immediate 'explain plan set statement_id='''||query_id||''' FOR '||query;
    Autant la première ligne fonctionne bien, autant la seconde m'oblige à piper mes variables, ce qui me pose un gros problème pour l'aspect injection SQL.

    L'idéal serait en fait de pouvoir appeler l'explain plan sans utiliser la commande "EXPLAIN PLAN" mais plutôt un package Oracle qui prendrait en paramètre le statement id et la requête mais je n'ai pas trouvé.

    Quelqu'un a-t-il des informations sur ce sujet soit pour arriver à utiliser les variables bindées, soit pour exécuter l'explain plan différement ?

    Merci.

  2. #2
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    Quel est ton contexte ?

    Pourquoi tu veux utiliser EXECUTE IMMEDIATE

    Sinon il y a aussi DBMS_XPLAN

    http://www.oracle-base.com/articles/9i/DBMS_XPLAN.php
    ou

    http://igor-db.blogspot.com/2005/08/...-vsqlplan.html

  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
    Mon contexte c'est de pouvoir automatiser des bench sur des requêtes. J'ai une liste de 100 requêtes, je les passe en paramètre à ma procédure et je récupère une série de paramètres en résultat : cost, max_cost, temps estimé, temps réel d'exécution, nombre de lignes.

    Donc je dois pouvoir obtenir le plan d'exécution de ma requête automatiquement. A ma connaissance DBMS_XPLAN permet seulement de mettre en forme le résultat, pas de lancer un plan (et je n'ai trouvé aucun exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Finally we use the DBMS_XPLAN.DISPLAY function to display the execution plan
    Toute ma procédure marche très bien mais je voudrais éviter les injections SQL pour pouvoir stocker la procédure sur ma base.

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par nuke_y Voir le message
    ...Autant la première ligne fonctionne bien, autant la seconde m'oblige à piper mes variables, ce qui me pose un gros problème pour l'aspect injection SQL.
    ...
    Salut nuke_y,

    Pourrait-toi donner un exemple d'injection SQL pour ce cas ?

  5. #5
    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
    Salut mnitu,

    alors pour le coup je n'ai effectivement pas réussi à exploiter la faille, parce que la commande explain plan n'est pas une commande SQL classique et qu'on ne peut pas appeler une sous-requête dans la valeur du statement_id et que la requête placée à la fin n'est pas exécutée. Cependant je crains un peu le dépassement de buffer ou autre attaque de ce genre qui ne se baserai pas sur le SQL lui même mais plus sur un défaut du execute immediate.

    D'un autre côté, vu que dans ma procédure j'exécute dans un 2e temps ma requête pour récolter le nombre de lignes réel, si un petit malin décide de faire tester une requête qui utilise utl_http pour extraire des informations, je ne pourrais pas l'empêcher, donc je pourrais me contenter de conclure que de toutes façons c'est une procédure dangereuse et donc qu'elle ne doit pas être stockée sur le serveur... Dommage, snif.

    Merci des réponses, bon si quelqu'un peut me donner une solution pour lancer un explain plan avec un package plutôt qu'avec un execute immediate, je suis preneur quand même.

    Merci

Discussions similaires

  1. Execute Immediate et bind variables
    Par wanagain35 dans le forum PL/SQL
    Réponses: 3
    Dernier message: 16/03/2010, 14h20
  2. execute immediate into -une variable- ?
    Par betty33 dans le forum SQL
    Réponses: 8
    Dernier message: 19/03/2008, 13h34
  3. execute immediate 10g
    Par c.langlet dans le forum SQL
    Réponses: 6
    Dernier message: 03/05/2007, 11h30
  4. Bind variables et plan d'execution
    Par Wurlitzer dans le forum Oracle
    Réponses: 6
    Dernier message: 26/02/2007, 14h04
  5. Executer fonction dans explain plan
    Par chris81 dans le forum SQL
    Réponses: 3
    Dernier message: 14/02/2007, 12h02

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