Forum Clubic

Explain plan sur oracle depuis excel 2007 (vba)

Bonjour,

Je dispose d’un fichier Excel 2007 depuis lequel je me connecte via OO4O (CreateObject(“OracleInProcServer.XOraSession”)) à une BDD Oracle (ça doit être un Oracle 10 ou 11) pour y exécuter des requêtes. Toutes les requêtes de sélection passent sans problème.

En revanche, je souhaite aussi pouvoir analyser le plan d’exécution des requêtes depuis ce fichier Excel, et mettre le résultat dans une worksheet. Ceci ne fonctionne pas à l’heure actuelle pour une requête comme celle-ci :

EXPLAIN PLAN FOR
SELECT table1.col2, table2.col2
FROM table1, table2
WHERE table1.col1=table2.col1
;
SELECT * FROM table_explain_plan

Je ne sais pas ce qui cloche. Peut-être le ORADYN_READONLY dans mon appel à CreateDynaset ?
Edité le 07/03/2012 à 11:50

Pour récupérer mon plan d’exécution, j’exécute plutôt cette requête (à la place de la 2nde):


SELECT * FROM TABLE (DBMS_XPLAN.DISPLAY)

Edité le 08/03/2012 à 01:26

Merci de ta réponse. Je suis occupé sur d’autres tâches pour l’instant mais je vais tester et confirmer le résultat dès que possible.

Suite et fin de ce sujet : Mon problème tenait à 2 choses

  • utiliser PLAN_TABLE comme table contenant les plans d’exécution de requêtes
  • utiliser ExecuteSQL au lieu de CreateDynaset pour construire le plan d’exécution de ma requête

Sub ExplainPlan(SqlSelectStatement As String, wsTarget As Worksheet)

  Dim MyStatementId As String
  MyStatementId = Format(Now(), "yyyymmddhhmmss") & "-" & CStr(Int(Rnd() * 1000000))
  
  Dim sExplainPlanCommand As String
  Dim sExplainPlanRetrieve As String
  sExplainPlanCommand = "EXPLAIN PLAN SET STATEMENT_ID = '" & MyStatementId & " ' FOR " & SqlSelectStatement
  sExplainPlanRetrieve = "SELECT * FROM plan_table WHERE STATEMENT_ID = '" & MyStatementId & "'"
  
  
  Dim OraSession As Object
  Dim OraDatabase As Object
  'Establish database connection
  Set OraSession = CreateObject("OracleInProcServer.XOraSession")
  Set OraDatabase = OraSession.OpenDatabase(MyDataSourceName, MyUserName & "/" & MyPassword, 0&)
  
  'Build query execution plan (results will be appended to PLAN_TABLE)
  OraDatabase.ExecuteSQL sExplainPlanCommand
  
  'Retrieve contents of the explain plan table
  Dim ExplainPlanResultSet As Object
  Set ExplainPlanResultSet = OraDatabase.CreateDynaset(sExplainPlanRetrieve, ORADYN_DEFAULT)
  
  '*********************************************************************************
  ' Insert here commands for dump/presentation of Explain Plan results
  '*********************************************************************************
  
  'severe the database connection
  Set OraSession = Nothing
  Set OraDatabase = Nothing

End Sub

Mon code n’est certainement pas exempt de critiques sur les déclarations en tant que “Object” et je ne donne pas ici le code pour dumper les résultats (ca se trouve facilement avec Google de toutes façons), mais pour l’essentiel du problème posé, la réponse est là.