Koleksi Oracle PL / SQL: Varrays, Bersarang & Indeks mengikut Jadual

Isi kandungan:

Anonim

Apa itu Koleksi?

Koleksi adalah kumpulan elemen yang teratur dari jenis data tertentu. Ini boleh menjadi kumpulan jenis data sederhana atau jenis data kompleks (seperti jenis pengguna atau jenis rekod).

Dalam koleksi, setiap elemen dikenal pasti dengan istilah yang disebut "subscript." Setiap item dalam koleksi diberikan dengan langganan unik. Data dalam koleksi tersebut dapat dimanipulasi atau diambil dengan merujuk pada langganan unik itu.

Koleksi adalah perkara paling berguna apabila data besar jenis yang sama perlu diproses atau dimanipulasi. Koleksi boleh diisi dan dimanipulasi secara keseluruhan menggunakan pilihan 'BULK' di Oracle.

Dalam tutorial ini, anda akan belajar-

  • Apa itu Koleksi?
  • Varrays
  • Jadual Bersarang
  • Jadual mengikut jadual
  • Konsep Pembina dan Permulaan dalam Koleksi
  • Kaedah Pengumpulan

Koleksi dikelaskan berdasarkan struktur, langganan, dan penyimpanan seperti yang ditunjukkan di bawah.

  • Index-by-tables (juga dikenali sebagai Associative Array)
  • Jadual bersarang
  • Varrays

Walau apa pun, data dalam koleksi dapat disebut dengan tiga istilah Nama koleksi, Subscript, Field / Column name sebagai " (). ". Anda akan mengetahui lebih lanjut mengenai kategori koleksi yang disebutkan di atas di bahagian bawah.

Varrays

Varray adalah kaedah pengumpulan di mana ukuran susunan tetap. Ukuran larik tidak boleh melebihi nilai tetapnya. Langganan Varray mempunyai nilai berangka. Berikut adalah sifat Varrays.

  • Ukuran had atas tetap
  • Diisi secara berurutan bermula dengan subskrip '1'
  • Jenis koleksi ini selalu padat, iaitu kita tidak dapat menghapus elemen array. Varray boleh dihapuskan secara keseluruhan, atau dapat dipangkas dari akhir.
  • Oleh kerana sifatnya selalu padat, ia mempunyai fleksibiliti yang sangat sedikit.
  • Lebih sesuai digunakan apabila ukuran array diketahui dan melakukan aktiviti serupa pada semua elemen array.
  • Langganan dan urutan sentiasa stabil, iaitu langganan dan jumlah koleksi selalu sama.
  • Mereka perlu diinisialisasi sebelum menggunakannya dalam program. Sebarang operasi (kecuali operasi EXISTS) pada koleksi yang tidak dimulakan akan menyebabkan kesalahan.
  • Ini dapat dibuat sebagai objek pangkalan data, yang dapat dilihat di seluruh pangkalan data atau di dalam subprogram, yang hanya dapat digunakan dalam subprogram tersebut.

Gambar di bawah akan menerangkan peruntukan memori Varray (padat) secara gambarajah.

Langganan 1 2 3 4 5 6 7
Nilai Xyz Dfv Sde Cxs Vbc Nhu Qwe

Sintaks untuk VARRAY:

TYPE  IS VARRAY () OF ;
  • Dalam sintaks di atas, type_name dinyatakan sebagai VARRAY dari jenis 'DATA_TYPE' untuk had ukuran yang diberikan. Jenis data boleh menjadi jenis mudah atau kompleks.

Jadual Bersarang

Jadual bersarang adalah koleksi di mana ukuran array tidak tetap. Ia mempunyai jenis langganan berangka. Berikut adalah lebih banyak penerangan mengenai jenis jadual bersarang.

  • Jadual Bersarang tidak mempunyai had ukuran atas.
  • Oleh kerana had ukuran atas tidak tetap, koleksi, memori perlu dilanjutkan setiap kali sebelum kita menggunakannya. Kami dapat memperluas koleksi dengan menggunakan kata kunci 'EXTEND'.
  • Diisi secara berurutan bermula dengan subskrip '1'.
  • Jenis koleksi ini boleh menjadi padat dan jarang , yaitu kita dapat membuat koleksi sebagai padat, dan kita juga dapat menghapus elemen array individu secara rawak, yang menjadikannya jarang.
  • Ini memberikan lebih banyak fleksibiliti mengenai penghapusan elemen array.
  • Ini disimpan dalam tabel pangkalan data yang dihasilkan sistem dan dapat digunakan dalam pertanyaan pilih untuk mengambil nilai.
  • Langganan dan urutan tidak stabil, iaitu subskrip dan kiraan elemen array dapat berbeza.
  • Mereka perlu diinisialisasi sebelum menggunakannya dalam program. Sebarang operasi (kecuali operasi EXISTS) pada koleksi yang tidak dimulakan akan menyebabkan kesalahan.
  • Ini dapat dibuat sebagai objek pangkalan data, yang dapat dilihat di seluruh pangkalan data atau di dalam subprogram, yang hanya dapat digunakan dalam subprogram tersebut.

