При компиляции пакета я столкнулся с сообщением об ошибке:
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 'Если у меня возникли проблемы, это приведет к успешной компиляции.
Так почему именно эта область вызывает проблемы?