Rumah >pangkalan data >Oracle >Bagaimanakah saya menggunakan koleksi dalam PL/SQL (array, rekod, jadual)?

Bagaimanakah saya menggunakan koleksi dalam PL/SQL (array, rekod, jadual)?

Johnathan Smith
Johnathan Smithasal
2025-03-13 13:15:17304semak imbas

Cara Menggunakan Koleksi Dalam PL/SQL (Array, Rekod, Jadual)

PL/SQL menawarkan beberapa jenis pengumpulan untuk menguruskan kumpulan data yang berkaitan, meningkatkan kecekapan kod dan kebolehbacaan. Ini termasuk jadual bersarang, array bersekutu (jadual indeks), dan rekod. Mari kita periksa setiap:

Rekod: Rekod adalah serupa dengan struktur dalam bahasa lain. Mereka mengumpulkan unsur -unsur jenis data yang berbeza di bawah satu nama. Mereka diisytiharkan dengan pernyataan TYPE dan kemudian digunakan untuk mengisytiharkan pembolehubah.

 <code class="sql">DECLARE TYPE employee_record IS RECORD ( employee_id NUMBER, employee_name VARCHAR2(50), salary NUMBER ); emp employee_record; BEGIN emp.employee_id := 123; emp.employee_name := 'John Doe'; emp.salary := 60000; DBMS_OUTPUT.PUT_LINE('Employee ID: ' || emp.employee_id); END; /</code>

Jadual bersarang: Jadual bersarang diperintahkan koleksi jenis data homogen. Mereka membenarkan senarai panjang berubah-ubah.

 <code class="sql">DECLARE TYPE num_list IS TABLE OF NUMBER; numbers num_list := num_list(1, 2, 3, 4, 5); BEGIN FOR i IN numbers.FIRST .. numbers.LAST LOOP DBMS_OUTPUT.PUT_LINE(numbers(i)); END LOOP; END; /</code>

Arahan bersekutu (jadual indeks): Ini adalah serupa dengan peta hash atau kamus dalam bahasa lain. Mereka menyimpan pasangan nilai kunci, di mana kunci mestilah subtipe PLS_INTEGER dan nilai boleh menjadi jenis data.

 <code class="sql">DECLARE TYPE emp_salary IS TABLE OF NUMBER INDEX BY VARCHAR2(50); salaries emp_salary; BEGIN salaries('John Doe') := 60000; salaries('Jane Smith') := 75000; DBMS_OUTPUT.PUT_LINE('John Doe salary: ' || salaries('John Doe')); END; /</code>

Memilih jenis koleksi yang sesuai bergantung kepada keperluan khusus anda. Rekod adalah sesuai untuk mengumpulkan elemen data yang berkaitan, jadual bersarang untuk senarai yang diperintahkan, dan array bersekutu untuk carian nilai utama.

Apakah implikasi prestasi menggunakan jenis pengumpulan yang berbeza dalam PL/SQL?

Implikasi prestasi menggunakan jenis koleksi yang berbeza berbeza bergantung pada bagaimana ia digunakan dan saiz data. Umum:

  • Rekod: Rekod mempunyai overhead prestasi yang minimum kerana pada dasarnya hanya struktur. Mengakses elemen individu adalah pantas.
  • Jadual bersarang: Prestasi boleh dipengaruhi oleh saiz jadual bersarang. Operasi seperti menambahkan unsur -unsur ke meja bersarang besar mungkin lebih perlahan daripada operasi setara pada jadual yang lebih kecil. Juga, mengambil unsur -unsur tertentu dengan indeks boleh lebih cepat daripada mencari elemen mengikut nilai.
  • Arus bersekutu: Mengakses unsur -unsur mengikut kunci umumnya sangat cepat, menjadikannya sesuai untuk mencari yang kerap. Walau bagaimanapun, prestasi boleh merosot dengan tatasusunan yang sangat besar disebabkan oleh kemungkinan perlanggaran hash. Iterasi melalui array bersekutu adalah lebih perlahan daripada lelaran melalui meja bersarang.

Saiz koleksi dan kekerapan operasi (sisipan, penghapusan, carian) sangat mempengaruhi prestasi keseluruhan. Untuk dataset yang sangat besar, pertimbangkan untuk mengoptimumkan corak akses dan berpotensi menggunakan pendekatan alternatif seperti pandangan yang terwujud atau fungsi pipelined.

