Oracle 如何判断是否正在使用PL/SQL包、过程或函数?

Oracle 如何判断是否正在使用PL/SQL包、过程或函数?,oracle,plsql,statistics,dead-code,Oracle,Plsql,Statistics,Dead Code,如何判断是否正在使用PL/SQL包、过程或函数?是否存在包含PL/SQL包、过程或函数使用统计信息的Oracle表或视图?默认情况下不是这样。但您可以使用Oracle数据库的审核功能。At是一个关于审计过程调用的长线程 通过查询DBA_dependencies表,可以查看对象是否具有任何依赖项 SELECT OWNER, NAME, TYPE FROM SYS.DBA_DEPENDENCIES WHERE REFERENCED_OWNER = '<

如何判断是否正在使用PL/SQL包、过程或函数?是否存在包含PL/SQL包、过程或函数使用统计信息的Oracle表或视图?

默认情况下不是这样。但您可以使用Oracle数据库的审核功能。At是一个关于审计过程调用的长线程

通过查询DBA_dependencies表,可以查看对象是否具有任何依赖项

SELECT OWNER, 
       NAME, 
       TYPE 
  FROM SYS.DBA_DEPENDENCIES 
 WHERE REFERENCED_OWNER = '<your object owner>' 
   AND REFERENCED_NAME = '<your object name>'
   AND REFERENCED_TYPE IN ('PACKAGE', 'PROCEDURE', 'FUNCTION');
此查询将返回存储在Oracle实例本身内部的代码中的任何依赖项


它不会显示是否在实例之外调用了任何对象。

如果您使用的是Oracle 11 R2?,我会给PL/Scope一个机会

docu声明:PL/Scope是一个编译器驱动的工具,它在程序单元编译时收集PL/SQL源代码中有关标识符的数据,并使其在静态数据字典视图中可用。收集的数据包括有关标识符类型、用法声明、定义、引用、调用、分配以及每个用法在源代码中的位置的信息

PL/Scope支持开发功能强大且有效的PL/Scope源代码浏览器,以提高PL/SQL的效率 通过最小化浏览和理解源代码所花费的时间,提高开发人员的工作效率


您可以在

上找到有关它的更多信息。您可能还会发现pl/sql instrumentation包对您尝试执行的操作非常有用。

您还可以尝试查询用户/所有源:

SELECT * FROM all_source
where UPPER(TEXT) like UPPER('%procedure_name%')

你必须忽略自我介绍,但这应该很容易发现

您还需要从用户/所有视图中检查视图源。但是,请参见关于查询视图源的另一个问题

您还可以检查包或顶级功能/过程是否与一起使用

select * from all_dependencies
where referenced_name like '%PACKAGE_NAME%';
注意:根据需要将用户\与所有\ dba \切换

如果您特别查找未调用的函数,那么另一个选项是在打开警告的情况下编译代码,然后查找PLW-06002和LPW-06006

exec DBMS_WARNING.add_warning_setting_cat('ALL','ENABLE','SESSION')
create or replace function x return number
as
procedure y is begin null; end;
begin
return 0;
return 1;
end;

show errors

Errors for FUNCTION X:

LINE/COL ERROR
-------- -----------------------------------------------------------------
1/1      PLW-05018: unit X omitted optional AUTHID clause; default value DEFINER used
3/1      PLW-06006: uncalled procedure "Y" is removed.
6/1      PLW-06002: Unreachable code

你可以使用像蟾蜍这样的编辑器。它们将直接列出您的过程所依赖的对象和引用您的过程的对象。

删除它们,然后查看是否收到用户的任何呼叫:-定义用法,因为可能有一个很少使用的包/proc/函数,但这并不意味着应该删除它。我不知道这如何回答这个问题,一个过程可能没有依赖项,但直接从下一层调用,而另一个过程可能有一些依赖项,但它根本没有被调用,也没有其他可能调用它的函数,因此从未使用过。你可能想详细说明你的答案,以说明它是如何解决这个问题的。我不是因为你是这个网站的新手而否决这个,顺便说一句,欢迎来到SO!最初的问题没有提到他们是否在另一层寻找呼叫者。Oracle实例本身不可能知道实例外部的哪些层正在调用指定的函数。我的回答只是在存储在Oracle实例中的代码中显示依赖关系。PL/Scope对OP的情况没有帮助-他们想知道函数或过程实际使用的频率,而不是潜在使用的频率。Ask Tom的答案归结为创建一个审计表,并修改PL/SQL代码以插入该审计表。只有当开发人员愿意或能够进行代码更改时,该建议才有效。
exec DBMS_WARNING.add_warning_setting_cat('ALL','ENABLE','SESSION')
create or replace function x return number
as
procedure y is begin null; end;
begin
return 0;
return 1;
end;

show errors

Errors for FUNCTION X:

LINE/COL ERROR
-------- -----------------------------------------------------------------
1/1      PLW-05018: unit X omitted optional AUTHID clause; default value DEFINER used
3/1      PLW-06006: uncalled procedure "Y" is removed.
6/1      PLW-06002: Unreachable code