Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bekerja dengan Kursor SQL

Dalam SQL, kursor berfungsi sebagai penunjuk yang memungkinkan bahasa pemrograman aplikasi menangani hasil kueri satu per satu. Artikel ini dengan cepat mengeksplorasi konsep di balik dan menunjukkan cara mendeklarasikan kursor, membuka, mengambil data darinya, lalu menutupnya.

Kursor SQL

Data dalam database relasional dikelola dalam bentuk set. Akibatnya, hasil kueri yang dikembalikan oleh pernyataan SQL SELECT disebut sebagai kumpulan hasil. Kumpulan hasil tidak lain adalah kombinasi dari satu atau lebih baris dan kolom yang diekstraksi dari satu atau lebih tabel. Anda dapat menggulir set hasil untuk mengekstrak informasi yang Anda butuhkan. Elemen data yang dikembalikan digunakan oleh bahasa pemrograman seperti Java atau lainnya untuk tujuan aplikasi tertentu. Tapi di sinilah letak masalah impedance mismatch karena perbedaan konstruksi antara model database dan model bahasa pemrograman.

Model database SQL memiliki tiga konstruksi utama:

  • kolom (atau atribut) dan tipe datanya
  • baris (catatan atau tupel)
  • tabel (kumpulan catatan)

Oleh karena itu, ketidakcocokan utama antara dua model adalah:

  1. Tipe data atribut yang tersedia dalam model database tidak sama dengan tipe variabel yang digunakan dalam bahasa pemrograman. Ada banyak bahasa host, dan masing-masing memiliki tipe data yang berbeda. Misalnya, tipe data C/C++ dan Java berbeda, begitu pula tipe data SQL. Oleh karena itu, mekanisme pengikatan diperlukan untuk mengurangi masalah ketidakcocokan.
  2. Hasil yang dikembalikan oleh pernyataan SQL SELECT adalah kumpulan rekaman yang banyak di mana setiap rekaman adalah kumpulan atribut. Bahasa pemrograman host biasanya bekerja pada nilai data individual dari tuple yang dikembalikan oleh kueri. Oleh karena itu, hasil query SQL harus dipetakan dengan struktur data yang didukung oleh bahasa pemrograman. Mekanisme perulangan atas tupel diperlukan untuk mengulangi tupel dan nilai atributnya.

Kursor bertindak seperti variabel iterator untuk mengulang tupel yang dikembalikan oleh kueri SQL dan mengekstrak nilai individual dalam setiap tupel yang kemudian dapat dipetakan ke jenis variabel program yang sesuai.

Kursor, oleh karena itu, berfungsi sebagai penunjuk yang memungkinkan bahasa pemrograman memproses hasil kueri satu per satu. Kursor dapat melintasi semua baris hasil kueri yang berfokus pada satu baris dalam satu waktu. Pertimbangkan kueri SQL berikut:

SELECT emp_no, first_name, last_name, birth_date
FROM employees
WHERE MONTH(birth_date) = MONTH(CURRENT_DATE)
AND DAY(birth_date) = DAY(CURRENT_DATE);

Hasil kueri dari pernyataan di atas mengembalikan detail karyawan dari semua karyawan yang tanggal lahirnya jatuh pada hari saat ini di bulan tertentu. Hasilnya mungkin berisi banyak baris, tetapi bahasa aplikasi host dapat menangani satu baris dalam satu waktu. Akibatnya, kursor dideklarasikan sebagai pernyataan SQL tertanam dalam bahasa pemrograman aplikasi. Kursor kemudian dibuka seperti file dan mengekstrak satu baris dari hasil kueri. Baris lain diekstraksi kemudian, secara berurutan hingga kursor ditutup.

Mendeklarasikan Kursor

Kursor dideklarasikan seperti variabel. Diberi nama, ada pernyataan untuk membuka kursor, mengambil hasil query, dan terakhir menutup kursor. Perhatikan bahwa, implementasi SQL yang berbeda mendukung penggunaan kursor dengan cara yang berbeda. Tapi ada kesepakatan umum tentang bagaimana kursor harus ditulis.

