2013-08-30 19 views
3

假设所有的PL/SQL包分析器收集信息,我们有2个用户(方案)的Oracle数据库:TARGET_USERTESTER_USER由另一个用户

TARGET_USER拥有一些包:

create or replace package TARGET_USER.SomePackage 
is 

    procedure some_interface_proc(p1 number, p2 varchar2, p3 xmltype); 

end; 

身体这个包包含了很多功能,从some_interface_proc调用,如:

create or replace package body TARGET_USER.SomePackage 
is 

    procedure do_some_operation_1 
    is 
    begin 
    null; -- Really do some actions here 
    end; 

    procedure do_some_operation_2 
    is 
    begin 
    null; -- Really do some actions here 
    end; 

    procedure some_interface_proc(p1 number, p2 varchar2, p3 xmltype) 
    is 
    begin 
    do_some_operation_1; 
    do_some_operation_2; 
    end; 

end; 

权限去执行这个包授予TESTER_USER

grant execute on TARGET_USER.SomePackage to TESTER_USER 

而且TESTER_USER授予运行DBMS_PROFILER软件包所需的所有权限并拥有所有必需的表。 有了这样的设置TESTER_USER能够成功运行分析器对测试脚本可以简化为:

begin 

    for cData in (
    select a, b, с from table_with_test_data 
) loop 

    TARGET_USER.SomePackage.some_interface_proc(a,b,c); 

    end loop; 

end; 

所以,收集所有的统计和一切似乎都很正常,但...

问题

为什么TESTER_USER无法看到有关SomePackage.do_some_operation_1SomePackage.do_some_operation_2程序的运行时间的详细统计信息?

DBMS_PROFILER documentation指定有4个东西可影响轮廓仪:

  1. 探查只收集数据用于用户具有CREATE特权
  2. 一般来说单元,如果用户可以调试一个单元,同一个用户可以分析它。
  3. 以编译单位调试信息。
  4. 程序单元必须被编译为解释(非本地)代码。

在试图满足所有要求的下一步行动做:

grant create any procedure to TESTER_USER; 
grant alter any procedure to TESTER_USER; 
grant debug on TARGET_USER.SomePackage to TESTER_USER; 

,并检查SomePackage的编译模式,如果调试信息存在。

,但在完成这一切的行动TESTER_USER仍然是内部程序不能访问探查统计后。
所以,问题是:如果甚至有可能纠正这种情况,必须做些什么?

+0

在你的测试中,你是否把这些东西放在这两个内部程序中?我在问,因为PL/SQL可以在一定程度上优化代码,因此也许这两个程序根本不会执行。 –

+0

软件包的所有者(TARGET_USER)是否可以查看详细统计信息? –

+0

@VincentMalgrat里面有很多程序,没有列在'PLSQL_PROFILER_UNIT'表中。 – ThinkJet

回答

2

最近我遇到同事谁介绍这种情况对我来说,我们认识到,一切运作良好甲骨文的一面,但步骤,以确保满足所有条件是错误的。
所以我对所有花时间回答错误定位问题的人表示歉意。

但是,我们成立可能会帮助别人,所以我会尽力解释情况,并回答我的问题。
总之有两点:

  1. 始终使用本地Oracle工具来验证奇怪的情况;

  2. 在每次测试尝试中从头开始重现所有情况。

问题的根源在于在“PL/SQL Developer”工具中实现了Native和Interpreted代码之间的切换。应用程序范围内的“PL/SQL代码类型”首选项会影响用户界面帮助下完成的每个包编译。 虽然验证使用的所有条件集合使用alter session set PLSQL_CODE_TYPE=INTERPRETEDalter session set PLSQL_CODE_TYPE=NATIVE在编译模式之间切换,但在偶尔使用接口功能重新编译包之后,所以工具应用它自己的设置并在纯模式下完成编译。

在安排完所有操作后,我们得到了解决问题的线索,现在可以成功地分析此包。