首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle PL/SQL:如何在长包中找到未使用的变量?

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

Stack Overflow用户
提问于 2014-04-04 16:49:22
回答 3查看 4.3K关注 0票数 3

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

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

提前感谢您的帮助。

编辑(2014年4月7日):我正在使用Oracle10G.

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-05 10:20:35

以下仅适用于11g R2。看起来像PL/Scope已在11g R1中可用

您将无法通过PLSQL_WARNINGS='ENABLE:ALL'获得有关未使用变量的信息

代码语言:javascript
复制
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样式)派生的

代码语言:javascript
复制
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只是上面提到的博客文章中的一个剪切和粘贴。因为我发现它很有用,所以我还在比特桶中提供了脚本。

票数 5
EN

Stack Overflow用户

发布于 2014-04-04 17:13:08

将会话设置为报告所有警告:

代码语言:javascript
复制
ALTER SESSION SET PLSQL_WARNINGS='ENABLE:ALL';

然后编译你的代码。如果编译表明存在错误,如下面所示:

代码语言:javascript
复制
SP2-0804: Procedure created with compilation warnings

显示任何错误:

代码语言:javascript
复制
SHO ERR

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

分享并享受。

票数 2
EN

Stack Overflow用户

发布于 2014-04-12 21:37:04

PL/SQL等待分配内存,直到分配变量,然后只分配所需的存储空间。所以不用担心消耗内存。(来源)

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22868567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档