Oracle Paket PL/SQL: Tipe, Spesifikasi, Isi [Contoh]
โก Ringkasan Cerdas
Paket PL/SQL mengelompokkan prosedur, fungsi, variabel, kursor, dan pengecualian yang terkait ke dalam satu objek skema dengan spesifikasi dan isi. Spesifikasi mendeklarasikan antarmuka publik, sedangkan isi berisi implementasi privat, sehingga meningkatkan modularitas dan kinerja.

Apa yang dimaksud dengan Paket Oracle?
Oracle PL / SQL paket adalah grup logisping terkait subprogram (prosedur/fungsi) menjadi satu elemen tunggal. Sebuah paket dikompilasi dan disimpan sebagai objek basis data yang dapat digunakan kembali di kemudian hari.
Komponen Paket
Sebuah paket PL/SQL memiliki dua komponen.
- Spesifikasi Paket
- Badan Paket
Spesifikasi Paket
Spesifikasi paket terdiri dari deklarasi semua informasi publik. variabel, kursor, objek, prosedur, fungsi, dan pengecualian.
Berikut beberapa karakteristik dari spesifikasi paket tersebut.
- Elemen-elemen yang dideklarasikan dalam spesifikasi dapat diakses dari luar paket. Elemen-elemen tersebut dikenal sebagai elemen publik.
- Spesifikasi paket merupakan elemen mandiri, yang berarti spesifikasi tersebut dapat berdiri sendiri tanpa badan paket.
- Setiap kali sebuah paket dirujuk, sebuah instance dari paket tersebut akan dibuat untuk sesi tertentu itu.
- Setelah instance dibuat untuk suatu sesi, semua elemen paket yang dimulai dalam instance tersebut valid hingga akhir sesi.
Sintaksis
CREATE [OR REPLACE] PACKAGE <package_name> IS <sub_program and public element declaration> . . END <package name>
Sintaks di atas menunjukkan pembuatan spesifikasi paket.
Badan Paket
Isi paket terdiri dari definisi semua elemen yang ada dalam spesifikasi paket. Isi paket juga dapat mencakup definisi elemen yang tidak dideklarasikan dalam spesifikasi; elemen-elemen ini disebut elemen privat dan hanya dapat dipanggil dari dalam paket.
Berikut adalah karakteristik dari sebuah badan kemasan.
- Dokumen ini harus memuat definisi untuk semua subprogram/kursor yang telah dideklarasikan dalam spesifikasi.
- Program tersebut juga dapat memiliki lebih banyak subprogram atau elemen lain yang tidak dideklarasikan dalam spesifikasi. Ini disebut elemen privat.
- Ini adalah objek dependen, dan bergantung pada spesifikasi paket.
- Status badan paket menjadi 'Tidak Valid' setiap kali spesifikasi dikompilasi. Oleh karena itu, perlu dikompilasi ulang setiap kali setelah kompilasi spesifikasi.
- Elemen privat harus didefinisikan terlebih dahulu sebelum digunakan dalam badan paket.
- Bagian pertama dari isi paket adalah bagian deklarasi global. Ini termasuk variabel, kursor, dan elemen privat (deklarasi maju) yang terlihat oleh seluruh paket.
- Bagian terakhir dari paket ini adalah bagian inisialisasi paket yang dieksekusi satu kali setiap kali paket tersebut dirujuk untuk pertama kalinya dalam sesi.
sintaks:
CREATE [OR REPLACE] PACKAGE BODY <package_name> IS <global_declaration part> <Private element definition> <sub_program and public element definition> . <Package Initialization> END <package_name>
Sintaks di atas menunjukkan pembuatan isi paket.
Sekarang kita akan melihat bagaimana cara merujuk elemen paket dalam program.
Merujuk Elemen Paket
Setelah elemen-elemen dideklarasikan dan didefinisikan dalam paket, kita perlu merujuk pada elemen-elemen tersebut untuk menggunakannya.
Semua elemen publik dari paket dapat dirujuk dengan memanggil nama paket diikuti dengan nama elemen yang dipisahkan oleh titik, yaitu ' . '.
Variabel publik dari paket tersebut juga dapat digunakan dengan cara yang sama untuk menetapkan dan mengambil nilai darinya, yaitu ' . '.
Buat Paket di PL/SQL
Dalam PL/SQL, setiap kali sebuah paket dirujuk atau dipanggil dalam sebuah sesi, sebuah instance baru akan dibuat untuk paket tersebut.
Oracle menyediakan fasilitas untuk menginisialisasi elemen paket atau melakukan aktivitas apa pun pada saat pembuatan instance ini melalui 'Inisialisasi Paket'.
Ini hanyalah blok eksekusi yang ditulis di dalam isi paket setelah mendefinisikan semua elemen paket. Blok ini akan dieksekusi setiap kali sebuah paket dirujuk untuk pertama kalinya dalam sesi tersebut.
Tangkapan layar di bawah ini menunjukkan bagaimana blok inisialisasi paket ditempatkan di dalam badan paket saat membuat paket.
Sintaksis
CREATE [OR REPLACE] PACKAGE BODY <package_name> IS <Private element definition> <sub_program and public element definition> . BEGIN <Package Initialization> END <package_name>
Sintaks di atas menunjukkan definisi inisialisasi paket di badan paket.
Deklarasi Maju
Deklarasi atau referensi maju dalam sebuah paket tidak lain adalah mendeklarasikan elemen-elemen privat secara terpisah dan mendefinisikannya di bagian selanjutnya dari isi paket.
Elemen privat hanya dapat dirujuk jika sudah dideklarasikan di dalam badan paket. Karena alasan ini, deklarasi maju (forward declaration) digunakan. Namun, penggunaannya agak tidak biasa, karena sebagian besar elemen privat dideklarasikan dan didefinisikan di bagian pertama badan paket.
Deklarasi maju adalah opsi yang disediakan oleh OracleHal ini tidak wajib, dan penggunaannya atau tidak sepenuhnya tergantung pada kebutuhan programmer.
Tangkapan layar di bawah ini menunjukkan bagaimana elemen privat dideklarasikan terlebih dahulu dan kemudian didefinisikan di dalam isi paket.
sintaks:
CREATE [OR REPLACE] PACKAGE BODY <package_name> IS <Private element declaration> . . . <Public element definition that refer the above private element> . . <Private element definition> . BEGIN <package_initialization code>; END <package_name>
Sintaks di atas menunjukkan deklarasi maju. Elemen privat dideklarasikan secara terpisah di bagian maju paket, dan telah didefinisikan di bagian selanjutnya.
Penggunaan Kursor dalam Paket
Berbeda dengan elemen lainnya, kita perlu berhati-hati saat menggunakan kursor di dalam paket.
Jika kursor didefinisikan dalam spesifikasi paket atau di bagian global dari isi paket, maka kursor, setelah dibuka, akan tetap ada hingga akhir sesi.
Oleh karena itu, seseorang harus selalu menggunakan atribut kursor '%ISOPEN' untuk memverifikasi status kursor sebelum merujuk padanya.
Kelebihan beban
Overloading adalah konsep memiliki banyak subprogram dengan nama yang sama. Subprogram-subprogram ini berbeda satu sama lain berdasarkan jumlah parameter, tipe parameter, atau tipe nilai kembalian. Dengan kata lain, subprogram dengan nama yang sama tetapi dengan jumlah parameter yang berbeda, tipe parameter yang berbeda, atau tipe nilai kembalian yang berbeda dianggap sebagai overloading.
Ini berguna ketika banyak subprogram perlu melakukan tugas yang sama, tetapi cara memanggil masing-masing subprogram harus berbeda. Dalam hal ini, nama subprogram tetap sama untuk semuanya, dan parameter diubah sesuai dengan pernyataan pemanggilan.
Contoh 1: Dalam contoh ini, kita akan membuat sebuah paket untuk mengambil dan mengatur nilai informasi karyawan dalam tabel 'emp'. Fungsi get_record akan mengembalikan output tipe record untuk nomor karyawan yang diberikan, dan prosedur set_record akan memasukkan record tipe tersebut ke dalam tabel emp.
Langkah 1) Pembuatan Spesifikasi Paket
Tangkapan layar di bawah ini menunjukkan spesifikasi paket guru99_get_set yang sedang dibuat di Oracle.
CREATE OR REPLACE PACKAGE guru99_get_set IS PROCEDURE set_record (p_emp_rec IN emp%ROWTYPE); FUNCTION get_record (p_emp_no IN NUMBER) RETURN emp%ROWTYPE; END guru99_get_set; /
Keluaran:
Package created
Code Penjelasan
- Code baris 1-5: Membuat spesifikasi paket untuk guru99_get_set dengan satu prosedur dan satu fungsi. Kedua elemen ini sekarang menjadi elemen publik dari paket ini.
Langkah 2) Paket tersebut berisi badan paket, tempat definisi sebenarnya dari semua prosedur dan fungsi ditentukan. Pada langkah ini, badan paket dibuat.
Tangkapan layar di bawah ini menunjukkan definisi isi paket guru99_get_set di Oracle.
CREATE OR REPLACE PACKAGE BODY guru99_get_set IS PROCEDURE set_record(p_emp_rec IN emp%ROWTYPE) IS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN INSERT INTO emp VALUES(p_emp_rec.emp_name,p_emp_rec.emp_no, p_emp_rec.salary,p_emp_rec.manager); COMMIT; END set_record; FUNCTION get_record(p_emp_no IN NUMBER) RETURN emp%ROWTYPE IS l_emp_rec emp%ROWTYPE; BEGIN SELECT * INTO l_emp_rec FROM emp where emp_no=p_emp_no; RETURN l_emp_rec; END get_record; BEGIN dbms_output.put_line('Control is now executing the package initialization part'); END guru99_get_set; /
Keluaran:
Package body created
Code Penjelasan
- Code baris 7: Membuat isi paket.
- Code baris 9-16: Mendefinisikan elemen 'set_record' yang dideklarasikan dalam spesifikasi. Ini sama dengan mendefinisikan prosedur mandiri dalam PL/SQL.
- Code baris 17-24: Mendefinisikan elemen 'get_record'. Ini sama dengan mendefinisikan fungsi mandiri.
- Code baris 25-26: Mendefinisikan bagian inisialisasi paket.
Langkah 3) Membuat blok anonim untuk memasukkan dan menampilkan data dengan merujuk pada paket yang telah dibuat di atas.
Tangkapan layar di bawah ini menunjukkan blok anonim yang memanggil paket tersebut, beserta outputnya. Oracle.
DECLARE l_emp_rec emp%ROWTYPE; l_get_rec emp%ROWTYPE; BEGIN dbms_output.put_line('Insert new record for employee 1004'); l_emp_rec.emp_no:=1004; l_emp_rec.emp_name:='CCC'; l_emp_rec.salary:=20000; l_emp_rec.manager:='BBB'; guru99_get_set.set_record(l_emp_rec); dbms_output.put_line('Record inserted'); dbms_output.put_line('Calling get function to display the inserted record'); l_get_rec:=guru99_get_set.get_record(1004); dbms_output.put_line('Employee name: '||l_get_rec.emp_name); dbms_output.put_line('Employee number:'||l_get_rec.emp_no); dbms_output.put_line('Employee salary:'||l_get_rec.salary); dbms_output.put_line('Employee manager:'||l_get_rec.manager); END; /
Keluaran:
Insert new record for employee 1004 Control is now executing the package initialization part Record inserted Calling get function to display the inserted record Employee name: CCC Employee number: 1004 Employee salary: 20000 Employee manager: BBB
Code Penjelasan:
- Code baris 34-37: Mengisi data untuk variabel tipe record dalam blok anonim untuk memanggil elemen 'set_record' dari paket tersebut.
- Code baris 38: Panggilan telah dilakukan ke 'set_record' dari paket guru99_get_set. Sekarang paket tersebut diinisialisasi, dan akan tetap ada hingga akhir sesi. Bagian inisialisasi paket dieksekusi karena ini adalah panggilan pertama ke paket tersebut, dan data dimasukkan oleh elemen 'set_record' ke dalam tabel.
- Code baris 41: Memanggil elemen 'get_record' untuk menampilkan detail karyawan yang dimasukkan. Paket tersebut dirujuk untuk kedua kalinya selama panggilan ini, tetapi bagian inisialisasi tidak dieksekusi lagi, karena paket tersebut sudah diinisialisasi dalam sesi ini.
- Code baris 42-45: Mencetak rincian karyawan.
Ketergantungan dalam Paket
Karena paket tersebut merupakan grup logisping Karena terkait dengan hal-hal lain, ia memiliki beberapa ketergantungan. Berikut adalah ketergantungan yang perlu diperhatikan.
- Spesifikasi adalah objek yang berdiri sendiri.
- Bentuk kemasan bergantung pada spesifikasi.
- Bagian isi paket dapat dikompilasi secara terpisah. Setiap kali spesifikasi dikompilasi, bagian isi paket perlu dikompilasi ulang, karena akan menjadi tidak valid.
- Subprogram dalam badan paket yang bergantung pada elemen privat hanya boleh didefinisikan setelah deklarasi elemen privat tersebut.
- Objek basis data yang dirujuk dalam spesifikasi dan isi paket harus dalam status valid pada saat kompilasi paket.
Informasi Paket
Setelah paket dibuat, informasi paket seperti sumber paket, detail subprogram, dan detail kelebihan beban tersedia di Oracle tabel kamus data.
Tabel di bawah ini memberikan tabel kamus data dan informasi paket yang tersedia di setiap tabel.
| Nama Tabel | Deskripsi | Pertanyaan |
|---|---|---|
| SEMUA_OBJEK | Memberikan detail paket seperti object_id, creation_date, last_ddl_time, dll. Paket ini berisi objek-objek yang dibuat oleh semua pengguna. | PILIH * DARI semua_objek di mana nama_objek =' ' |
| OBJEK_PENGGUNA | Memberikan detail paket seperti object_id, creation_date, last_ddl_time, dll. Paket ini berisi objek-objek yang dibuat oleh pengguna saat ini. | PILIH * DARI objek_pengguna di mana nama_objek =' ' |
| SEMUA_SUMBER | Memberikan sumber objek yang dibuat oleh semua pengguna. | PILIH * DARI all_source dimana nama=' ' |
| USER_SOURCE | Memberikan sumber objek yang dibuat oleh pengguna saat ini. | PILIH * DARI sumber_pengguna di mana nama=' ' |
| SEMUA_PROSEDUR | Menampilkan detail subprogram seperti object_id, detail overload, dll. yang dibuat oleh semua pengguna. | SELECT * FROM all_procedures Where object_name=' ' |
| USER_PROSEDUR | Memberikan rincian subprogram seperti object_id, rincian kelebihan beban, dsb. yang dibuat oleh pengguna saat ini. | SELECT * FROM user_procedures Where object_name=' ' |
UTL_FILE โ Gambaran Umum
UTL_FILE adalah paket utilitas terpisah yang disediakan oleh Oracle untuk melakukan tugas-tugas khusus. Fungsi utamanya adalah membaca dan menulis file sistem operasi dari paket atau subprogram PL/SQL. Ia memiliki fungsi terpisah untuk memasukkan informasi ke dalam dan mengambil informasi dari file. Ia juga memungkinkan pembacaan dan penulisan dalam set karakter asli.
Programmer dapat menggunakan ini untuk menulis file sistem operasi dari berbagai jenis, dan file tersebut akan langsung ditulis ke server basis data. Nama dan jalur direktori disebutkan pada saat penulisan.





