Предположим, у вас есть пакет Oracle PL / SQL, содержащий около 200 000 строк кода.
Есть ли какой-нибудь быстрый способ обнаружить переменные, объявленные, но не используемые в пакете?
Заранее благодарю вас за вашу любезную помощь.
ИЗМЕНИТЬ (7 апреля 2014 г.): я использую Oracle 10G.
РЕДАКТИРОВАТЬ: я ищу чистое решение PL / SQL.
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.
Настройте сеанс так, чтобы сообщать обо всех предупреждениях:
ALTER SESSION SET PLSQL_WARNINGS='ENABLE:ALL';
Затем скомпилируйте свой код. Если компиляция указывает, что есть ошибки, вы получите что-то вроде следующего:
SP2-0804: Procedure created with compilation warnings
Отображать любые ошибки:
SHO ERR
Если у вас есть какие-либо переменные, на которые нет ссылок, они должны быть указаны в списке ошибок. В качестве альтернативы используйте такой инструмент, как PL / SQL Developer, который автоматически показывает вам эти ошибки после компиляции.
Поделитесь и наслаждайтесь.
PLW-05018
из минимального примера (11g XE).
PL / SQL ожидает выделения памяти, пока вы не назначите переменную, а затем только выделяет столько памяти, сколько необходимо. Так что не нужно беспокоиться о потреблении памяти. (Источник)
Таким образом, поиск и исправление неиспользуемых переменных - это всего лишь служебная задача, которая не улучшит производительность пакета. Другими словами, самым простым решением было бы ничего не делать.
Если вас все равно беспокоят неиспользуемые переменные, вы можете найти их, просто проанализировав исходный код пакета с помощью инструментов командной строки, таких как grep
, sort
и uniq
(особенно если они следуют стандарту кодирования, например, все переменные начинаются с v_
).
Похожие вопросы
Связанные вопросы
Новые вопросы
variables
Это амбициозно; ИСПОЛЬЗУЙТЕ СПЕЦИАЛЬНО-ЯЗЫКОВЫЕ ТЕГИ, КОГДА-ЛИБО ПРИМЕНИМЫ Переменная является именованным местом хранения данных в памяти. Используя переменные, компьютерная программа может хранить числа, текст, двоичные данные или комбинацию любого из этих типов данных. Они могут быть переданы в программе.