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