3

Oracle データベースに 2 人のユーザー (スキーム) がいるとします: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 のドキュメントで指定されているように、プロファイラーに影響を与える可能性があるのは次の 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も、内部プロシージャーのプロファイラー統計にアクセスできません。
では、問題は、この状況を修正するために、可能であれば何をしなければならないかということです。

4

1 に答える 1