Gambar di bawah akan menerangkan peruntukan memori Jadual Bersarang (padat dan jarang) secara diagram. Ruang elemen berwarna hitam menunjukkan elemen kosong dalam koleksi iaitu jarang.

Langganan 1 2 3 4 5 6 7
Nilai (padat) Xyz Dfv Sde Cxs Vbc Nhu Qwe
Nilai (jarang) Qwe Asd Afg Asd Wer

Sintaks untuk Jadual Bersarang:

TYPE  IS TABLE OF ;
  • Dalam sintaks di atas, type_name dinyatakan sebagai koleksi jadual Bersarang dari jenis 'DATA_TYPE'. Jenis data boleh menjadi jenis mudah atau kompleks.

Jadual mengikut jadual

Index-by-table adalah koleksi di mana ukuran array tidak tetap. Tidak seperti jenis koleksi lain, dalam koleksi index-by-table subscript boleh ditentukan oleh pengguna. Berikut adalah atribut jadual-demi-jadual.

  • Langganan boleh terdiri daripada bilangan bulat atau rentetan. Semasa membuat koleksi, jenis langganan harus disebutkan.
  • Koleksi ini tidak disimpan secara berurutan.
  • Mereka selalu jarang berlaku.
  • Saiz susunan tidak tetap.
  • Mereka tidak dapat disimpan di lajur pangkalan data. Mereka mesti dibuat dan digunakan dalam program apa pun dalam sesi tersebut.
  • Mereka memberikan lebih banyak fleksibiliti dalam hal menjaga langganan.
  • Langganan juga boleh berurutan negatif.
  • Nilai ini lebih sesuai digunakan untuk nilai kolektif yang lebih kecil di mana koleksi dapat dimulakan dan digunakan dalam subprogram yang sama.
  • Mereka tidak perlu dimulakan sebelum mula menggunakannya.
  • Ia tidak dapat dibuat sebagai objek pangkalan data. Itu hanya boleh dibuat di dalam subprogram, yang hanya dapat digunakan dalam subprogram itu.
  • BULK COLLECT tidak dapat digunakan dalam jenis koleksi ini kerana subskrip harus diberikan secara eksplisit untuk setiap catatan dalam koleksi.

Gambar di bawah akan menerangkan peruntukan memori Jadual Bersarang (jarang) secara diagram. Ruang elemen berwarna hitam menunjukkan elemen kosong dalam koleksi iaitu jarang.

Langganan (varchar) PERTAMA KEDUA KETIGA KEEMPAT KELIMA ENAM TUJUH
Nilai (jarang) Qwe Asd Afg Asd Wer

Sintaks untuk Indeks mengikut Jadual

TYPE  IS TABLE OF  INDEX BY VARCHAR2 (10);
  • Dalam sintaks di atas, type_name dinyatakan sebagai koleksi indeks demi jadual dari jenis 'DATA_TYPE'. Jenis data boleh menjadi jenis mudah atau kompleks. Pemboleh ubah subsciprt / index diberikan sebagai jenis VARCHAR2 dengan ukuran maksimum 10.

Konsep Pembina dan Permulaan dalam Koleksi

Pembina adalah fungsi bawaan yang disediakan oleh oracle yang mempunyai nama yang sama dengan objek atau koleksi. Mereka dilaksanakan terlebih dahulu setiap kali objek atau koleksi dirujuk untuk pertama kalinya dalam satu sesi. Berikut adalah butiran penting konstruktor dalam konteks pengumpulan:

  • Untuk koleksi, pembina ini harus dipanggil secara eksplisit untuk memulakannya.
  • Kedua-dua jadual Varray dan Nested perlu diinisialisasi melalui konstruktor ini sebelum dirujuk ke program ini.
  • Konstruktor secara implisit memperluas peruntukan memori untuk koleksi (kecuali Varray), oleh itu konstruktor juga dapat memberikan pemboleh ubah kepada koleksi.
  • Menetapkan nilai ke koleksi melalui konstruktor tidak akan menjadikan koleksi jarang.

Kaedah Pengumpulan

Oracle menyediakan banyak fungsi untuk memanipulasi dan bekerja dengan koleksi. Fungsi-fungsi ini sangat berguna dalam program untuk menentukan dan mengubah atribut koleksi yang berbeza. Jadual berikut akan memberikan fungsi yang berbeza dan keterangannya.

