假设所有的PL/SQL包分析器收集信息,我们有2个用户(方案)的Oracle数据库:TARGET_USER
和TESTER_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_1
和SomePackage.do_some_operation_2
程序的运行时间的详细统计信息?
如DBMS_PROFILER documentation指定有4个东西可影响轮廓仪:
- 探查只收集数据用于用户具有CREATE特权
- 一般来说单元,如果用户可以调试一个单元,同一个用户可以分析它。
- 以编译单位调试信息。
- 程序单元必须被编译为解释(非本地)代码。
在试图满足所有要求的下一步行动做:
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
仍然是内部程序不能访问探查统计后。
所以,问题是:如果甚至有可能纠正这种情况,必须做些什么?
在你的测试中,你是否把这些东西放在这两个内部程序中?我在问,因为PL/SQL可以在一定程度上优化代码,因此也许这两个程序根本不会执行。 –
软件包的所有者(TARGET_USER)是否可以查看详细统计信息? –
@VincentMalgrat里面有很多程序,没有列在'PLSQL_PROFILER_UNIT'表中。 – ThinkJet