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.

  • ๐Ÿ“ฆ Definisi Paket: Paket adalah grup logis.ping dari subprogram dan objek terkait, yang dikompilasi dan disimpan sebagai satu objek basis data tunggal.
  • ๐Ÿ“‹ Spesifikasi Paket: Mendeklarasikan variabel publik, kursor, tipe, pengecualian, prosedur, dan fungsi yang dapat diakses dari luar paket.
  • ๐Ÿงฑ Isi Paket: Mendefinisikan setiap elemen yang dideklarasikan dalam spesifikasi, ditambah elemen privat yang hanya dapat dipanggil dari dalam paket.
  • ๐Ÿ” Kelebihan beban: Beberapa subprogram dapat memiliki nama yang sama meskipun jumlah parameter, tipe parameter, atau tipe nilai kembaliannya berbeda.
  • ๐Ÿ”— Rujukan dan Ketergantungan: Elemen publik disebut sebagai package_name.element_name, dan isi elemen tetap bergantung pada spesifikasi.
  • ๐Ÿค– Bantuan AI: Asisten AI seperti GitHub Copilot menyusun spesifikasi paket, isi, dan subprogram yang kelebihan beban dari sebuah komentar.

Oracle Gambaran umum spesifikasi paket PL/SQL dan struktur badannya.

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.

Membuat paket PL/SQL dengan blok inisialisasi paket di dalam isi 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.

Deklarasi maju dari elemen privat dalam sebuah Oracle Isi paket PL/SQL

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.

Membuat spesifikasi paket guru99_get_set dengan set_record dan get_record 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.

Mendefinisikan isi paket guru99_get_set dengan set_record, get_record, dan blok inisialisasi.

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.

Blok anonim memanggil guru99_get_set untuk memasukkan dan menampilkan catatan karyawan dengan output.

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.

Pertanyaan Umum Demo Slot

Paket memberikan modularitas, penyembunyian informasi, dan desain aplikasi yang lebih mudah. โ€‹โ€‹Spesifikasi mengekspos antarmuka publik sementara isi paket menyembunyikan implementasi. Oracle Memuat paket ke dalam memori pada panggilan pertama, sehingga panggilan subprogram selanjutnya menghindari I/O disk dan berjalan lebih cepat.

Sebuah paket mengelompokkan banyak hal yang terkait. subprogram dan objek bersama di bawah satu nama, memisahkan spesifikasi publik dari badan privat. Prosedur atau fungsi mandiri adalah objek skema tunggal dan independen tanpa pemisahan antarmuka-implementasi tersebut.

Ya, jika spesifikasi hanya mendeklarasikan variabel, konstanta, tipe, atau pengecualian. Bagian isi menjadi wajib setelah spesifikasi mendeklarasikan prosedur, fungsi, atau kursor apa pun, karena bagian isi harus menyediakan implementasinya. Jika tidak, spesifikasi dapat berdiri sendiri.

Gunakan DROP PACKAGE untuk menghapus spesifikasi dan isi paket, atau DROP PACKAGE BODY untuk menghapus hanya isi paket. Kompilasi ulang paket yang tidak valid dengan ALTER PACKAGE package_name COMPILE, atau COMPILE BODY untuk membangun ulang hanya isi paket setelah perubahan.

Atribut %ROWTYPE mendeklarasikan sebuah catatan yang kolom-kolomnya sesuai dengan kolom-kolom pada tabel emp. Menggunakan emp%ROWTYPE menjaga agar parameter get_record dan set_record tetap selaras dengan struktur tabel, sehingga perubahan kolom membutuhkan lebih sedikit pengeditan kode.

Ya. Setiap sesi yang merujuk pada sebuah paket akan mendapatkan instansiasi dan status paketnya sendiri, yang akan bertahan selama masa aktif sesi tersebut. Mengkompilasi ulang isi paket akan membuang status tersebut dan menimbulkan kesalahan ORA-04068 pada panggilan berikutnya.

Ya. Kopilot GitHub menyusun spesifikasi paket, badan yang sesuai, dan subprogram yang kelebihan beban dari komentar, dan menyarankan parameter %ROWTYPE. RevLihat batasan yang dihasilkan, blok inisialisasi, dan penanganan pengecualian sebelum melakukan deployment.

Asisten AI memindai sebuah paket untuk mencari status yang tidak valid, definisi badan yang hilang, dan rantai ketergantungan yang rusak ketika spesifikasi berubah. Tinjauan pembelajaran mesin ini menandai subprogram yang kelebihan beban dan ambigu serta risiko kompilasi ulang sebelum paket mencapai tahap produksi.

Ringkaslah postingan ini dengan: