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

Posted

技术标签:

【中文标题】Oracle PL/SQL:如何在长包中查找未使用的变量?【英文标题】:Oracle PL/SQL: How to find unused variables in a long package? 【发布时间】:2014-04-04 16:49:22 【问题描述】:

请假设您有一个包含大约 200,000 行代码的 Oracle PL/SQL 包。

有没有什么快速的方法来检测已声明但未在包中使用的变量?

提前感谢您的热心帮助。

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

编辑:我正在寻找一个纯 PL/SQL 解决方案。

【问题讨论】:

TOAD 12 中的“代码分析” Oracle 11g – Generating PL/SQL Compiler Warnings (Java style) using PL/Scope 您是在寻找纯 PL/SQL 或 SQL 解决方案,还是对第三方工具持开放态度?例如,上面 Egor 的注释,还有 PL/SQL Developer 会在你编译包体时自动显示该信息。 我正在寻找一个纯 PL/SQL 解决方案(我刚刚编辑了添加此信息的问题)。 【参考方案1】:

以下仅适用于 11g R2。看起来像PL/Scope has become available in 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/Scope。

以下示例源自Oracle 11g – Generating PL/SQL Compiler Warnings (Java style) using PL/Scope:

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 只是上面提到的博客文章的剪切和粘贴。因为我发现它很有用,所以我还在 Bitbucket 中提供了该脚本。

【讨论】:

【参考方案2】:

设置您的会话以报告所有警告:

ALTER SESSION SET PLSQL_WARNINGS='ENABLE:ALL';

然后编译您的代码。如果编译表明有错误,你会得到如下内容:

SP2-0804: Procedure created with compilation warnings

显示任何错误:

SHO ERR

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

分享和享受。

【讨论】:

我只能从最小示例(11g XE)中获得PLW-05018【参考方案3】:

PL/SQL 等待分配内存,直到你分配了变量,然后只有 根据需要分配尽可能多的存储空间。所以不用担心消耗内存。 (Source)

因此,查找和修复未使用的变量只是一项日常工作,不会提高包的性能。换句话说,最简单的解决方案就是什么都不做。

如果您仍然担心未使用的变量,您可以通过使用诸如grepsortuniq 等命令行工具解析包源来找到它们(特别是如果它们遵循编码标准,例如以v_开头的所有变量。

【讨论】:

并非所有变量都以 V_ 开头

以上是关于Oracle PL/SQL:如何在长包中查找未使用的变量?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle:使用 SQL 或 PL/SQL 查找动态 SQL 中的错误位置

如何从 Oracle 10G PL/SQL 函数和过程中查找所有表引用? [复制]

Oracle CREATE TYPE 和 PL/SQL

在 oracle 中使用正则表达式查找 POBOX - PL/SQL

如何调用ORACLE程序包中的存储过程

将PL/SQL代码封装在机灵的包中