19

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

4

6 回答 6

21

您也可以尝试查询 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%')

您必须忽略自我引用,但这应该很容易发现。

您还需要检查来自 user/all_views 的“视图”源。不过,请参阅有关查询视图源的其他问题。

您还可以检查是否使用了包或顶级函数/过程

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

注意:根据需要用 all_/dba_ 切换 user_

如果您专门寻找未调用的函数,那么另一种选择是在打开警告的情况下编译您的代码,然后查找 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
于 2012-06-18T02:19:51.467 回答
6

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

于 2011-01-12T15:26:53.027 回答
3

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

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

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

您可以在http://download.oracle.com/docs/cd/E11882_01/appdev.112/e17125/adfns_plscope.htm#g1010526找到更多相关信息

于 2011-02-10T21:31:29.140 回答
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 实例本身内的代码中的任何依赖关系。

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

于 2011-02-10T20:40:35.057 回答
1

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

于 2014-03-11T06:25:28.343 回答
0

您可能还会发现 pl/sql 检测包ILO对您正在尝试做的事情很有用。

于 2011-02-11T15:26:33.173 回答