Zgodnie z dokumentacją Oracle ,
PL/SQL jest oparty na języku programowania Ada.PL/SQL wykorzystuje wariant Descriptive Intermediate Attributed Notation for Ada (DIANA), język pośredni o strukturze drzewa. Jest zdefiniowany za pomocą metanotacji o nazwie Interface Definition Language (IDL) .DIANA jest używana wewnętrznie przez kompilatory i inne narzędzia.
W czasie kompilacji kod źródłowy PL/SQL jest tłumaczony na odczytywalny maszynowo kod m. Zarówno kod DIANA, jak i kod m dla procedury lub pakietu są przechowywane w bazie danych. W czasie wykonywania są ładowane do puli pamięci współdzielonej. DIANA służy do kompilacji procedur zależnych; kod m jest po prostu wykonywany.
Niestety, nie można oszacować liczby węzłów DIANA na podstawie przeanalizowanego rozmiaru. Dwie jednostki programu o tym samym przeanalizowanym rozmiarze mogą wymagać odpowiednio 1500 i 2000 węzłów DIANA, ponieważ na przykład druga jednostka zawiera bardziej złożone instrukcje SQL.
Więcej na temat obliczeń węzłów DIANA, przeczytaj tę książkę „Ada-Europe '93:12. Międzynarodowa Konferencja Ada-Europe, „Ada Sans Frontieres”, Paryż, Francja, 14-18 czerwca 1993. Proceedings”
Poniższa uwaga dotycząca pomocy dobrze opisuje ten temat...
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:
Przegląd
Ten artykuł zawiera informacje na temat ograniczeń rozmiaru pakietów PL/SQL. Po osiągnięciu limitów pojawia się następujący błąd:
PLS-123 Program too large
Ograniczenia rozmiaru pakietów PL/SQL
W wersjach wcześniejszych niż 8.1.3 duże programy powodowały błąd PLS-123. Stało się tak z powodu prawdziwych ograniczeń w kompilatorze; nie w wyniku błędu.
Podczas kompilowania jednostki PL/SQL kompilator buduje drzewo analizy. Maksymalny rozmiar jednostki aPL/SQL jest określony przez rozmiar drzewa analizy. W tym drzewie istnieje maksymalna liczba węzłów Diany.
Do 7,3 można było mieć 2 * * 14 (16K) węzłów Diana, a od 8.0 do 8.1.3 dozwolone były 2 * * 15 (32K) węzłów Diana. W wersji 8.1.3 ten limit został złagodzony, dzięki czemu możesz teraz mieć 2 * * 26 (tj. 64 mln) węzłów Diana w tym drzewie dla treści pakietów i typów.
Limity kodu źródłowego
Chociaż nie ma łatwego sposobu na przetłumaczenie ograniczeń w postaci linii kodu źródłowego, z naszych obserwacji wynika, że na jedną linię kodu źródłowego przypada około 5 do 10 węzłów. Przed wersją 8.1.3 kompilator mógł czysto skompilować do około 3000 linii kodu.
Począwszy od wersji 8.1.3, limit został złagodzony dla treści pakietów i treści typów, które mogą teraz zawierać około 6 000 000 wierszy kodu.
Uwagi:Ten nowy limit dotyczy tylko treści pakietu i treści typu. Ponadto możesz teraz zacząć osiągać inne limity kompilatora, zanim osiągniesz ten konkretny limit kompilatora.
Jeśli chodzi o rozmiar kodu źródłowego, załóżmy, że tokeny (identyfikatory, operatory, funkcje itp.) mają średnio cztery znaki. Wtedy maksymalna wartość to:
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
To jest przybliżone oszacowanie. Jeśli twój kod ma wiele spacji, długich identyfikatorów itp., możesz otrzymać kod źródłowy większy niż ten. Możesz również otrzymać kod źródłowy mniejszy niż ten, jeśli twoje źródła używają bardzo krótkich identyfikatorów itp.
Zauważ, że jest to na jednostkę programu, więc ciała pakietów najprawdopodobniej napotkają ten limit.
Jak sprawdzić aktualny rozmiar paczki
Aby sprawdzić rozmiar pakietu, najbliższy powiązany numer, którego możesz użyć, to PARSED_SIZE w widoku słownika danych USER_OBJECT_SIZE. Ta wartość zapewnia rozmiar inbajtów DIANA przechowywanych w tabelach SYS.IDL_xxx$ i NIE jest rozmiarem w puli współużytkowanej.
Rozmiar części DIANA kodu PL/SQL (używanej podczas kompilacji) jest DUŻO większy w puli współdzielonej niż w tabeli systemowej.
Na przykład możesz zacząć doświadczać problemów z limitem 64 KB, gdy wartość PARSED_SIZE w USER_OBJECT_SIZE nie przekracza 50 KB.
W przypadku pakietu przeanalizowany rozmiar lub rozmiar DIANA ma sens tylko dla całego obiektu, a nie osobno dla specyfikacji i treści.
Jeśli wybierzesz parsed_size dla pakietu, otrzymasz oddzielne rozmiary źródła i kodu dla specyfikacji i treści, ale tylko sensowny rozmiar przeanalizowany dla całego obiektu, który jest wypisywany w wierszu specyfikacji pakietu. Wartość 0 jest wyprowadzana dla parsed_size w wierszu treści pakietu.
Poniższy przykład ilustruje to zachowanie:
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 przechowuje w bazie danych zarówno DIANA, jak i MCODE. MCODE to rzeczywisty kod, który się uruchamia, podczas gdy DIANA dla określonej jednostki biblioteki X zawiera informacje potrzebne do skompilowania procedur przy użyciu jednostki biblioteki X.
Oto kilka uwag:
a) DIANA jest reprezentowana w IDL. Liniowa wersja IDL jest przechowywana na dysku. Rzeczywiste drzewo analizy jest budowane i przechowywane we wspólnej puli. Dlatego rozmiar DIANA w puli współdzielonej jest zazwyczaj większy niż na dysku.
b) DIANA dla wywoływanych procedur jest wymagana w puli współdzielonej tylko podczas tworzenia procedur. W systemach produkcyjnych nie ma potrzeby stosowania DIANA w puli współdzielonej (ale tylko dla MCODE).
c) Począwszy od wydania 7.2, DIANA dla treści pakietów jest wyrzucana, nieużywana i nie jest przechowywana w bazie danych. Dlatego właśnie PARSED_SIZE (tj. rozmiar DIANA) ofPACKAGE BODIES wynosi 0.
Pakiet jest przechowywany w DIANA w bazie danych, podobnie jak procedura. Pakiet może jednak zostać użyty do przerwania łańcucha zależności, być może dzięki czemu zniknie. Uważam, że CAŁY (prawdziwy) kod powinien znajdować się w pakiecie, nigdy w samodzielnej procedurze lub funkcji.