2013-08-30 22 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在編譯模式之間切換,但在偶爾使用接口功能重新編譯包之後,所以工具應用它自己的設置並在純模式下完成編譯。

在安排完所有操作後,我們得到了解決問題的線索,現在可以成功地分析此包。