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

19

如何判断一个PL/SQL包、过程或函数是否被使用?是否有Oracle表或视图可以包含有关PL/SQL包、过程或函数使用情况的统计数据?


9
把它们删除,看看你是否会收到用户的电话? :-) - Damien_The_Unbeliever
定义“使用情况”,因为可能存在很少使用的软件包/过程/函数,但这并不意味着应该将其删除。 - OMG Ponies
6个回答

23

您还可以尝试查询USER/ALL_source:

SELECT * FROM all_source
where UPPER(TEXT) like UPPER('%procedure_name%')
或者
SELECT * FROM all_source
where UPPER(TEXT) like UPPER('%package.function_name%')

您需要忽略自引用,但这应该很容易发现。

您还需要从用户/所有视图中检查“查看”源代码。有关查询视图源的其他问题,请参见其他问题。

您也可以使用此方法检查包或顶级函数/过程是否已使用

select * from all_dependencies
where referenced_name like '%PACKAGE_NAME%';

注意: 根据需要将user_替换为all_/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

6

默认情况下不能。但是您可以使用Oracle数据库的审计功能。在Ask Tom上有一个关于过程调用审计的长线程!


Ask Tom上的答案归结为创建审计表并修改PL/SQL代码以在该审计表上进行插入。当开发人员愿意或能够进行代码更改时,这些建议才有效。 - durette

3
如果你正在使用Oracle 11(R2?),我建议你尝试使用PL/Scope工具。该工具可以在程序单元编译时收集有关PL/SQL源代码中标识符的数据,并在静态数据字典视图中提供这些数据。收集的数据包括标识符类型、用法(声明、定义、引用、调用、赋值)以及每个用法在源代码中的位置。 PL/Scope能够开发强大而有效的PL/Scope源代码浏览器,通过最小化浏览和理解源代码所花费的时间,提高了PL/SQL开发人员的生产力。 你可以在此处找到更多相关信息。

PL/Scope 对 OP 的情况没有帮助——他们想知道一个函数或过程实际上被使用的频率,而不是潜在的使用情况。 - Jeffrey Kemp

2
您可以通过查询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实例中的代码中的任何依赖项。

它不会揭示任何对象是否在实例外被调用。


我不认为这回答了问题,一个过程可能没有依赖关系,但直接从下一层调用,另一个过程可能有一些依赖关系,但根本没有被调用,也没有其他可能调用它的函数,因此从未“使用”。您可能希望详细说明您的答案如何解决问题。顺便说一句,我没有对此进行负面评价,因为您是该网站的新用户,欢迎来到SO! - jachguate
原始问题并未提及是否正在寻找另一层中的调用者。Oracle实例本身无法知道外部层次中哪些层次在调用指定的函数。我的回答只是展示存储在Oracle实例中的代码依赖关系。 - JordanBean

1

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


0

你可能会发现 pl/sql 仪表包 ILO 对于你正在尝试做的事情很有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接