2
DECLARE
  v_run_no binary_integer;
  v_run_time_in_sec number;
BEGIN 
  dbms_profiler.start_profiler('Profiling my proc', 'Tom', v_run_no);

  schema.my_package.my_proc();

  dbms_profiler.stop_profiler();

  -- Calculate the TOTAL_TIME for each unit in the run by summing the TOTAL_TIME
  -- from each data record in the unit and writing it to the TOTAL_TIME column
  -- in the plsql_profiler_units table.
  dbms_profiler.rollup_run(v_run_no);

  -- Grab total run time for display
  SELECT r.RUN_TOTAL_TIME / 1000000000
  INTO v_run_time_in_sec
  FROM ucms_crim_conv.plsql_profiler_runs r
  WHERE r.RUNID = v_run_no;

  dbms_output.put_line('Profiled as run ' || v_run_no || ' in ' || v_run_time_in_sec || ' total sec.');
END;

我已经运行了相同的脚本来分析不同的过程调用,更改行schema.my_package.my_proc();来调用不同的过程,一切都很好。

TOTAL_TIME这一次,脚本完成后,我可以在表中看到运行 id的列中有一个值的行plsql_profiler_runs

以前我还会在 中看到 2 行plsql_profiler_units,其中 1 行用于匿名调用块,1 用于正在分析的过程,plsql_profiler_data每个单元都有关联的行。然而,这一次,我只看到 中的匿名块plsql_profiler_units,并且这个运行 id 的唯一plsql_profiler_data记录是调用匿名块的记录,而不是过程本身,这显然是我感兴趣的。

为什么会发生这种情况?我可以做些什么来修复它并查看我的程序的数据?

4

1 回答 1

4

根据 DBMS_PROFILER参考

安全模型

分析器仅收集用户具有 CREATE 权限的单元的数据;您不能使用该包来分析已授予 EXECUTE ONLY 访问权限的单元。一般来说,如果一个用户可以调试一个单元,同一个用户就可以对其进行分析。然而,一个单元可以被分析,无论它是否已经被编译为 DEBUG。Oracle 建议正在分析的模块应编译为 DEBUG,因为这提供了有关数据库中单元的附加信息。

CREATE ANY PROCEDURE当在另一个模式中创建分析过程并且我的分析用户缺少或ALTER ANY PROCEDURE权限时,我能够重现您的问题。当他两者兼得时——一切都运行得很好。可能您引用了另一个模式的包并遇到同样的问题。

于 2013-09-09T16:30:04.150 回答