为什么plsql_profiler不产生数据行?

时间:2013-09-09 15:34:25

标签: oracle plsql

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表中看到plsql_profiler_runs列中包含运行ID的值的行。

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

为什么会发生这种情况?我该怎么做才能修复它并查看我的程序数据?

1 个答案:

答案 0 :(得分:4)

根据DBMS_PROFILER reference

  

安全模型

     

探查器仅收集用户具有CREATE的单元的数据   特权;你不能使用包来分析单位   仅授予执行权限。通常,如果用户可以调试   一个单位,同一个用户可以对其进行分析。但是,可以对单元进行分析   是否已编译DEBUG。 Oracle建议使用这些模块   正在分析的应该编译DEBUG,因为这提供了   有关该单元在数据库中的其他信息。

在其他架构中创建配置文件过程时,我能够重现您的问题,而我的性能分析用户缺少CREATE ANY PROCEDUREALTER ANY PROCEDURE权限。当他有两个 - 一切都运行得很好。可能你引用了另一个模式的包并遇到了同样的问题。