Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables Oracle PL/SQL:如何在长包中查找未使用的变量?_Variables_Plsql_Oracle10g - Fatal编程技术网

Variables Oracle PL/SQL:如何在长包中查找未使用的变量?

Variables Oracle PL/SQL:如何在长包中查找未使用的变量?,variables,plsql,oracle10g,Variables,Plsql,Oracle10g,请假设您有一个大约200000行代码的Oracle PL/SQL包 是否有任何快速方法可以检测已声明但未在包中使用的变量 提前感谢您的帮助 编辑(2014年4月7日):我正在使用Oracle 10G。 编辑:我正在寻找纯PL/SQL解决方案。将会话设置为报告所有警告: ALTER SESSION SET PLSQL_WARNINGS='ENABLE:ALL'; 然后编译代码。如果编译表明存在错误,如中所示,您会得到如下结果: SP2-0804: Procedure created with c

请假设您有一个大约200000行代码的Oracle PL/SQL包

是否有任何快速方法可以检测已声明但未在包中使用的变量

提前感谢您的帮助

编辑(2014年4月7日):我正在使用Oracle 10G。


编辑:我正在寻找纯PL/SQL解决方案。将会话设置为报告所有警告:

ALTER SESSION SET PLSQL_WARNINGS='ENABLE:ALL';
然后编译代码。如果编译表明存在错误,如中所示,您会得到如下结果:

SP2-0804: Procedure created with compilation warnings
显示任何错误:

SHO ERR
如果您有任何未引用的变量,则应在错误列表中提及这些变量。或者,使用PL/SQLDeveloper之类的工具,它会在编译后自动显示这些错误


分享和享受。

以下内容仅适用于11g R2。看起来像

使用
PLSQL\u 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>
正如您所看到的,唯一报告的警告与未使用的变量完全无关。相反,必须使用

以下示例源自:

脚本
plsql unused variables.sql
只是上面提到的博客文章中的剪切粘贴。因为我发现它很有用,所以我也在中提供了脚本

PL/SQL等待分配内存,直到您分配变量,然后 根据需要分配尽可能多的存储空间。所以不必担心消耗内存

因此,查找和修复未使用的变量只是一项内务管理工作,不会提高包的性能。换句话说,最简单的解决办法是什么也不做


如果您仍然担心未使用的变量,您可能只需使用命令行工具(如
grep
sort
uniq
)解析包源代码就可以找到它们(特别是如果它们遵循编码标准,例如使用
v_u
启动所有变量)。

“代码分析”在TOAD 12中,您是在寻找纯PL/SQL或SQL解决方案,还是对第三方工具持开放态度?例如,上面Egor的评论,以及PL/SQL Developer在编译包体时将自动显示该信息。我正在寻找纯PL/SQL解决方案(我刚刚编辑了添加此信息的问题)。我只能从最小示例(11g XE)中获得
PLW-05018
。并非所有变量都以V开头_
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>