Kita harus menggunakan pernyataan SQL untuk sepenuhnya mengimplementasikan fungsionalitas kursor karena mendeklarasikan kursor saja tidak cukup untuk mengekstrak data dari database SQL. Ada empat langkah dasar untuk mendeklarasikan kursor:

NYATAKAN KURSOR: Deklarasi dimulai dengan memberi kursor nama dan menetapkan ekspresi kueri yang akan dipanggil saat kursor dibuka.

BUKA: Pernyataan terbuka mengeksekusi ekspresi kueri yang ditetapkan dan menyiapkan hasil kueri untuk FETCH berikutnya.

FETCH: Mengambil nilai data ke dalam variabel yang kemudian dapat diteruskan ke bahasa pemrograman host atau ke pernyataan SQL tertanam lainnya.

TUTUP: Kursor ditutup untuk mengambil hasil kueri lagi.

Sintaksnya adalah sebagai berikut:

DECLARE <cursor_name>
[SENSITIVE | INSENSITIVE | ASENSITIVE]
[SCROLL | NO SCROLL] CURSOR
[ WITH HOLD | WITHOUT HOLD]
[ WITH RETURN | WITHOUT RETURN]
FOR <sql_query_expression>
[ ORDER BY <sort_expression>]
[ FOR {READ ONLY | UPDATE [ OF <list_of_column>]}]

Bagian penting dari deklarasi kursor adalah sebagai berikut:

 DECLARE <cursor_name> FOR <sql_query_expression>

Bagian opsional seperti [SENSITIF | INSSENSITIF | ASENSITIF] menandakan apakah kursor sensitif terhadap perubahan dan apakah akan mencerminkannya dalam hasil kueri. SENSITIF berarti kursor dipengaruhi oleh perubahan, SENSITIF berarti kursor tidak terpengaruh dan ASENSITIF berarti perubahan mungkin atau mungkin tidak terlihat oleh kursor. Jika tidak ditentukan, ini mengasumsikan opsi ASENSITIF.

Opsional [GULIR | NOSCROLL] mendefinisikan kemampuan gulir kursor. Jika tidak ditentukan, ini mengasumsikan opsi NO SCROLL.

Opsional [ DENGAN TAHAN | TANPA TAHAN] menentukan apakah akan menahan atau menutup secara otomatis ketika transaksi karena kursor dilakukan. Jika tidak ditentukan, itu mempertahankan opsi TANPA TAHAN.

Opsional [ DENGAN KEMBALI | TANPA RETURN] menentukan apakah akan mengembalikan hasil kursor yang disetel ke pemanggil seperti rutin SQL lain atau bahasa host. Jika tidak ditentukan artinya TANPA PENGEMBALIAN.

Klausa ORDER BY digunakan untuk mengurutkan hasil kueri yang dikembalikan menurut teknik pengurutan yang ditentukan.

Opsi UPDATE mengacu pada penggunaan pernyataan UPDATE atau DELETE adalah asosiasi dengan baris yang dikembalikan oleh pernyataan SELECT kursor. Modifikasi seperti itu tidak mungkin dilakukan jika kami menentukan opsi READ ONLY. Jika tidak ditentukan, maka secara default opsi UPDATE diasumsikan.

Oleh karena itu, kursor sederhana dapat dideklarasikan sebagai berikut:

DECLARE mycursor CURSOR
 FOR
SELECT emp_no, first_name, last_name, birth_date
  FROM employees
 WHERE MONTH(birth_date) = MONTH(CURRENT_DATE)
  AND DAY(birth_date) = DAY(CURRENT_DATE);

Cursor di MySQL

