Oracle Paket PL/SQL: Tipe, Spesifikasi, Isi [Contoh]
Apa yang dimaksud dengan Paket Oracle?
Paket PL/SQL adalah pengelompokan logis dari subprogram terkait (prosedur/fungsi) menjadi satu elemen. Paket dikompilasi dan disimpan sebagai objek basis data yang dapat digunakan nanti.
Komponen Paket
Paket PL/SQL memiliki dua komponen.
- Spesifikasi Paket
- Badan Paket
Spesifikasi Paket
Spesifikasi paket terdiri dari deklarasi semua publik variabel, kursor, objek, prosedur, fungsi, dan pengecualian.
Berikut adalah beberapa karakteristik spesifikasi Paket.
- Elemen-elemen yang semuanya dideklarasikan dalam spesifikasi dapat diakses dari luar paket. Unsur-unsur tersebut dikenal dengan unsur publik.
- Spesifikasi paket adalah elemen mandiri yang berarti dapat berdiri sendiri tanpa isi paket.
- Setiap kali sebuah paket dirujuk, sebuah instance dari paket tersebut dibuat untuk sesi tertentu.
- 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
Ini terdiri dari definisi semua elemen yang ada dalam spesifikasi paket. Ia juga dapat memiliki definisi elemen yang tidak dideklarasikan dalam spesifikasi, elemen ini disebut elemen privat dan hanya dapat dipanggil dari dalam paket.
Di bawah ini adalah ciri-ciri badan paket.
- Ini harus berisi definisi untuk semua subprogram/kursor yang telah dinyatakan dalam spesifikasi.
- Ia juga dapat memiliki lebih banyak subprogram atau elemen lain yang tidak dinyatakan dalam spesifikasi. Ini disebut elemen privat.
- Ini adalah objek yang dapat diandalkan, dan bergantung pada spesifikasi paket.
- Keadaan 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 paket ini adalah bagian deklarasi global. Ini termasuk variabel, kursor, dan elemen privat (deklarasi penerusan) yang dapat dilihat oleh seluruh paket.
- Bagian terakhir dari paket adalah bagian inisialisasi paket yang dijalankan satu kali setiap kali paket dirujuk pertama kali dalam sesi tersebut.
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 badan paket.
Sekarang kita akan melihat bagaimana mereferensikan elemen paket dalam program.
Merujuk Elemen Paket
Setelah elemen dideklarasikan dan didefinisikan dalam paket, kita perlu merujuk elemen tersebut untuk menggunakannya.
Semua elemen publik dari paket dapat dirujuk dengan memanggil nama paket diikuti dengan nama elemen yang dipisahkan dengan titik yaitu ' . '.
Variabel publik dari paket 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/dipanggil dalam suatu sesi, sebuah instance baru akan dibuat untuk paket itu.
Oracle menyediakan fasilitas untuk menginisialisasi elemen paket atau melakukan aktivitas apa pun pada saat pembuatan instance ini melalui 'Inisialisasi Paket'.
Ini tidak lain adalah blok eksekusi yang ditulis di badan paket setelah mendefinisikan semua elemen paket. Blok ini akan dieksekusi setiap kali sebuah paket dirujuk untuk pertama kalinya dalam sesi tersebut.
Sintaksis
CREATE [OR REPLACE] PACKAGE BODY <package_name> IS <Private element definition> <sub_program and public element definition> . BEGINE <Package Initialization> END <package_name>
- Sintaks di atas menunjukkan definisi inisialisasi paket di badan paket.
Deklarasi Maju
Deklarasi/referensi maju dalam paket tidak lain adalah mendeklarasikan elemen-elemen privat secara terpisah dan mendefinisikannya di bagian akhir badan paket.
Elemen privat hanya dapat dirujuk jika sudah dideklarasikan di badan paket. Untuk alasan ini, deklarasi maju digunakan. Tapi ini agak tidak biasa untuk digunakan karena seringkali elemen privat dideklarasikan dan didefinisikan di bagian pertama badan paket.
Deklarasi maju adalah opsi yang disediakan oleh Oracle, ini tidak wajib dan menggunakan atau tidak menggunakan terserah kebutuhan pemrogram.
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
Tidak seperti Elemen lainnya, kita perlu berhati-hati dalam menggunakan kursor di dalam paket.
Jika kursor ditentukan dalam spesifikasi paket atau di bagian global badan paket, maka kursor yang dibuka akan bertahan hingga akhir sesi.
Jadi seseorang harus selalu menggunakan atribut kursor '%ISOPEN' untuk memverifikasi keadaan kursor sebelum merujuknya.
Kelebihan beban
Overloading adalah konsep memiliki banyak subprogram dengan nama yang sama. Subprogram-subprogram ini akan berbeda satu sama lain berdasarkan jumlah parameter atau tipe parameter atau tipe kembalian, yaitu subprogram dengan nama yang sama tetapi dengan jumlah parameter berbeda, tipe parameter berbeda, atau tipe ulang berbeda dianggap sebagai kelebihan beban.
Hal ini berguna ketika banyak subprogram perlu melakukan tugas yang sama, namun cara memanggil masing-masing subprogram harus berbeda. Dalam hal ini, nama subprogram akan tetap sama untuk semua dan parameter akan diubah sesuai pernyataan pemanggil.
Contoh 1: Dalam contoh ini, kita akan membuat sebuah paket untuk mendapatkan dan mengatur nilai informasi karyawan di tabel 'emp'. Fungsi get_record akan mengembalikan output tipe record untuk nomor karyawan yang diberikan, dan prosedur set_record akan memasukkan record tipe record ke dalam tabel emp.
Langkah 1) Pembuatan Spesifikasi Paket
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
Penjelasan Kode
- Baris kode 1-5: Membuat spesifikasi paket untuk guru99_get_set dengan satu prosedur dan satu fungsi. Keduanya kini menjadi elemen publik dari paket ini.
Langkah 2) Paket berisi badan Paket, di mana semua prosedur dan fungsi definisi sebenarnya akan ditentukan. Pada langkah ini, Badan Paket dibuat.
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; BEGUN dbms_output.put_line(‘Control is now executing the package initialization part'); END guru99_get_set: /
Keluaran:
Package body created
Penjelasan Kode
- Baris kode 7: Membuat badan paket.
- Baris kode 9-16: Mendefinisikan elemen 'set_record' yang dideklarasikan dalam spesifikasi. Ini sama dengan mendefinisikan prosedur mandiri di PL/SQL.
- Baris kode 17-24: Mendefinisikan elemen 'get_record'. Ini sama dengan mendefinisikan fungsi mandiri.
- Baris kode 25-26: Mendefinisikan bagian inisialisasi paket.
Langkah 3) Membuat blok anonim untuk menyisipkan dan menampilkan catatan dengan mengacu pada paket yang dibuat di atas.
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:=l004; l_emp_rec.emp_name:='CCC'; l_emp_rec.salary~20000; l_emp_rec.manager:=’BBB’; guru99_get_set.set_record(1_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:‘||1_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
Penjelasan Kode:
- Baris kode 34-37: Mengisi data untuk variabel tipe rekaman dalam blok anonim untuk memanggil elemen 'set_record' dari paket.
- Baris kode 38: Panggilan telah dilakukan ke 'set_record' dari paket guru99_get_set. Sekarang paket tersebut dipakai dan akan bertahan hingga akhir sesi.
- Bagian inisialisasi paket dijalankan karena ini adalah panggilan pertama ke paket.
- Catatan yang disisipkan oleh elemen 'set_record' ke dalam tabel.
- Baris kode 41: Memanggil elemen 'get_record' untuk menampilkan rincian karyawan yang dimasukkan.
- Paket dirujuk untuk kedua kalinya selama panggilan 'get_record' ke paket. Namun bagian inisialisasi kali ini tidak dijalankan karena paket telah diinisialisasi pada sesi ini.
- Baris kode 42-45: Mencetak rincian karyawan.
Ketergantungan dalam Paket
Karena paket adalah pengelompokan logis dari hal-hal yang terkait, maka paket tersebut memiliki beberapa ketergantungan. Berikut ini adalah ketergantungan yang harus diperhatikan.
- Spesifikasi adalah objek yang berdiri sendiri.
- Badan Paket bergantung pada spesifikasi.
- Badan paket dapat dikompilasi secara terpisah. Setiap kali spesifikasi dikompilasi, isi harus dikompilasi ulang karena akan menjadi tidak valid.
- Subprogram dalam badan paket yang bergantung pada elemen privat harus didefinisikan hanya setelah deklarasi elemen privat.
- Objek database yang dirujuk dalam spesifikasi dan isi harus dalam status valid pada saat kompilasi paket.
Informasi Paket
Setelah informasi paket dibuat, informasi paket seperti sumber paket, detail subprogram, dan detail kelebihan beban tersedia di Oracle tabel definisi data.
Tabel di bawah ini memberikan tabel definisi data dan informasi paket yang tersedia dalam tabel.
Nama Tabel | Description | Pertanyaan |
---|---|---|
SEMUA_OBJEK | Memberikan rincian paket seperti object_id, creation_date, last_ddl_time, dsb. Paket ini akan memuat objek-objek yang dibuat oleh semua pengguna. | PILIH * DARI semua_objek di mana nama_objek =' ' |
USER_OBJECT | Memberikan rincian paket seperti object_id, creation_date, last_ddl_time, dsb. Paket ini akan memuat 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 | Memberikan rincian subprogram seperti object_id, rincian kelebihan beban, dll. yang dibuat oleh semua pengguna. | PILIH * DARI semua_prosedur Dimana nama_objek=' ' |
USER_PROSEDUR | Memberikan rincian subprogram seperti object_id, rincian kelebihan beban, dsb. yang dibuat oleh pengguna saat ini. | PILIH * DARI prosedur_pengguna Dimana nama_objek=' ' |
FILE UTL – Gambaran Umum
File UTL adalah paket utilitas terpisah yang disediakan oleh Oracle untuk melakukan tugas-tugas khusus. Ini terutama digunakan untuk membaca dan menulis file sistem operasi dari paket atau subprogram PL/SQL. Ia mempunyai fungsi terpisah untuk menyimpan informasi dan mendapatkan informasi dari file. Ini juga memungkinkan untuk membaca/menulis dalam kumpulan karakter asli.
Pemrogram dapat menggunakan ini untuk menulis file sistem operasi jenis apa pun dan file tersebut akan ditulis langsung ke server database. Nama dan jalur direktori akan disebutkan pada saat penulisan.
Kesimpulan
Kami sekarang telah mempelajari paket-paket di dalamnya PL / SQL, dan Anda sekarang seharusnya dapat bekerja dalam hal berikut.
- Paket PL/SQL dan Komponennya
- Karakteristik paket
- Merujuk dan membebani elemen paket secara berlebihan
- Mengelola dependensi dalam paket
- Melihat informasi paket
- Apa itu File UTL