2011-08-31 172 views
2

我需要爲我的應用程序解析查詢的執行計劃並從中提取數據。雖然這個答案JDBC Oracle - Fetch explain plan for query幫助我通過jdbc獲取文本執行計劃,但由於查詢是運行時參數,因此無法解析文本輸出。下面提到的示例查詢返回「Sql Developer」中的xml,但不通過jdbc。我正在使用Oracle 11g XE和ojdbc6.jar驅動程序。爲什麼這個查詢不能通過jdbc api工作?任何幫助將不勝感激。如何通過jdbc獲取Oracle執行計劃xml

說明計劃 SET STATEMENT_ID = '123' FOR SELECT * FROM作業其中ROWNUM < 3以便通過JOB_ID降序

SELECT dbms_xplan.build_plan_xml(statement_id => '123')AS XPLAN FROM雙重;

下面是我的Java代碼:

Driver d = (Driver) Class.forName("oracle.jdbc.OracleDriver").newInstance(); 
    Connection conn = d.connect("jdbc:oracle:thin:username/[email protected]//localhost:1521/XE", new Properties()); 
    Statement statement1 = conn.createStatement(); 
    statement1.execute("explain plan set STATEMENT_ID = '"+ id + "' for " + query); 
    statement1.executeQuery("select dbms_xplan.build_plan_xml(statement_id => '"+ id + "') AS XPLAN FROM dual"); 
    ResultSet resultSet = statement1.getResultSet();    
    while (resultSet.next()) { 
     executionPlan = resultSet.getSQLXML(1).getString(); 
    } 

回答

2

我不認爲結果返回爲一個「真正的」 JDBC XML類型。

嘗試

resultSet.getString(1) 

代替

如果不行,也嘗試將結果轉換爲CLOB:

executeQuery("select to_clob(dbms_xplan.build_plan_xml(.... 

這肯定會要求您使用的getString( 1)而不是getSQLXML()

+0

使用getString(1)返回一個空值,而使用to_clob給出以下呃ror在jdbc和Sql Developer <![CDATA [ORA-00904:「OTHER_XML」:無效標識符]]> Snoopy

+0

但是,該錯誤消息意味着,它運行基本上工作和其他錯誤發生dbms_xplan.build_plan_xml –

+1

@ user812236,可以顯示您在嘗試TO_CLOB方法時使用的確切語句嗎? 'select to_clob(dbms_xplan.build_plan_xml(statement_id =>'123'))AS XPLAN FROM dual'在SQL Developer中對我很好。 –