2010-01-28 3 views
2

나는 윈도우 XP에 오라클 10g Express를 사용하고, 그리고 PDO와 오라클 인스턴트 클라이언트 10.2.0.4.0_4와 맥북 OS X 10.5.8 실행 PHP 5.3.1에, 나는 다음과 같은 스크립트를 실행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); 

문제 없습니다. 그러나 나는 또한이 쿼리에 대해 EXPLAIN PLAN 보고서를 가져 오는 PHP 스크립트를 작성할 수 있기를 원합니다. 내가 이것을하려고하면 오류가 발생합니다 :

$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

감사합니다. Bill이 방금 이메일을 보냈습니다. –

답변

4

EXPLAIN PLAN FOR은 실행 계획을 테이블 (기본값 : plan_table)에 기록합니다.

은 실제로 당신이 일반이 테이블에서 선택 할 수있는 설명 계획을 읽거나 포맷 출력을 얻을 수 있도록 첫 번째 쿼리 후

SELECT * FROM TABLE(dbms_xplan.display); 

를 수행합니다.

자세한 내용은 Using EXPLAIN PLAN을 참조하십시오.

+0

첫 번째 쿼리를'execute()'하지만 결과를 가져 오지 않고'plan_table'에 대해 새 쿼리를 실행한다는 의미입니까? 아니면 그냥'준비()'첫 번째 쿼리를하지만 그것을 실행하지 않아도됩니까? –

+0

아하, 나는 그것을 시도했다. 첫 번째 쿼리를 준비하고 실행해야하지만 결과는 가져 오지 않습니다. 그런 다음'plan_table' 또는'TABLE (dbms_xplan.display)'에 대해 새로운 쿼리를 실행하십시오. 결과를 다른 형식으로 제공합니다. –

+0

예, 맞습니다. 'plan_table'은'EXPLAIN PLAN'에 의해 제공되는 모든 정보를 포함합니다. 'dbms_xplan.display'는 설명했던 마지막 쿼리의 데이터를 사용하여 읽기 쉬운 형식으로 표시합니다. –