请假设您有一个包含大约20万行代码的Oracle PL/SQL包。
是否有任何快速方法来检测已声明但未在包中使用的变量?
提前感谢您的帮助。
编辑(2014年4月7日):我正在使用Oracle10G.
编辑:我正在寻找一个纯PL/SQL解决方案.
发布于 2014-04-05 10:20:35
以下仅适用于11g R2。看起来像PL/Scope已在11g R1中可用。
您将无法通过PLSQL_WARNINGS='ENABLE:ALL'获得有关未使用变量的信息
SQL> !cat test.sql
set serveroutput on
alter session set plsql_warnings = 'ENABLE:ALL';
create or replace procedure foo is
v_a number;
v_b varchar2(10);
begin
dbms_output.put_line('hello world!');
end;
/
show errors
exec foo
SQL> @test
Session altered.
SP2-0804: Procedure created with compilation warnings
Errors for PROCEDURE FOO:
LINE/COL ERROR
-------- -----------------------------------------------------------------
1/1 PLW-05018: unit FOO omitted optional AUTHID clause; default
value DEFINER used
hello world!
PL/SQL procedure successfully completed.
SQL>如您所见,唯一报告的警告与未使用的变量完全无关。相反,必须使用PL/范围。
下面的示例是从Oracle 11g -使用PL/Scope生成PL/SQL编译器警告(Java样式)派生的
SQL> alter session set plscope_settings = 'identifiers:all';
Session altered.
SQL> alter procedure foo compile;
SP2-0805: Procedure altered with compilation warnings
SQL> show errors
Errors for PROCEDURE FOO:
LINE/COL ERROR
-------- -----------------------------------------------------------------
1/1 PLW-05018: unit FOO omitted optional AUTHID clause; default
value DEFINER used
SQL> @plsql-unused-variables.sql
Enter value for name: foo
old 10: where object_name = upper('&name')
new 10: where object_name = upper('foo')
Enter value for type: procedure
old 11: and object_type = upper('&type')
new 11: and object_type = upper('procedure')
COMPILER_WARNING
--------------------------------------------------------------------------------
V_B: variable is declared but never used (line 3)
V_A: variable is declared but never used (line 2)
SQL>脚本plsql-unused-variables.sql只是上面提到的博客文章中的一个剪切和粘贴。因为我发现它很有用,所以我还在比特桶中提供了脚本。
发布于 2014-04-04 17:13:08
将会话设置为报告所有警告:
ALTER SESSION SET PLSQL_WARNINGS='ENABLE:ALL';然后编译你的代码。如果编译表明存在错误,如下面所示:
SP2-0804: Procedure created with compilation warnings显示任何错误:
SHO ERR如果您有任何未引用的变量,则应在错误列表中提及它们。或者,使用像PL/SQL这样的工具,在编译后自动显示这些错误。
分享并享受。
发布于 2014-04-12 21:37:04
PL/SQL等待分配内存,直到分配变量,然后只分配所需的存储空间。所以不用担心消耗内存。(来源)
因此,查找和修复未使用的变量只是一项管理工作,不会提高包的性能。换句话说,最简单的解决办法是什么也不做。
如果您仍然担心未使用的变量,您可能只需使用命令行工具(如grep、sort和uniq )解析包源代码(特别是如果它们遵循编码标准,比如使用v_启动所有变量),就可以找到它们。
https://stackoverflow.com/questions/22868567
复制相似问题