Bagaimanakah saya dapat lulus koleksi dengan cekap sebagai parameter kepada prosedur dan fungsi PL/SQL?

Lulus koleksi sebagai parameter dengan cekap melibatkan pemahaman mod lulus yang berlainan (masuk, keluar) dan memilih kaedah yang sesuai berdasarkan keperluan anda. Menggunakan atribut %ROWTYPE di mana sesuai juga meningkatkan prestasi.

Dalam parameter: Ini adalah cara yang paling biasa untuk lulus koleksi. Koleksi ini diluluskan sebagai nilai baca sahaja. Prosedur atau fungsi menerima salinan koleksi, yang boleh menjadi cekap untuk koleksi yang lebih kecil tetapi boleh kurang cekap untuk yang sangat besar.

Parameter keluar: Prosedur atau fungsi mengubahsuai pengumpulan dan mengembalikan versi yang diubahsuai.

Dalam Parameter Keluar: Koleksi kedua -duanya diluluskan dan diubahsuai dalam prosedur atau fungsi, dan versi yang diubahsuai dikembalikan.

Contoh Menggunakan dalam parameter:

 <code class="sql">CREATE OR REPLACE PROCEDURE process_numbers (numbers IN num_list) IS BEGIN -- Process the numbers collection END; /</code>

Untuk koleksi yang sangat besar, pertimbangkan untuk meluluskannya dengan merujuk menggunakan jenis objek dan bukan secara langsung lulus koleksi. Ini dapat mengurangkan overhead memori menyalin dataset besar.

Bolehkah saya menggunakan koleksi untuk meningkatkan kecekapan kod PL/SQL saya, dan jika ya, bagaimana?

Ya, koleksi dapat meningkatkan kecekapan kod PL/SQL anda dengan beberapa cara:

  • Mengurangkan Konteks Beralih: Daripada membuat pelbagai panggilan pangkalan data untuk mendapatkan baris individu, anda boleh mengambil keseluruhan koleksi dalam satu panggilan, mengurangkan konteks menukar overhead antara PL/SQL dan pangkalan data.
  • Pemprosesan Batch: Koleksi membolehkan anda melakukan operasi batch, seperti memasukkan atau mengemas kini pelbagai baris dalam satu pernyataan, meningkatkan prestasi dengan ketara berbanding pemprosesan baris demi baris individu.
  • Kebolehbacaan dan penyelenggaraan yang lebih baik: Menggunakan koleksi untuk kumpulan berkaitan data meningkatkan kebolehbacaan kod dan menjadikannya lebih mudah untuk dikekalkan.
  • Pengambilan data yang dioptimumkan: Dengan mengambil data berkaitan ke dalam koleksi, anda boleh mengelakkan carian pangkalan data berulang untuk data yang sama. Ini amat berguna apabila berhadapan dengan hubungan induk-terperinci.

Contoh kecekapan yang lebih baik:

Daripada pendekatan yang tidak cekap ini:

 <code class="sql">FOR i IN 1..1000 LOOP SELECT column1 INTO variable1 FROM table1 WHERE id = i; -- Process variable1 END LOOP;</code>

Gunakan pendekatan yang lebih cekap ini menggunakan jadual bersarang:

 <code class="sql">DECLARE TYPE num_list IS TABLE OF NUMBER; data num_list; BEGIN SELECT id BULK COLLECT INTO data FROM table1 WHERE id BETWEEN 1 AND 1000; FOR i IN data.FIRST .. data.LAST LOOP -- Process data(i) END LOOP; END; /</code>

Dengan menggunakan BULK COLLECT INTO , anda mengambil semua 1000 ID dalam satu pangkalan data sepanjang perjalanan, meningkatkan prestasi dengan ketara. Prinsip ini juga berlaku untuk operasi pangkalan data lain. Ingatlah untuk memilih jenis pengumpulan yang sesuai untuk prestasi optimum berdasarkan struktur data dan corak akses anda.

Atas ialah kandungan terperinci Bagaimanakah saya menggunakan koleksi dalam PL/SQL (array, rekod, jadual)?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn