Според документация на Oracle ,
PL/SQL се основава на езика за програмиране Ada. PL/SQL използва вариант на описателна междинна приписана нотация за Ada (DIANA), междинен език с дървовидна структура. Дефинира се с помощта на мета-нотация, наречена Interface Definition Language (IDL) .DIANA се използва вътрешно от компилатори и други инструменти.
По време на компилиране изходният код на PL/SQL се превежда в машинно четим m-код. И DIANA, и m-кодът за процедура или пакет се съхраняват в базата данни. По време на изпълнение те се зареждат в споделения пул от памет. DIANA се използва за компилиране на зависими процедури; m-кодът просто се изпълнява.
За съжаление не можете да оцените броя на DIANA възлите от анализирания размер. Две програмни единици с еднакъв анализиран размер може да изискват съответно 1500 и 2000 DIANA възли, тъй като например втората единица съдържа по-сложни SQL изрази.
Повече относно изчисленията на възли DIANA, прочетете тази книга „Ada-Europe '93:12-та международна конференция Ada-Europe, „Ada Sans Frontieres“, Париж, Франция, 14-18 юни 1993 г. Доклади“
Следната бележка за поддръжка обхваща добре тази тема...
Article-ID: <Note:62603.1>
Folder: PLSQL
Topic: General Information Articles
Title: 'PLS-123 Program too Large' - Size Limitations on PLSQL
Packages
Document-Type: BULLETIN
Impact: MEDIUM
Skill-Level: NOVICE
Server-Version: 07 to 08
Updated-Date: 13-JUN-2000 17:41:01
References:
Общ преглед
Тази статия съдържа информация за ограниченията на размера на PL/SQL пакета. Когато ограниченията са достигнати, получавате следната грешка:
PLS-123 Program too large
Ограничения на размера на PL/SQL пакети
В версии преди 8.1.3 големите програми водеха до грешка PLS-123. Това се случи поради истински ограничения в компилатора; не в резултат на грешка.
Когато компилира PL/SQL единица, компилаторът изгражда дърво за анализ. Максималният размер на aPL/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 реда код.
Бележки:Това ново ограничение се прилага само за тела на опаковки и типови тела. Освен това сега можете да започнете да достигате някои други ограничения на компилатора, преди да достигнете този конкретен лимит на компилатора.
По отношение на размера на изходния код, приемете, че токените (идентификатори, оператори, функции и т.н.) са с дължина средно четири знака. Тогава максимумът ще бъде:
Up to 7.3: 4 * (2 * * 14)=64K
From 8.0 to 8.1.3: 4 * (2 * * 15)=128K
With 8.1.3: 4 * (2 * * 25)=256M
Това е груба оценка. Ако вашият код има много интервали, дълги идентификатори и т.н., може да получите изходен код, по-голям от този. Може също да се окажете с изходен код, по-малък от този, ако вашите източници използват много кратки идентификатори и т.н.
Имайте предвид, че това е за програмна единица, така че телата на пакетите е най-вероятно да срещнат това ограничение.
Как да проверите текущия размер на пакет
За да проверите размера на пакет, най-близкият свързан номер, който можете да използвате, е PARSED_SIZE в изгледа на речника на данните USER_OBJECT_SIZE. Тази стойност предоставя размера на инбайтовете DIANA, съхранени в таблиците SYS.IDL_xxx$ и НЕ е размерът в споделения пул.
Размерът на частта DIANA от PL/SQL кода (използван по време на компилация) е МНОГО по-голям в споделения пул, отколкото в системната таблица.
Например, може да започнете да изпитвате проблеми с ограничение от 64K, когато PARSED_SIZE в USER_OBJECT_SIZE не е повече от 50K.
За пакет анализираният размер или размерът на DIANA има смисъл само за целия обект, а не отделно за спецификацията и тялото.
Ако изберете parsed_size за пакет, получавате отделни размери на източника и кода за спецификацията и тялото, но само смислен анализиран размер за целия обект, който се извежда на реда за спецификацията на пакета. Извежда се 0 за parsed_size на реда за тялото на пакета.
Следният пример демонстрира това поведение:
CREATE OR REPLACE PACKAGE example AS
PROCEDURE dummy1;
END example;
/
CREATE OR REPLACE PACKAGE BODY example AS
PROCEDURE dummy1 IS
BEGIN
NULL;
END;
END;
/
SQL> start t1.sql;
Package created.
Package body created.
SQL> select parsed_size from user_object_size where name='EXAMPLE';
PARSED_SIZE
-----------
185
0
SQL> select * from user_object_size where name='EXAMPLE';
.....
Oracle съхранява както DIANA, така и MCODE в базата данни. MCODE е действителният код, който се изпълнява, докато DIANA за конкретна библиотечна единица X съдържа информация, която е необходима за компилиране на процедури с помощта на библиотечна единица X.
Следват няколко бележки:
а) ДИАНА е представена в IDL. Линейната версия на IDL се съхранява на диск. Действителното дърво за анализ се изгражда и съхранява в споделения пул. Ето защо размерът на DIANA в споделения пул обикновено е по-голям, отколкото на диска.
b) DIANA за извикани процедури се изисква в споделения пул само когато създавате процедури. В производствените системи няма нужда от DIANA в споделения пул (но само за MCODE).
c) Започвайки с версия 7.2, DIANA за тела на пакети се изхвърля, не се използва и не се съхранява в базата данни. Ето защо PARSED_SIZE (т.е. размерът на DIANA) на PACKAGE BODIES е 0.
Пакетът се съхранява в DIANA в базата данни, точно като процедура. Пакетът обаче може да се използва за прекъсване на веригата на зависимости, което може би ще премахне това. Вярвам, че ВСИЧКИ производствен (реален) код трябва да бъде в пакет, никога в самостоятелна процедура или функция.