Предположим, у вас есть пакет Oracle PL / SQL, содержащий около 200 000 строк кода.

Есть ли какой-нибудь быстрый способ обнаружить переменные, объявленные, но не используемые в пакете?

Заранее благодарю вас за вашу любезную помощь.

ИЗМЕНИТЬ (7 апреля 2014 г.): я использую Oracle 10G.

РЕДАКТИРОВАТЬ: я ищу чистое решение PL / SQL.

3
UltraCommit 4 Апр 2014 в 20:49
2
«Анализ кода» в TOAD 12
 – 
Egor Skriptunoff
4 Апр 2014 в 20:58
1
Вы ищете чистое решение PL/SQL или SQL, или вы открыты для сторонних инструментов? Например, комментарий Егора выше, а также PL/SQL Developer автоматически отобразит эту информацию при компиляции тела пакета.
 – 
Jon Heller
7 Апр 2014 в 21:31
Я ищу чистое решение PL/SQL (я только что отредактировал вопрос, добавив эту информацию).
 – 
UltraCommit
7 Апр 2014 в 23:29

3 ответа

Лучший ответ

Следующее относится только к 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 / Scope.

Следующий пример получен из Oracle 11g - Генерация предупреждений компилятора PL / SQL (стиль Java) с использованием 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.

5
user272735 5 Апр 2014 в 14:20

Настройте сеанс так, чтобы сообщать обо всех предупреждениях:

ALTER SESSION SET PLSQL_WARNINGS='ENABLE:ALL';

Затем скомпилируйте свой код. Если компиляция указывает, что есть ошибки, вы получите что-то вроде следующего:

SP2-0804: Procedure created with compilation warnings

Отображать любые ошибки:

SHO ERR

Если у вас есть какие-либо переменные, на которые нет ссылок, они должны быть указаны в списке ошибок. В качестве альтернативы используйте такой инструмент, как PL / SQL Developer, который автоматически показывает вам эти ошибки после компиляции.

Поделитесь и наслаждайтесь.

2
Bob Jarvis - Слава Україні 4 Апр 2014 в 21:13
Я смог получить только PLW-05018 из минимального примера (11g XE).
 – 
user272735
4 Апр 2014 в 21:41

PL / SQL ожидает выделения памяти, пока вы не назначите переменную, а затем только выделяет столько памяти, сколько необходимо. Так что не нужно беспокоиться о потреблении памяти. (Источник)

Таким образом, поиск и исправление неиспользуемых переменных - это всего лишь служебная задача, которая не улучшит производительность пакета. Другими словами, самым простым решением было бы ничего не делать.

Если вас все равно беспокоят неиспользуемые переменные, вы можете найти их, просто проанализировав исходный код пакета с помощью инструментов командной строки, таких как grep, sort и uniq (особенно если они следуют стандарту кодирования, например, все переменные начинаются с v_).

1
Matthew Strawbridge 13 Апр 2014 в 01:37
Не все переменные начинаются с V_
 – 
UltraCommit
14 Апр 2014 в 15:27