I henhold til Oracle-dokumentation ,
PL/SQL er baseret på programmeringssproget Ada.PL/SQL bruger en variant af Descriptive Intermediate Attributed Notation for Ada (DIANA), et træstruktureret mellemsprog. Det defineres ved hjælp af en meta-notation kaldet Interface Definition Language (IDL) .DIANA bruges internt af compilere og andre værktøjer.
På kompileringstidspunktet oversættes PL/SQL-kildekoden til maskinlæsbar m-kode. Både DIANA og m-koden for en procedure eller pakke gemmes i databasen. Ved kørselstiden indlæses de i den delte hukommelsespulje. DIANA bruges til at kompilere afhængige procedurer; m-koden udføres simpelthen.
Desværre kan du ikke estimere antallet af DIANA-noder ud fra den parsede størrelse. To programenheder med den samme parsede størrelse kræver muligvis henholdsvis 1500 og 2000 DIANA-noder, fordi den anden enhed f.eks. indeholder mere komplekse SQL-sætninger.
Mere om DIANA nodeberegninger, læs denne bog "Ada-Europe '93:12th Ada-Europe International Conference, "Ada Sans Frontieres", Paris, Frankrig, 14.-18. juni 1993. Proceedings"
Følgende supportnotat dækker dette emne godt...
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:
Oversigt
Denne artikel indeholder oplysninger om begrænsninger for PL/SQL-pakkestørrelse. Når grænserne er nået, får du følgende fejlmeddelelse:
PLS-123 Program too large
Størrelsesbegrænsninger på PL/SQL-pakker
I udgivelser før 8.1.3 resulterede store programmer i PLS-123-fejlen. Dette skete på grund af ægte grænser i compileren; ikke som følge af en fejl.
Når du kompilerer en PL/SQL-enhed, bygger compileren et parsetræ. Den maksimale størrelse af aPL/SQL-enhed bestemmes af størrelsen på parsetræet. Der findes et maksimalt antal diana-knuder i dette træ.
Op til 7.3 kunne du have 2 * * 14 (16K) diananoder, og fra 8.0 til 8.1.3 var 2 * * 15 (32K) diananoder tilladt. Med 8.1.3 er denne grænse blevet slækket, så du nu kan have 2 * * 26 (dvs. 64M) diananoder i dette træ for pakke- og typetekster.
Kildekodegrænser
Selvom der ikke er nogen nem måde at oversætte grænserne i form af linjer med kildekode, har det været vores observation, at der har været cirka 5 til 10 noder pr. linje kildekode. Før 8.1.3 kunne compileren rent kompilere op til omkring 3.000 kodelinjer.
Startende med 8.1.3 blev grænsen lempet for pakkekroppe og typelegemer, som nu kan have cirka op til omkring 6.000.000 linjer kode.
Bemærkninger:Denne nye grænse gælder kun for pakkekroppe og typelegemer. Du kan også nu begynde at ramme nogle andre compilergrænser, før du rammer denne særlige compilergrænse.
Med hensyn til kildekodestørrelse, antag, at tokens (identifikatorer, operatorer, funktioner osv.) i gennemsnit er fire tegn lange. Så ville maksimum være:
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
Dette er et groft skøn. Hvis din kode har mange mellemrum, lange identifikatorer osv., kan du ende med en kildekode, der er større end dette. Du kan også ende med en kildekode, der er mindre end dette, hvis dine kilder bruger meget korte identifikatorer osv.
Bemærk, at dette er pr. programenhed, så pakkekroppe vil sandsynligvis støde på denne grænse.
Sådan kontrollerer du den aktuelle størrelse af en pakke
For at kontrollere størrelsen på en pakke er det nærmeste relaterede nummer, du kan bruge, PARSED_SIZE i dataordbogsvisningen USER_OBJECT_SIZE. Denne værdi angiver størrelsen af DIANA-inbytes som gemt i SYS.IDL_xxx$-tabellerne og er IKKE størrelsen i den delte pulje.
Størrelsen af DIANA-delen af PL/SQL-koden (brugt under kompilering) er MEGET større i den delte pulje, end den er i systemtabellen.
For eksempel kan du begynde at opleve problemer med en 64K-grænse, når PARSED_SIZE iUSER_OBJECT_SIZE ikke er mere end 50K.
For en pakke giver den analyserede størrelse eller størrelse af DIANA kun mening for hele objektet, ikke separat for specifikationen og kroppen.
Hvis du vælger parsed_size for en pakke, modtager du separate kilde- og kodestørrelser for specifikationen og brødteksten, men kun en meningsfuld parsed størrelse for hele objektet, som udlæses på linjen for pakkespecifikationen. Et 0 udlæses for parsed_size på linjen for pakkens krop.
Følgende eksempel viser denne adfærd:
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 gemmer både DIANA og MCODE i databasen. MCODE er den faktiske kode, der kører, mens DIANA for en bestemt biblioteksenhed X indeholder information, der er nødvendig for at kompilere procedurer ved hjælp af biblioteksenhed X.
Følgende er flere bemærkninger:
a) DIANA er repræsenteret i IDL. Den lineære version af IDL er gemt på disken. Det faktiske parsetræ er bygget op og opbevaret i den fælles pool. Dette er grunden til, at størrelsen på DIANA i den delte pulje typisk er større end på disken.
b) DIANA for kaldte procedurer er kun påkrævet i den delte pulje, når du opretter procedurer. I produktionssystemer er der ikke behov for DIANA i den fælles pulje (men kun for MCODE).
c) Fra og med release 7.2 bliver DIANA for pakkelegemer smidt ud, ikke brugt og ikke gemt i databasen. Dette er grunden til, at PARSED_SIZE (dvs. størrelsen på DIANA) af PACKAGE BODIES er 0.
En pakke gemmes i DIANA i databasen, ligesom en procedure. En pakke kan dog bruges til at bryde afhængighedskæden og måske få denne til at gå væk. Det er min overbevisning, at ALLproduction (rigtig) kode skal være i en pakke, aldrig i en selvstændig procedure eller funktion.