Kursor dalam PL/SQL menyediakan mekanisme untuk memproses baris data mengikut baris dari set hasil pertanyaan SQL. Mereka bertindak sebagai penunjuk kepada set hasil, membolehkan anda mengambil dan memanipulasi baris individu. Untuk menggunakan kursor, anda mula -mula mengisytiharkannya, kemudian membukanya untuk melaksanakan pertanyaan, mengambil baris satu demi satu, dan akhirnya menutupnya. Inilah kerosakan:
Pengisytiharan: Anda mengisytiharkan kursor menggunakan kata kunci CURSOR
, diikuti dengan nama dan pertanyaan SQL. Pertanyaan harus memilih lajur yang anda perlukan untuk memproses.
<code class="sql">DECLARE CURSOR emp_cursor IS SELECT employee_id, last_name, salary FROM employees WHERE department_id = 10; BEGIN -- Cursor operations will go here END; /</code>
Pembukaan: Pernyataan OPEN
melaksanakan pertanyaan yang berkaitan dengan kursor dan meletakkan kursor sebelum baris pertama.
<code class="sql">OPEN emp_cursor;</code>
Mengambil: Pernyataan FETCH
mengambil satu baris dari set hasil dan menempatkan nilai -nilai ke dalam pembolehubah. Anda perlu mengisytiharkan pembolehubah yang sepadan dengan jenis data lajur yang dipilih dalam pertanyaan kursor.
<code class="sql">DECLARE employee_id employees.employee_id%TYPE; last_name employees.last_name%TYPE; salary employees.salary%TYPE; CURSOR emp_cursor IS ...; -- as declared above BEGIN OPEN emp_cursor; LOOP FETCH emp_cursor INTO employee_id, last_name, salary; EXIT WHEN emp_cursor%NOTFOUND; -- Process the fetched row here DBMS_OUTPUT.PUT_LINE('Employee ID: ' || employee_id || ', Name: ' || last_name || ', Salary: ' || salary); END LOOP; CLOSE emp_cursor; END; /</code>
Tutup: Kenyataan CLOSE
mengeluarkan sumber yang dipegang oleh kursor. Adalah penting untuk menutup kursor untuk mengelakkan kebocoran sumber.
<code class="sql">CLOSE emp_cursor;</code>
Atribut emp_cursor%NOTFOUND
diperiksa selepas setiap FETCH
. Apabila tidak ada baris lagi, ia menjadi TRUE
, dan gelung itu berakhir. Ini adalah cara standard untuk melangkah melalui baris yang dikembalikan oleh kursor.
PL/SQL menawarkan beberapa jenis kursor, masing -masing dengan kekuatan dan kelemahannya:
SELECT INTO
pernyataan. Mereka tersembunyi dari pengaturcara dan diuruskan secara automatik oleh enjin PL/SQL. Gunakannya untuk pertanyaan mudah mengambil satu baris. Jika pertanyaan mengembalikan lebih daripada satu baris, ia menimbulkan pengecualian TOO_MANY_ROWS
.Pilihan bergantung kepada keperluan anda: Gunakan kursor tersirat untuk pengambilan semula satu baris mudah, kursor eksplisit untuk pemprosesan berbilang baris yang lebih kompleks dengan kawalan yang jelas, dan kursor ref untuk SQL dinamik dan parameter prosedur/fungsi lulus.
Memproses dataset besar dengan kursor boleh tidak cekap jika tidak ditangani dengan teliti. Berikut adalah beberapa strategi untuk meningkatkan prestasi:
FORALL
untuk melaksanakan operasi pada pelbagai baris sekaligus. Ini dengan ketara mengurangkan konteks beralih antara enjin PL/SQL dan pelayan pangkalan data.SELECT *
, sebaliknya tentukan hanya lajur yang diperlukan. Gunakan yang sesuai WHERE
klausa untuk menapis data dengan berkesan. Ya, anda boleh dan sering kali digunakan FOR
gelung dengan kursor untuk memudahkan kod anda dan meningkatkan kebolehbacaan. FOR
gelung secara tersirat mengendalikan pembukaan, pengambilan, dan penutupan kursor, menjadikan kod lebih ringkas dan mudah difahami. Ini amat bermanfaat apabila berurusan dengan kursor yang jelas.
Daripada LOOP
manual dan FETCH
seperti yang ditunjukkan sebelum ini, anda boleh menggunakan:
<code class="sql">DECLARE CURSOR emp_cursor IS SELECT employee_id, last_name, salary FROM employees WHERE department_id = 10; BEGIN FOR emp_rec IN emp_cursor LOOP DBMS_OUTPUT.PUT_LINE('Employee ID: ' || emp_rec.employee_id || ', Name: ' || emp_rec.last_name || ', Salary: ' || emp_rec.salary); END LOOP; END; /</code>
Ini FOR
gelung secara automatik mengendalikan lelaran kursor. Pembolehubah rekod emp_rec
secara automatik menerima nilai dari setiap baris yang diambil dari kursor. Pendekatan ini lebih bersih, lebih mudah dibaca, dan kurang terdedah kepada kesilapan berbanding dengan menguruskan kursor secara manual. Ia adalah kaedah pilihan untuk kebanyakan pemprosesan baris berasaskan kursor dalam PL/SQL.
Atas ialah kandungan terperinci Bagaimanakah saya menggunakan kursor dalam PL/SQL untuk memproses pelbagai baris data?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!