如何使用SQL * Plus从带有参数的函数运行的Oracle包中获取Sql执行计划?

时间:2014-12-04 09:00:12

标签: oracle plsql sqlplus

我需要嗅出Oracle软件包的SQL执行计划。

运行此包的SQL * Plus代码如下所示:

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

我必须使用SQL * Plus,因为它是Jenkins作业的一部分,我需要将输出保存到文件中,以便进一步比较。

我已经了解了一种方法,它看起来像这样:

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 个答案:

答案 0 :(得分: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"将跟踪格式化为更易读的版本。