2014-12-04 46 views
0

我需要嗅出一個Oracle包的SQL執行計劃。如何從使用SQL * Plus參數運行的Oracle包中獲取Sql執行計劃?

SQL * Plus的代碼來運行這個包看起來是這樣的:

VARIABLE RC REFCURSOR 
EXEC :RC :=PACKAGENAME.GETREPORTDATA('12_300',1999,2014,'246246',NULL) 
PRINT RC 

我一直在使用SQL做* Plus的,因爲它是一個詹金斯工作的一部分,我需要保存輸出到一個文件,以進一步比較的目的。

我已經被告知要做到這一點的方法,它看起來像這樣:

select 
     sqlplan.operation, 
     sqlplan.options, 
     sqlplan.object_name, 
     sqlplan.cost, 
     sqlplan.depth 
    from v$sqlarea sqlarea, 
     v$session sesion, 
     v$sql_plan sqlplan 
where sesion.sql_hash_value = sqlarea.hash_value 
    and sesion.sql_address = sqlarea.address 
    and sqlarea.plan_hash_value = sqlplan.plan_hash_value 
    and sesion.username = 'USERNAME' order by sqlplan.depth; 

但所有我從這個代碼得到的是

 v$sql_plan sqlplan 
     * 
ERROR at line 9: 
ORA-00942: table or view does not exist 

我發現了另一件事是EXPLAIN PLAN命令,但它不適合我,或者我錯誤地使用它。

說實話,我只是不知道從哪裏開始的這...

任何信息都受我:)

+1

你有沒有試過把系統。在意見面前? – 2014-12-04 09:05:10

+0

或者您可以跟蹤會話並使用tkprof獲取每個語句的計劃 – ninesided 2014-12-04 09:24:24

+0

另一種方法是檢查通過v $ session獲取執行語句的sql_id然後使用dbms_xplan.display_cursor()獲取存儲的執行計劃。 – 2014-12-04 10:53:27

回答

1

您需要打開Oracle跟蹤,然後再進行誠實讚賞通過跟蹤文件

-- All versions. 
SQL> ALTER SESSION SET sql_trace=TRUE; 
SQL> ALTER SESSION SET sql_trace=FALSE; 

SQL> EXEC DBMS_SESSION.set_sql_trace(sql_trace => TRUE); 
SQL> EXEC DBMS_SESSION.set_sql_trace(sql_trace => FALSE); 

SQL> ALTER SESSION SET EVENTS '10046 trace name context forever, level 8'; 
SQL> ALTER SESSION SET EVENTS '10046 trace name context off'; 

SQL> EXEC DBMS_SYSTEM.set_sql_trace_in_session(sid=>123, serial#=>1234, sql_trace=>TRUE); 
SQL> EXEC DBMS_SYSTEM.set_sql_trace_in_session(sid=>123, serial#=>1234, sql_trace=>FALSE); 

SQL> EXEC DBMS_SYSTEM.set_ev(si=>123, se=>1234, ev=>10046, le=>8, nm=>' '); 
SQL> EXEC DBMS_SYSTEM.set_ev(si=>123, se=>1234, ev=>10046, le=>0, nm=>' '); 

-- Available from SQL*Plus since 8i (commandline utility prior to this. 
SQL> CONN sys/password AS SYSDBA; -- User must have SYSDBA. 
SQL> ORADEBUG SETMYPID;   -- Debug current session. 
SQL> ORADEBUG SETOSPID 1234;  -- Debug session with the specified OS process. 
SQL> ORADEBUG SETORAPID 123456; -- Debug session with the specified Oracle process ID. 

SQL> ORADEBUG EVENT 10046 TRACE NAME CONTEXT FOREVER, LEVEL 12; 
SQL> ORADEBUG TRACEFILE_NAME;  -- Display the current trace file. 
SQL> ORADEBUG EVENT 10046 TRACE NAME CONTEXT OFF; 

-- All versions, requires DBMS_SUPPORT package to be loaded. 
SQL> EXEC DBMS_SUPPORT.start_trace(waits=>TRUE, binds=>FALSE); 
SQL> EXEC DBMS_SUPPORT.stop_trace; 

SQL> EXEC DBMS_SUPPORT.start_trace_in_session(sid=>123, serial=>1234, waits=>TRUE, binds=>FALSE); 
SQL> EXEC DBMS_SUPPORT.stop_trace_in_session(sid=>123, serial=>1234); 

0 - 沒有跟蹤。像關閉sql_trace。 2 - 相當於常規的sql_trace。 4 - 與2相同,但添加了綁定變量值。 8 - 與2相同,但添加了等待事件。 12 - 與2相同,但同時綁定變量值和等待事件。

然後,您將使用oracle實用程序「tkprof」將跟蹤格式化爲更具可讀性的版本。