PLS-00123: слишком большая программа (узлы Diana) при попытке скомпилировать пакет - PullRequest
11 голосов
/ 10 февраля 2011

При компиляции пакета я столкнулся с сообщением об ошибке:

Error: PLS-00123: program too large (Diana nodes)
Line: 1

В рассматриваемом пакете около 1 тыс. Строк (спецификация) + 13 тыс. Строк в теле.В ходе исследования этого вопроса я столкнулся с этим вопросом Ask Tom

При компиляции модуля PL / SQL компилятор создает дерево разбора.Максимальный размер модуля PL / SQL определяется размером дерева разбора.Максимальное количество узлов дианы существует в этом дереве.

До 7,3, у вас может быть 2**14 (16K) узлов дианы, и от 8,0 до 8.1,3, 2**15 (32K) узлов дианы былопозволил.В 8.1.3 этот предел был ослаблен, так что теперь вы можете иметь 2**26 (то есть 64M) узлов дианы в этом дереве для тел пакетов и типов.

Хотя простого способа перевестиОграничения с точки зрения строк исходного кода, мы наблюдали, что на строку исходного кода приходилось приблизительно от 5 до 10 узлов.До 8.1.3 компилятор мог без проблем компилировать до 3000 строк кода.
Начиная с 8.1.3, ограничение было ослаблено для тел пакетов и тел типов, которые теперь могут иметь приблизительно до 6 000 000 строк кода..

Это приблизительная оценка.Если в вашем коде много пробелов, длинных идентификаторов и т. Д., Вы можете получить исходный код, который больше этого.

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

Более того,

Как проверить текущий размер пакета:

Чтобы проверить размер пакета, ближайший связанный номер, который вы можете использовать, это PARSED_SIZE в представлении словаря данных USER_OBJECT_SIZE.Это значение предоставляет размер DIANA в байтах, который хранится в таблицах SYS.IDL_xxx$, и НЕ является размером в общем пуле.

[...]

Например, вы можете начать испытывать проблемы с пределом 64 КБ, когда PARSED_SIZE в USER_OBJECT_SIZE не превышает 50 КБ.

Запрос этого представления дает результат 48929 - поэтому я предполагаю, что его размер равен 47k?

Странная часть заключается в том, чтобы извлечь тот же объект из другой схемы и запустить его в области I 'Если у меня возникли проблемы, это приведет к успешной компиляции.

Так почему именно эта область вызывает проблемы?

1 Ответ

6 голосов
/ 22 февраля 2011

Добавляет ли отладочная программа в программу код вашей информации? Очевидно, это имеет значение, показанное на этом сообщении на форуме .

Проблема при выполнении компиляции для отладка это дополнительный код, который добавляется для отладки.

Вы можете попробовать эти запросы, чтобы увидеть:

ALTER PACKAGE debug COMPILE;
SELECT type, source_size, parsed_size, code_size
FROM user_object_size
WHERE name = 'DEBUG';

ALTER PACKAGE debug COMPILE DEBUG;
SELECT type, source_size, parsed_size, code_size
FROM user_object_size
WHERE name = 'DEBUG';

Обратите внимание на различия в code_size при компиляции для отладки.

Если вы компилируете с помощью DEBUG, попробуйте скомпилировать в обычном режиме, чтобы он не генерировал дополнительный код, который может генерировать вашу ошибку.

...