Sesuai Dokumentasi Oracle ,
PL/SQL didasarkan pada bahasa pemrograman Ada.PL/SQL menggunakan varian dari Descriptive Intermediate Attributed Notation for Ada (DIANA), bahasa perantara berstruktur pohon. Ini didefinisikan menggunakan meta-notasi yang disebut Interface Definition Language (IDL) .DIANA digunakan secara internal oleh kompiler dan alat lainnya.
Pada waktu kompilasi, kode sumber PL/SQL diterjemahkan ke dalam kode-m yang dapat dibaca mesin. Baik DIANA maupun kode-m untuk suatu prosedur atau paket disimpan dalam database. Saat dijalankan, kode-kode tersebut dimuat ke dalam kumpulan memori bersama. DIANA digunakan untuk mengkompilasi prosedur dependen; kode-m hanya dieksekusi.
Sayangnya, Anda tidak dapat memperkirakan jumlah node DIANA dari ukuran yang diurai. Dua unit program dengan ukuran parsing yang sama mungkin memerlukan 1500 dan 2000 node DIANA, masing-masing karena, misalnya, unit kedua berisi pernyataan SQL yang lebih kompleks.
Lebih lanjut tentang perhitungan simpul DIANA, baca buku ini "Ada-Europe '93:12th Ada-Europe International Conference, "Ada Sans Frontieres", Paris, France, 14-18 Juni 1993. Prosiding"
Catatan dukungan berikut mencakup topik ini dengan baik...
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:
Ringkasan
Artikel ini berisi informasi tentang batasan ukuran paket PL/SQL. Saat batas tercapai, Anda menerima kesalahan berikut:
PLS-123 Program too large
Batasan Ukuran pada Paket PL/SQL
Dalam rilis sebelum 8.1.3, program besar menghasilkan kesalahan PLS-123. Ini terjadi karena batas asli dalam kompiler; bukan karena bug.
Saat mengkompilasi unit PL/SQL, kompiler membuat pohon parse. Ukuran maksimum unit aPL/SQL ditentukan oleh ukuran pohon parse. Jumlah maksimum node diana ada di pohon ini.
Hingga 7.3, Anda dapat memiliki 2 * * 14 (16K) node diana, dan dari 8.0 hingga 8.1.3, 2 * * 15 (32K) node diana diizinkan. Dengan 8.1.3, batas ini telah dilonggarkan sehingga Anda sekarang dapat memiliki 2 * * 26 (yaitu, 64M) simpul diana di pohon ini untuk badan paket dan tipe.
Batas Kode Sumber
Meskipun tidak ada cara mudah untuk menerjemahkan batasan dalam bentuk baris kode sumber, menurut pengamatan kami, ada sekitar 5 hingga 10 node per baris kode sumber. Sebelum 8.1.3, kompiler dapat dengan rapi mengompilasi hingga sekitar 3.000 baris kode.
Dimulai dengan 8.1.3, batas dilonggarkan untuk badan paket dan badan tipe yang sekarang dapat memiliki kira-kira hingga sekitar 6.000.000 baris kode.
Catatan:Batas baru ini hanya berlaku untuk badan paket dan badan tipe. Selain itu, Anda sekarang dapat mulai mencapai beberapa batas kompiler lain sebelum Anda mencapai batas kompiler khusus ini.
Dalam hal ukuran kode sumber, asumsikan bahwa token (pengidentifikasi, operator, fungsi, dll.), rata-rata memiliki panjang empat karakter. Maka, maksimumnya adalah:
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
Ini adalah perkiraan kasar. Jika kode Anda memiliki banyak spasi, pengidentifikasi panjang, dll., Anda mungkin akan mendapatkan kode sumber yang lebih besar dari ini. Anda mungkin juga mendapatkan kode sumber yang lebih kecil dari ini jika sumber Anda menggunakan pengenal yang sangat pendek, dll.
Perhatikan bahwa ini adalah per unit program, jadi badan paket kemungkinan besar akan menemui batas ini.
Cara Memeriksa Ukuran Paket Saat Ini
Untuk memeriksa ukuran paket, nomor terkait terdekat yang dapat Anda gunakan adalah PARSED_SIZE dalam tampilan kamus data USER_OBJECT_SIZE. Nilai ini memberikan ukuran inbyte DIANA seperti yang disimpan di tabel SYS.IDL_xxx$ dan BUKAN ukuran di kumpulan bersama.
Ukuran porsi DIANA dari kode PL/SQL (digunakan selama kompilasi) JAUH lebih besar di kumpulan bersama daripada di tabel sistem.
Misalnya, Anda mungkin mulai mengalami masalah dengan batas 64K saat PARSED_SIZE diUSER_OBJECT_SIZE tidak lebih dari 50K.
Untuk sebuah paket, ukuran atau ukuran DIANA yang diurai hanya masuk akal untuk keseluruhan objek, tidak secara terpisah untuk spesifikasi dan bodi.
Jika Anda memilih parsed_size untuk sebuah paket, Anda menerima ukuran kode dan sumber terpisah untuk spesifikasi dan isi, tetapi hanya ukuran parsing yang berarti untuk keseluruhan objek yang merupakan keluaran pada baris untuk spesifikasi paket. A 0 adalah output untuk parsed_size pada baris untuk badan paket.
Contoh berikut menunjukkan perilaku ini:
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 menyimpan DIANA dan MCODE dalam database. MCODE adalah kode aktual yang berjalan, sedangkan DIANA untuk perpustakaan tertentu unit X berisi informasi yang diperlukan untuk mengkompilasi prosedur menggunakan perpustakaan unit X.
Berikut beberapa catatannya:
a) DIANA diwakili dalam IDL. Versi linier IDL disimpan di disk. Pohon parse yang sebenarnya dibangun dan disimpan di kolam bersama. Inilah sebabnya mengapa ukuran DIANA di kumpulan bersama biasanya lebih besar daripada di disk.
b) DIANA untuk prosedur yang dipanggil diperlukan di kumpulan bersama hanya ketika Anda membuat prosedur. Dalam sistem produksi, DIANA tidak diperlukan di kumpulan bersama (tetapi hanya untuk MCODE).
c) Dimulai dengan rilis 7.2, DIANA untuk badan paket dibuang, tidak digunakan, dan tidak disimpan dalam database. Inilah mengapa PARSED_SIZE (yaitu ukuran DIANA) dari PACKAGE BODIES adalah 0.
Sebuah paket disimpan di DIANA dalam database, seperti sebuah prosedur. Namun, sebuah paket dapat digunakan untuk memutuskan rantai ketergantungan, mungkin membuatnya hilang. Ini adalah keyakinan saya bahwa ALLproduction (nyata) kode harus dalam satu paket, tidak pernah dalam prosedur atau fungsi yang berdiri sendiri.