Apakah Pakej di Oracle?
Pakej PL / SQL adalah pengelompokan logik subprogram (prosedur / fungsi) yang berkaitan menjadi satu elemen. Pakej disusun dan disimpan sebagai objek pangkalan data yang boleh digunakan kemudian.
Dalam tutorial ini, anda akan belajar-
- Komponen Pakej
- Spesifikasi Pakej
- Badan Pakej
- Merujuk Elemen Pakej
- Buat Pakej dalam PL / SQL
- Pengumuman Maju
- Penggunaan Kursor dalam Pakej
- Beban berlebihan
- Ketergantungan dalam Pakej
- Maklumat Pakej
- UTL FILE - Gambaran Keseluruhan
Komponen Pakej
Pakej PL / SQL mempunyai dua komponen.
- Spesifikasi Pakej
- Badan Pakej
Spesifikasi Pakej
Spesifikasi pakej terdiri dari deklarasi semua pemboleh ubah umum, kursor, objek, prosedur, fungsi, dan pengecualian.
Berikut adalah beberapa ciri spesifikasi Pakej.
- Elemen-elemen yang dinyatakan dalam spesifikasi dapat diakses dari luar paket. Elemen sedemikian dikenali sebagai elemen awam.
- Spesifikasi pakej adalah elemen mandiri yang bermaksud ia boleh wujud sendiri tanpa badan pakej.
- Setiap kali pakej merujuk contoh pakej dibuat untuk sesi tertentu.
- Setelah instance dibuat untuk sesi, semua elemen paket yang dimulakan dalam instance tersebut berlaku hingga akhir sesi.
Sintaks
CREATE [OR REPLACE] PACKAGEIS … END
Sintaks di atas menunjukkan penciptaan spesifikasi pakej.
Badan Pakej
Ia terdiri daripada definisi semua elemen yang terdapat dalam spesifikasi pakej. Ini juga dapat memiliki definisi elemen yang tidak dinyatakan dalam spesifikasi, unsur-unsur ini disebut elemen pribadi dan hanya dapat dipanggil dari dalam paket.
Berikut adalah ciri-ciri badan pakej.
- Ini harus mengandungi definisi untuk semua subprogram / kursor yang telah dinyatakan dalam spesifikasi.
- Ia juga boleh mempunyai lebih banyak subprogram atau elemen lain yang tidak dinyatakan dalam spesifikasi. Ini dipanggil elemen peribadi.
- Ia adalah objek yang boleh dipercayai, dan bergantung pada spesifikasi pakej.
- Keadaan badan pakej menjadi 'Tidak Sah' setiap kali spesifikasi disusun. Oleh itu, ia perlu dikumpulkan semula setiap kali selepas penyusunan spesifikasi.
- Elemen peribadi harus didefinisikan terlebih dahulu sebelum digunakan dalam badan bungkusan.
- Bahagian pertama pakej adalah bahagian pengisytiharan global. Ini merangkumi pemboleh ubah, kursor dan elemen peribadi (deklarasi ke hadapan) yang dapat dilihat oleh keseluruhan pakej.
- Bahagian terakhir pakej adalah bahagian Inisialisasi paket yang dilaksanakan satu kali setiap kali pakej dirujuk kali pertama dalam sesi.
Sintaks:
CREATE [OR REPLACE] PACKAGE BODYIS . END
- Sintaks di atas menunjukkan penciptaan badan pakej.
Sekarang kita akan melihat bagaimana merujuk elemen pakej dalam program.
Merujuk Elemen Pakej
Setelah elemen dinyatakan dan ditentukan dalam pakej, kita perlu merujuk elemen untuk menggunakannya.
Semua elemen umum pakej boleh dirujuk dengan memanggil nama pakej diikuti dengan nama elemen yang dipisahkan dengan noktah iaitu '
Pemboleh ubah umum pakej juga boleh digunakan dengan cara yang sama untuk menetapkan dan mengambil nilai dari mereka iaitu '
Buat Pakej dalam PL / SQL
Dalam PL / SQL setiap kali paket dirujuk / dipanggil dalam sesi, contoh baru akan dibuat untuk paket tersebut.
Oracle menyediakan kemudahan untuk menginisialisasi elemen paket atau melakukan aktiviti apa pun pada saat pembuatan instance ini melalui 'Package Initialization'.
Ini hanyalah blok pelaksanaan yang ditulis dalam badan pakej setelah menentukan semua elemen pakej. Blok ini akan dilaksanakan setiap kali pakej dirujuk untuk pertama kalinya dalam sesi.
Sintaks
CREATE [OR REPLACE] PACKAGE BODYIS .BEGINE END
- Sintaks di atas menunjukkan definisi inisialisasi pakej dalam badan pakej.
Pengumuman Maju
Pengisytiharan / rujukan ke hadapan dalam bungkusan tidak lain adalah menyatakan elemen peribadi secara berasingan dan menentukannya di bahagian kemudian badan pakej.
Elemen peribadi boleh dirujuk hanya jika sudah dinyatakan dalam badan pakej. Atas sebab ini, deklarasi ke hadapan digunakan. Tetapi agak tidak biasa digunakan kerana pada kebanyakan masa elemen peribadi dinyatakan dan ditentukan pada bahagian pertama badan bungkusan.
Pengisytiharan ke hadapan adalah pilihan yang disediakan oleh Oracle, tidak wajib dan menggunakan dan tidak menggunakan adalah bergantung kepada keperluan pengaturcara.
Sintaks:
CREATE [OR REPLACE] PACKAGE BODYIS … … .BEGIN ;END
Sintaks di atas menunjukkan pengisytiharan ke hadapan. Unsur-unsur peribadi dinyatakan secara berasingan di bahagian depan bungkusan, dan mereka telah ditentukan di bahagian kemudian.
Penggunaan Kursor dalam Pakej
Tidak seperti Elemen lain, seseorang harus berhati-hati dalam menggunakan kursor di dalam bungkusan.
Sekiranya kursor didefinisikan dalam spesifikasi paket atau di bahagian global badan pakej, maka kursor sekali dibuka akan berterusan hingga akhir sesi.
Jadi seseorang harus selalu menggunakan atribut kursor '% ISOPEN' untuk mengesahkan keadaan kursor sebelum merujuknya.
Beban berlebihan
Overloading adalah konsep mempunyai banyak subprogram dengan nama yang sama. Subprogram ini akan berbeza antara satu sama lain dengan sejumlah parameter atau jenis parameter atau jenis pengembalian iaitu subprogram dengan nama yang sama tetapi dengan bilangan parameter yang berlainan, jenis parameter yang berbeza atau jenis yang berbeza dianggap sebagai kelebihan beban.
Ini berguna apabila banyak subprogram perlu melakukan tugas yang sama, tetapi cara memanggil masing-masing harus berbeza. Dalam kes ini, nama subprogram akan tetap sama untuk semua dan parameter akan diubah mengikut pernyataan panggilan.
Contoh 1 : Dalam contoh ini, kita akan membuat pakej untuk mendapatkan dan menetapkan nilai maklumat pekerja dalam jadual 'emp'. Fungsi get_record akan mengembalikan output jenis rekod untuk nombor pekerja yang diberikan, dan prosedur set_record akan memasukkan rekod jenis rekod ke dalam jadual emp.
Langkah 1) Pembuatan Spesifikasi Pakej
CREATE OR REPLACE PACKAGE guru99_get_setISPROCEDURE set_record (p_emp_rec IN emp%ROWTYPE);FUNCTION get record (p_emp no IN NUMBER) RETURN emp%ROWTYPE;END guru99_get_set:/
Pengeluaran:
Package created
Penjelasan Kod
- Baris kod 1-5 : Membuat spesifikasi paket untuk guru99_get_set dengan satu prosedur dan satu fungsi. Kedua-duanya kini menjadi elemen umum pakej ini.
Langkah 2) Pakej mengandungi badan Pakej, di mana semua prosedur dan fungsi definisi sebenar akan ditentukan. Dalam langkah ini, Body Package dibuat.
CREATE OR REPLACE PACKAGE BODY guru99_get_setIS PROCEDURE set_record(p_emp_rec IN emp%ROWTYPE)ISPRAGMA AUTONOMOUS_TRANSACTION;BEGININSERT INTO empVALUES(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%ROWTYPEISl_emp_rec emp%ROWTYPE;BEGINSELECT * INTO l_emp_rec FROM emp where emp_no=p_emp_noRETURN l_emp_rec;END get_record;BEGUN dbms_output.put_line(‘Control is now executing the package initialization part');END guru99_get_set:/
Pengeluaran:
Package body created
Penjelasan Kod
- Baris kod 7 : Membuat badan pakej.
- Baris kod 9-16 : Mendefinisikan elemen 'set_record' yang dinyatakan dalam spesifikasi. Ini sama dengan menentukan prosedur mandiri dalam PL / SQL.
- Baris kod 17-24: Mendefinisikan elemen 'get_record'. Ia sama dengan menentukan fungsi mandiri.
- Baris kod 25-26: Mendefinisikan bahagian permulaan paket.
Langkah 3) Membuat blok tanpa nama untuk memasukkan dan memaparkan rekod dengan merujuk pada pakej yang dibuat di atas.
DECLAREl_emp_rec emp%ROWTYPE;l_get_rec emp%ROWTYPE;BEGINdbms 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:/
Pengeluaran:
Insert new record for employee 1004Control is now executing the package initialization partRecord insertedCalling get function to display the inserted recordEmployee name: CCCEmployee number: 1004Employee salary: 20000Employee manager: BBB
Penjelasan Kod:
- Baris kod 34-37: Mengisi data untuk pemboleh ubah jenis rekod dalam blok tanpa nama untuk memanggil elemen 'set_record' pakej.
- Baris kod 38: Panggilan telah dibuat ke 'set_record' pakej guru99_get_set. Sekarang pakej ini disediakan dan ia akan berterusan sehingga akhir sesi.
- Bahagian inisialisasi pakej dijalankan kerana ini adalah panggilan pertama ke pakej.
- Rekod di masukkan oleh elemen 'set_record' ke dalam jadual.
- Baris kod 41: Memanggil elemen 'get_record' untuk memaparkan perincian pekerja yang dimasukkan.
- Pakej dirujuk untuk kali kedua semasa panggilan 'get_record' ke pakej. Tetapi bahagian inisialisasi tidak dilaksanakan kali ini kerana paket sudah dimulakan dalam sesi ini.
- Baris kod 42-45: Mencetak maklumat pekerja.
Ketergantungan dalam Pakej
Oleh kerana pakej adalah pengelompokan logik perkara-perkara yang berkaitan, ia mempunyai beberapa kebergantungan. Berikut adalah kebergantungan yang harus dijaga.
- Spesifikasi adalah objek yang berdiri sendiri.
- Badan Pakej bergantung pada spesifikasi.
- Badan pakej boleh disusun secara berasingan. Setiap kali spesifikasi disusun, badan perlu dikompilasi semula kerana akan menjadi tidak sah.
- Subprogram dalam badan pakej yang bergantung pada elemen peribadi harus ditentukan hanya selepas pengisytiharan elemen peribadi.
- Objek pangkalan data yang disebut dalam spesifikasi dan isi badan harus berada dalam status yang sah pada saat penyusunan paket.
Maklumat Pakej
Setelah maklumat pakej dibuat, maklumat pakej seperti sumber pakej, perincian subprogram, dan perincian kelebihan tersedia dalam jadual definisi data Oracle.
Jadual di bawah memberikan jadual definisi data dan maklumat pakej yang terdapat di dalam jadual.
Nama Jadual | Penerangan | Pertanyaan |
SEMUA_OBJEK | Memberi perincian pakej seperti object_id, create_date, last_ddl_time, dll. Ia akan mengandungi objek yang dibuat oleh semua pengguna. | SELECT * FROM all_objects mana object_name = '
|
PENGGUNA_OBJEK | Memberi perincian pakej seperti object_id, create_date, last_ddl_time, dll. Ia akan mengandungi objek yang dibuat oleh pengguna semasa. | PILIH * DARI user_objects di mana objek_name = '
|
SEMUA_SUMBER | Memberi sumber objek yang dibuat oleh semua pengguna. | PILIH * DARI all_source di mana nama = '
|
PENGGUNA_SUMBER | Memberi sumber objek yang dibuat oleh pengguna semasa. | PILIH * DARI user_source di mana nama = '
|
SEMUA_PROSEDUR | Memberi perincian subprogram seperti objek_id, butiran berlebihan, dan lain-lain yang dibuat oleh semua pengguna. | PILIH * DARI all_procedures Where object_name = '
|
PENGGUNA_PROSEDUR | Memberi perincian subprogram seperti objek_id, butiran berlebihan, dan lain-lain yang dibuat oleh pengguna semasa. | PILIH * DARI user_procedures Where object_name = '
|
UTL FILE - Gambaran Keseluruhan
Fail UTL adalah pakej utiliti berasingan yang disediakan oleh Oracle untuk melaksanakan tugas khas. Ini digunakan terutamanya untuk membaca dan menulis fail sistem operasi dari pakej PL atau SQL atau subprogram. Ia mempunyai fungsi tersendiri untuk meletakkan maklumat dan mendapatkan maklumat dari fail. Ia juga membolehkan membaca / menulis dalam set watak asli.
Pengaturcara dapat menggunakannya untuk menulis fail sistem operasi dari jenis apa pun dan fail tersebut akan ditulis terus ke pelayan pangkalan data. Nama dan laluan direktori akan disebutkan semasa menulis.
Ringkasan
Kami sekarang telah mempelajari pakej-pakej dalam PL / SQL, dan anda seharusnya dapat bekerja seperti berikut.
- Pakej PL / SQL dan Komponennya
- Ciri-ciri pakej
- Merujuk dan memuatkan elemen pakej
- Menguruskan kebergantungan dalam pakej
- Melihat maklumat pakej
- Apa itu Fail UTL