Saya telah menulis aplikasi web dasar selama setahun (untuk Oracle db), dan karena fungsinya cukup sederhana, kebanyakan dari kita tetap menggunakan loop FOR reguler untuk mendapatkan data kami:
for i in (select * from STUDENTS) loop
htp.prn(i.student_last_name || ', ' || i.student_first_name || ' ' || i.student_dob);
end loop;
Tapi, kursor tampaknya menjadi cara yang 'tepat' untuk melakukan sesuatu. Saya dapat menemukan banyak informasi tentang kursor apa dan berbagai cara untuk mengulanginya, tetapi saya tidak dapat menemukan alasan yang kuat mengapa menggunakannya pada loop FOR reguler. Apakah ini tergantung pada kebutuhan prosedur? Apakah ada keuntungan yang melekat yang harus saya waspadai?
FOR
ini hanyalah cara lain untuk menggunakan kursor. Lihat dokumen: docs.oracle.com/cd/E11882_01/appdev.112/e10472/… Pokoknya, apa yang htp.prn () lakukan?FOR
perulangannya jauh lebih mudah dibaca, saya pikir. Saya cenderung menggunakan kursor 'asli' hanya jika saya harus mundur, tidak hanya ke depan. Saya mengajukan pertanyaan lain karena saya bisa membayangkan fungsi tabel, bukanhtp.prn()
.Jawaban:
Kursor dapat menjadi eksplisit atau implisit, dan salah satu tipe dapat digunakan dalam loop FOR. Sebenarnya ada dua aspek dari pertanyaan Anda.
Mengapa menggunakan loop FOR kursor eksplisit di atas kursor implisit FOR loop?
Mengapa menggunakan loop dengan FETCH daripada loop UNTUK yang tidak memiliki FETCH eksplisit?
Berikut ini beberapa informasi berguna dari dokumentasi.
Contoh Kursor Tersirat UNTUK LOOP
Contoh Kursor Eksplisit UNTUK LOOP
Kursor Tersirat
Kursor Eksplisit
Kursor UNTUK Pernyataan LOOP
sumber
Kode yang Anda poskan menggunakan kursor. Itu menggunakan loop kursor implisit.
Ada kasus di mana menggunakan loop kursor eksplisit (yaitu mendeklarasikan variabel CURSOR di bagian deklarasi) menghasilkan kode pembersih atau kinerja yang lebih baik
student_cursor
daripada menyertakan pernyataan SQL 30 baris yang menyematkan banyak logika. Misalnya, jika Anda mencetak semua siswa yang telah lulus dan yang bergabung dengan tabel yang memiliki catatan akademik mereka, persyaratan program gelar mereka, tabel dengan informasi tentang ruang akademik, tabel dengan informasi tentang buku perpustakaan yang sudah lewat, tabel dengan informasi tentang biaya yang belum dibayar, penggantian administratif, dll. mungkin akan masuk akal untuk memperbaiki kode sehingga kueri ini tidak macet di tengah-tengah kode yang berkaitan dengan penyajian daftar kepada pengguna. Itu mungkin melibatkan membuat tampilan yang akan merangkum semua logika ini. Atau mungkin melibatkan membuat kursor eksplisit yang dinyatakan baik sebagai bagian dari blok PL / SQL saat ini atau di beberapa blok PL / SQL level yang lebih tinggi (yaitu kursor dideklarasikan dalam sebuah paket) sehingga dapat digunakan kembali. Atau mungkin melibatkan melakukan sesuatu yang lain untuk enkapsulasi dan penggunaan kembali (katakanlah, membuat fungsi tabel pipelined sebagai gantinya).htp.prn
, melakukanBULK COLLECT
mungkin tidak membeli apa pun untuk Anda. Namun, dalam kasus lain, ini dapat menghasilkan peningkatan kinerja yang substansial.sumber
Saya melihat bahwa banyak pengembang menggunakan kursor eksplisit dan bukan kursor implisit karena kebiasaan lama. Ini karena di Oracle versi 7 ini selalu merupakan cara yang lebih efisien. Saat ini umumnya ada sebaliknya. Khususnya dengan pengoptimal bahwa jika diperlukan dapat menulis ulang kursor implisit untuk loop ke pengumpulan massal.
sumber
Baru-baru ini saya harus menulis ulang banyak pertanyaan dari loop FOR implisit ke dalam kursor eksplisit. Alasannya adalah bahwa kueri mengambil data dari basis data eksternal melalui tautan dan basis data ini memiliki penyandian yang berbeda dari basis data lokal kami. Saat mentransfer data dari kursor implisit ke tipe record yang ditentukan secara lokal, kesalahan intermiten yang terjadi terjadi (hanya pada baris tertentu tertentu). DBA kami menjelaskan hal ini kepada kami, kami tidak akan bisa sampai ke dasar ini sendiri. Sepertinya ini adalah bug di Oracle yang telah dilaporkan.
Kami disarankan untuk menulis ulang semuanya menggunakan kursor eksplisit dan kesalahan telah hilang.
Bukan alasan utama Anda mungkin ingin menggunakan eksplisit daripada implisit, tetapi layak dicatat.
EDIT: Oracle 12c.
sumber