Podle dokumentace Oracle ,
PL/SQL je založeno na programovacím jazyce Ada.PL/SQL používá variantu Descriptive Intermediate Attributed Notation for Ada (DIANA), stromově strukturovaný zprostředkující jazyk. Je definován pomocí metanotace zvané Interface Definition Language (IDL). .DIANA je interně používána kompilátory a dalšími nástroji.
V době kompilace je zdrojový kód PL/SQL přeložen do strojově čitelného m-kódu. DIANA i m-kód pro proceduru nebo balíček jsou uloženy v databázi. Za běhu jsou načteny do sdílené paměti. DIANA se používá ke kompilaci závislých procedur; m-kód se jednoduše provede.
Počet uzlů DIANA bohužel nemůžete odhadnout z analyzované velikosti. Dvě programové jednotky se stejnou analyzovanou velikostí mohou vyžadovat 1500 a 2000 uzlů DIANA, protože například druhá jednotka obsahuje složitější příkazy SQL.
Více o výpočtech uzlů DIANA si přečtěte tuto knihu "Ada-Europe '93:12th Ada-Europe International Conference, "Ada Sans Frontieres", Paříž, Francie, 14.-18. června 1993. Proceedings"
Následující poznámka podpory pokrývá toto téma dobře...
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:
Přehled
Tento článek obsahuje informace o omezení velikosti balíčku PL/SQL. Při dosažení limitů se zobrazí následující chyba:
PLS-123 Program too large
Omezení velikosti u balíčků PL/SQL
Ve verzích před 8.1.3 vedly velké programy k chybě PLS-123. K tomu došlo kvůli skutečným limitům v kompilátoru; ne v důsledku chyby.
Při kompilaci jednotky PL/SQL kompilátor vytvoří strom analýzy. Maximální velikost jednotky aPL/SQL je určena velikostí stromu analýzy. V tomto stromu existuje maximální počet uzlů Diana.
Do 7.3 jste mohli mít 2 * * 14 (16K) uzlů diana a od 8.0 do 8.1.3 bylo povoleno 2 * * 15 (32K) uzlů diana. Ve verzi 8.1.3 byl tento limit uvolněn, takže nyní můžete mít v tomto stromu 2 * * 26 (tj. 64 milionů) uzlů diana pro těla balíčků a typů.
Omezení zdrojového kódu
I když neexistuje snadný způsob, jak přeložit limity z hlediska řádků zdrojového kódu, podle našich pozorování bylo přibližně 5 až 10 uzlů na řádek zdrojového kódu. Před verzí 8.1.3 mohl kompilátor čistě zkompilovat až 3 000 řádků kódu.
Počínaje verzí 8.1.3 byl limit uvolněn pro těla balíčků a těla typů, která nyní mohou mít přibližně až 6 000 000 řádků kódu.
Poznámky:Tento nový limit se vztahuje pouze na těla balíků a těla typů. Také můžete nyní začít narážet na některé další limity kompilátoru, než dosáhnete tohoto konkrétního limitu kompilátoru.
Pokud jde o velikost zdrojového kódu, předpokládejme, že tokeny (identifikátory, operátory, funkce atd.) mají v průměru čtyři znaky. Potom by maximum bylo:
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
Toto je hrubý odhad. Pokud má váš kód mnoho mezer, dlouhých identifikátorů atd., můžete skončit se zdrojovým kódem větším, než je tento. Můžete také skončit s menším zdrojovým kódem, pokud vaše zdroje používají velmi krátké identifikátory atd.
Všimněte si, že se jedná o jednotku programu, takže těla balíčků s největší pravděpodobností narazí na tento limit.
Jak zkontrolovat aktuální velikost balíčku
Chcete-li zkontrolovat velikost balíku, nejbližší související číslo, které můžete použít, je PARSED_SIZE v zobrazení datového slovníku USER_OBJECT_SIZE. Tato hodnota poskytuje velikost inbytů DIANA, jak je uložena v tabulkách SYS.IDL_xxx$ a NENÍ velikost ve sdíleném fondu.
Velikost části DIANA kódu PL/SQL (použité při kompilaci) je MNOHEM větší ve sdíleném fondu než v systémové tabulce.
Můžete například začít mít problémy s limitem 64 kB, když PARSED_SIZE v USER_OBJECT_SIZE není větší než 50 kB.
U balíčku má analyzovaná velikost nebo velikost DIANA smysl pouze pro celý objekt, nikoli samostatně pro specifikaci a tělo.
Pokud vyberete parsed_size pro balíček, obdržíte samostatné velikosti zdroje a kódu pro specifikaci a tělo, ale pouze smysluplnou analyzovanou velikost pro celý objekt, který je výstupem na řádku pro specifikaci balíčku. 0 je výstupem pro parsed_size na řádku pro tělo balíčku.
Následující příklad ukazuje toto chování:
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 ukládá do databáze DIANA i MCODE. MCODE je skutečný kód, který běží, zatímco DIANA pro konkrétní knihovní jednotku X obsahuje informace, které jsou potřebné pro kompilaci procedur pomocí knihovní jednotky X.
Následuje několik poznámek:
a) DIANA je zastoupena v IDL. Lineární verze IDL je uložena na disku. Aktuální strom analýzy je vytvořen a uložen ve sdíleném fondu. To je důvod, proč je velikost DIANA ve sdíleném fondu obvykle větší než na disku.
b) DIANA pro volané procedury je vyžadována ve sdíleném fondu pouze při vytváření procedur. V produkčních systémech není potřeba DIANA ve sdíleném fondu (ale pouze pro MCODE).
c) Počínaje verzí 7.2 je DIANA pro těla balíčků vyhozena, nepoužívá se a neukládá se do databáze. To je důvod, proč je PARSED_SIZE (tj. velikost DIANA) u PACKAGE BODIES 0.
Balíček je uložen v DIANA v databázi, stejně jako procedura. Balíček lze však použít k přerušení řetězce závislostí, což možná odstraní. Jsem přesvědčen, že ALLproduction (skutečný) kód by měl být v balíčku, nikdy v samostatné proceduře nebo funkci.