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
记录用于调用匿名块,而不是过程本身,这显然是我的意思感兴趣的。
为什么会发生这种情况?我该怎么做才能修复它并查看我的程序数据?
答案 0 :(得分:4)
根据DBMS_PROFILER reference:
安全模型
探查器仅收集用户具有CREATE的单元的数据 特权;你不能使用包来分析单位 仅授予执行权限。通常,如果用户可以调试 一个单位,同一个用户可以对其进行分析。但是,可以对单元进行分析 是否已编译DEBUG。 Oracle建议使用这些模块 正在分析的应该编译DEBUG,因为这提供了 有关该单元在数据库中的其他信息。
在其他架构中创建配置文件过程时,我能够重现您的问题,而我的性能分析用户缺少CREATE ANY PROCEDURE
或ALTER ANY PROCEDURE
权限。当他有两个 - 一切都运行得很好。可能你引用了另一个模式的包并遇到了同样的问题。