Biasanya, ada dua jenis kursor yang ditemukan di MySQL:kursor read-only dan kursor forward-only. Kursor ini dapat digunakan untuk prosedur tersimpan MySQL. Kursor ini membantu kami untuk mengulangi hasil kueri satu per satu dan mengambil ke dalam variabel untuk diproses lebih lanjut. Dimungkinkan untuk mendeklarasikan lebih dari satu kursor dan meletakkannya dalam loop. Perhatikan bahwa kursor bersifat baca-saja karena digunakan untuk mengulangi tabel sementara. Kursor biasanya mengeksekusi kueri saat kita membukanya.

Salah satu masalah dengan kursor di MySQL adalah mereka mungkin memperlambat kinerja kueri karena operasi I/O tambahan yang mereka lakukan. Ini terutama untuk tipe data besar yang sebenarnya seperti BLOB dan TEXT. Karena kursor bekerja dengan tabel sementara, tipe ini tidak didukung di tabel dalam memori. Oleh karena itu, saat bekerja dengan tipe ini MySQL harus membuat tabel sementara pada disk dan itu membutuhkan banyak operasi I/O dan itu juga di perangkat yang lambat seperti disk. Ini adalah alasan utama kinerja kursor lambat.

MySQL juga tidak mendukung kursor sisi klien namun API klien dapat menirunya jika perlu. Namun hal ini tidak jauh berbeda dengan mengambil hasil dalam array dalam bahasa pemrograman seperti Java dan memanipulasinya di sana.

Berikut adalah contoh tentang cara menulis kursor di MySQL.

CREATE PROCEDURE 'cursor_demo'()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE id INT(11);
    DECLARE fn varchar(14);
    DECLARE ln varchar(16);
    DECLARE bdate date;
  DECLARE mycursor CURSOR FOR
  SELECT emp_no, first_name, last_name, birth_date
    FROM employees
    WHERE MONTH(birth_date)=MONTH(CURRENT_DATE)
      AND DAY(birth_date)=DAY(CURRENT_DATE);
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    OPEN mycursor;
  fetch_loop: LOOP
    FETCH mycursor INTO id, fn, ln, bdate;
  IF done THEN
      LEAVE fetch_loop;
    END IF;
    SELECT id, fn, ln, bdate;
  END LOOP;
  CLOSE mycursor;
END

Panggil prosedur tersimpan sebagai berikut:

mysql> CALL cursor_demo

Prosedur mengambil baris dari tabel bernama karyawan yang tanggal lahirnya cocok dengan hari dan bulan saat ini di kursor bernama kursor saya dan cukup mencetaknya menggunakan pernyataan SELECT.

Lihat Dokumentasi MySQL di Kursor untuk informasi lebih lanjut.

Kesimpulan

Kursor tidak lain adalah penunjuk ke kumpulan catatan yang dikembalikan oleh kueri SQL. Pointer biasanya menunjuk ke satu baris pada satu waktu dan dapat dilalui dalam satu lingkaran untuk mengambil catatan individu. SQL biasanya digunakan untuk pemanggilan langsung untuk mengakses dan membuat objek data. Kursor menyediakan teknik SQL interaktif yang memungkinkan eksekusi ad hoc pernyataan SQL yang difasilitasi melalui aplikasi klien. Mekanisme kursor memanfaatkan model akses data di mana pernyataan SQL disematkan dalam bahasa host seperti C, C++ atau Java dll. Ini hanya sekilas tentang kursor yang akan dimulai. Lihat dokumentasi database SQL yang sesuai untuk detail tentang norma spesifik dari berbagai implementasi.

# # #


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. kueri mysql menampilkan beberapa tabel dari satu kolom ID

  2. Bagaimana Fungsi RIGHT() Bekerja di MySQL

  3. Pernyataan SELECT yang digunakan memiliki jumlah kolom yang berbeda (REDUX!!)

  4. Apa operator <=> ini di MySQL?

  5. Bagaimana cara memperbaikinya:Tidak ditemukan driver yang cocok untuk kesalahan jdbc:mysql://localhost/dbname saat menggunakan kumpulan?