2010-01-28 46 views
2

我使用Oracle 10g快捷在Windows XP中,並在MacBook OS X 10.5.8上運行PHP 5.3.1與PDO和Oracle即時客戶端10.2.0.4.0_4,我運行下面的腳本:如何從PHP獲取Oracle SQL查詢的EXPLAIN PLAN?

<?php 
$pdo = new PDO("oci:dbname=winders:1521/xe", "system", "XXXXXX"); 
... 

$sql = "WITH NumberedBugs AS (
    SELECT b.*, ROW_NUMBER() OVER (ORDER BY bug_id) AS RN 
    FROM Bugs b 
) SELECT * FROM NumberedBugs WHERE RN = :offset"; 

$stmt = $pdo->prepare($sql); 
$stmt->execute($offset); 
$row = $stmt->fetch(PDO::FETCH_ASSOC); 

沒問題。但我也希望能夠編寫一個PHP腳本來獲取此查詢的EXPLAIN PLAN報告。當我嘗試,我得到一個錯誤:

$sql = "EXPLAIN PLAN FOR WITH NumberedBugs AS (
    SELECT b.*, ROW_NUMBER() OVER (ORDER BY bug_id) AS RN 
    FROM Bugs b 
) SELECT * FROM NumberedBugs WHERE RN = 1234"; 
$stmt = $pdo->prepare($sql); 
$stmt->execute(); 
$row = $stmt->fetch(PDO::FETCH_ASSOC); 

(我改變了查詢參數的硬編碼整數文字此測試。)

當我嘗試打電話fetch()我得到這個錯誤:

ORA-24374: define not done before fetch or execute and fetch

什麼的這個解釋,我怎麼能得到一個PHP腳本EXPLAIN PLAN報告?我已經做了一些網絡搜索這個錯誤,但我找不到足夠清楚的解釋。

+0

謝謝比爾,剛剛給你發了一封電子郵件。 – 2011-11-27 03:35:55

回答

4

EXPLAIN PLAN FOR只將執行計劃寫入表(默認plan_table)。

要真正閱讀解釋計劃,你可以做一個簡單的從該表中選擇,或者做一個

SELECT * FROM TABLE(dbms_xplan.display); 

您第一次查詢後得到格式化輸出。

查看Using EXPLAIN PLAN瞭解更多信息。

+0

你的意思是我會'執行()'第一個查詢,但不提取結果,然後對'plan_table'運行一個新的查詢?或者我只需要「準備()」第一個查詢但不執行它? – 2010-01-28 20:36:58

+0

啊哈,我試過了。看起來我需要準備並執行第一個查詢,但我沒有獲取任何結果。然後針對'plan_table'或'TABLE(dbms_xplan.display)'運行新查詢。他們以不同的格式給出結果。 – 2010-01-28 20:42:35

+0

是的,正確的。 'plan_table'包含'EXPLAIN PLAN'提供的所有信息。 'dbms_xplan.display'使用您所解釋的最後一個查詢的數據,並以易於閱讀的格式顯示它。 – 2010-01-28 20:44:26