Kaedah Penerangan SISTEM
LUAR BIASA (n) Kaedah ini akan mengembalikan hasil Boolean. Ia akan mengembalikan 'BENAR' jika unsur ke-9 ada dalam koleksi itu, jika tidak, elemen itu akan kembali SALAH. Hanya fungsi EXISTS yang dapat digunakan dalam koleksi yang belum dimulakan .EXISTS (elemen_posisi)
BANYAK Memberikan jumlah elemen yang terdapat dalam koleksi .COUNT
HAD Ia mengembalikan ukuran koleksi maksimum. Untuk Varray, ia akan mengembalikan ukuran tetap yang telah ditentukan. Untuk jadual Bersarang dan Indeks demi jadual, ia memberikan NULL .LIMIT
PERTAMA Mengembalikan nilai pemboleh ubah indeks pertama (subskrip) koleksi . PERTAMA
TERAKHIR Mengembalikan nilai pemboleh ubah indeks terakhir (subskrip) koleksi .LAST
SEBELUM (n) Return mendahului pemboleh ubah indeks dalam kumpulan elemen ke- n . Sekiranya tidak ada nilai indeks terdahulu, NULL dikembalikan .PRIOR (n)
SETERUSNYA (n) Returns berjaya indeks pemboleh ubah dalam koleksi elemen ke-9 . Sekiranya tidak berjaya, nilai indeks NULL dikembalikan .NEXT (n)
BERBELANJA Meluaskan satu elemen dalam koleksi pada akhir .EXTEND
BERBELANJA (n) Memperluas unsur n di akhir koleksi .EXTEND (n)
PERBELANJAAN (n, i) Memanjangkan n salinan i ke- unsur pada akhir pengumpulan .EXTEND (n, i)
TRIM Mengeluarkan satu elemen dari akhir koleksi .TRIM
TRIM (n) Mengeluarkan unsur n dari akhir koleksi .TRIM (n)
HAPUS Memadamkan semua elemen dari koleksi. Menjadikan koleksi kosong .DELETE
HAPUS (n) Memadamkan elemen ke-9 dari koleksi. Sekiranya elemen ke-9 adalah NULL, maka ini tidak akan memberi apa-apa .DELETE (n)
HAPUS (m, n) Memadam unsur dalam lingkungan m th ke n ke dalam koleksi .DELETE (m, n)

Contoh1: Jenis Rekod di peringkat Subprogram

Dalam contoh ini, kita akan melihat bagaimana mengisi koleksi menggunakan 'BULK COLLECT' dan bagaimana merujuk data pengumpulan.

DECLARETYPE emp_det IS RECORD(EMP_NO NUMBER,EMP_NAME VARCHAR2(150),MANAGER NUMBER,SALARY NUMBER);TYPE emp_det_tbl IS TABLE OF emp_det; guru99_emp_rec emp_det_tbl:= emp_det_tbl();BEGININSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1000,’AAA’,25000,1000);INSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1001,'XXX’,10000,1000);INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000);INSERT INTO emp (emp_no,emp_name,salary, manager) VALUES (1003,’ZZZ’,'7500,1000);COMMIT:SELECT emp no,emp_name,manager,salary BULK COLLECT INTO guru99_emp_recFROM emp;dbms_output.put_line (‘Employee Detail');FOR i IN guru99_emp_rec.FIRST… guru99_emp_rec.LASTLOOPdbms_output.put_line (‘Employee Number: '||guru99_emp_rec(i).emp_no);dbms_output.put_line (‘Employee Name: '||guru99_emp_rec(i).emp_name);dbms_output.put_line (‘Employee Salary:'|| guru99_emp_rec(i).salary);dbms_output.put_line(‘Employee Manager Number:'||guru99_emp_rec(i).manager);dbms_output.put_line('--------------------------------');END LOOP;END;/

Penjelasan Kod:

  • Baris kod 2-8 : Jenis rekod 'emp_det' dinyatakan dengan lajur emp_no, emp_name, gaji dan pengurus jenis data NOMBOR, VARCHAR2, NOMOR, NOMBOR.
  • Baris kod 9: Membuat koleksi 'emp_det_tbl' elemen jenis rekod 'emp_det'
  • Baris kod 10: Menyatakan pemboleh ubah 'guru99_emp_rec' sebagai jenis 'emp_det_tbl' dan dimulakan dengan konstruktor nol.
  • Baris kod 12-15: Memasukkan data sampel ke dalam jadual 'emp'.
  • Baris kod 16: Melakukan transaksi sisipan.
  • Baris kod 17: Mengambil rekod dari jadual 'emp' dan mengisi pemboleh ubah koleksi sebagai pukal menggunakan perintah "BULK COLLECT". Kini pemboleh ubah 'guru99_emp_rec' mengandungi semua rekod yang terdapat dalam jadual 'emp'.
  • Baris kod 19-26: Menetapkan gelung 'FOR' untuk mencetak semua rekod dalam koleksi satu persatu. Kaedah pengumpulan PERTAMA dan TERAKHIR digunakan sebagai had gelung yang lebih rendah dan lebih tinggi.

Keluaran : Seperti yang anda lihat dalam tangkapan skrin di atas ketika kod di atas dijalankan, anda akan mendapat output berikut

Employee DetailEmployee Number: 1000Employee Name: AAAEmployee Salary: 25000Employee Manager Number: 1000----------------------------------------------Employee Number: 1001Employee Name: XXXEmployee Salary: 10000Employee Manager Number: 1000----------------------------------------------Employee Number: 1002Employee Name: YYYEmployee Salary: 15000Employee Manager Number: 1000----------------------------------------------Employee Number: 1003Employee Name: ZZZEmployee Salary: 7500Employee Manager Number: 1000----------------------------------------------