Fungsi delimiter pada mysql

Saat membuat stored program (procedure, function, triggers dan event) biasanya kita perlu mendahuluinya dengan pernyataan delimiter $$ atau delimiter // dan jika tidak menggunakan delimiter maka biasanya akan menyebabkan error ketika statement di akhiri dengan tanda titik koma/semicolon (;), lalu mengapa hal itu bisa terjadi dan mengapa kita perlu menggunakan delimiter terlebih dahulu sebelum membuat stored routines? Secara default bentuk / format dasar delimiter adalah sebagai berikut:


delimiter delimiter_karakter < Untuk mengawali delimiter
.....
delimiter ; < Untuk mengakhiri delimiter

Pada umumnya setiap satu baris statement sql harus di akhiri dengan tanda titik koma/semicolon (;) yang menandakan akhir dari query dan tanda semicolon itulah yang secara default disebut sebagai delimiter (pembatas), namun ketika membuat stored program (procedure, function, trigger dan event) dapat berisikan beberapa statement sql yang di akhiri dengan semicolon sehingga ketika kita menuliskan statement sql saat membuat stored program tanpa diawali delimiter kemudian di akhiri dengan semicolon maka akan dianggap sebagai akhir query dan akan segera di eksekusi ketika menekan tombol enter sehingga akan menyebabkan error, contohnya sebagai berikut:


mysql> create procedure coba(id int)
    -> begin
    -> select nama, npm from mahasiswa where id_mhs = id;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3


Ini terjadi karena server menganggap statement sudah selesai yang diakhiri dengan semicolon sedangkan statement create procedure masih belum selesai, maka contoh penggunaan yang benar adalah sebagai berikut:


mysql> delimiter $$
mysql> create procedure coba(id int)
    -> begin
    -> select nama, npm from mahasiswa where id_mhs = id;
    -> end $$
Query OK, 0 rows affected (0.09 sec)
mysql> delimiter ;
mysql> call coba(1);
+----------+-------------+
| npm      | nama        |
+----------+-------------+
| 51411136 | AA Aditya A |
+----------+-------------+
1 row in set (0.09 sec)
Query OK, 0 rows affected (0.13 sec)


Sebenarnya kita bisa membuat stored routine tanpa delimiter jika hanya memiliki satu baris query, contohnya sebagai berikut:


mysql> create procedure coba(id int)
    -> select npm, nama from mahasiswa where id_mhs = id;
Query OK, 0 rows affected (0.11 sec)

mysql> call coba(1);
+----------+-------------+
| npm      | nama        |
+----------+-------------+
| 51411136 | AA Aditya A |
+----------+-------------+
1 row in set (0.09 sec)
Query OK, 0 rows affected (0.13 sec)


Apakah keyword delimiter hanya bisa digunakan saat membuat stored program saja dan apakah harus selalu menggunakan simbol $$ untuk mengawali pernyataan delimiter? Jawabannya adalah Tidak, kita juga bisa menggunakan delimiter tanpa membuat stored program namun setiap statement yang diakhiri semicolon akan di tahan terlebih dahulu sampai diakhiri dengan delimiter_karakter, kita juga bisa menggunakan simbol/karakter/huruf atau gabungan dari ketiganya sehingga menjadi kalimat namun lebih baik adalah dengan tidak membuatnya menjadi rumit karena fungsinya hanya untuk membuat sekumpulan statement saja, contohnya sebagai berikut:


mysql> delimiter G3eK@sMeD!a
mysql> select npm, nama from mahasiswa where id_mhs = 1;
    -> select npm, nama from mahasiswa where id_mhs = 2;
    -> G3eK@sMeD!a
+----------+-------------+
| npm      | nama        |
+----------+-------------+
| 51411136 | AA Aditya A |
+----------+-------------+
1 row in set (0.00 sec)

+----------+------------+
| npm      | nama       |
+----------+------------+
| 51412371 | A Aditya A |
+----------+------------+
1 row in set (0.02 sec)

mysql> delimiter ;


Maka dari sini kita dapat melihat bahwa fungsi delimiter adalah untuk mengemas kumpulan statement sampai diakhiri dengan delimiter_karakter dan untuk menutup delimiter itu sendiri juga harus di akhiri dengan semicolon, jika tidak maka kita akan tetap berada didalam delimiter.

Pada saat kita mendefinisikan objek yang tersimpan di database MySQL seperti stored procedure, trigger maupun function, ada problem yang akan muncul yaitu penggunaan titik koma ( ; ) pada statement SQL yang merupakan bagian dari objek tersebut. 

Kenapa begitu ? Karena MySQL secara default menganggap titik koma ( ; ) sebagai delimiter / pembatas akhir dari suatu perintah / statement. Akhirnya pembuatan objek yang memiliki beberapa statement tidak akan berjalan sempurna karena "berhenti di tengah jalan".

Solusi terhadap masalah di atas adalah menggunakan delimiter selain tanda titik koma ( ; ) misalkan dengan garis pipa ( | ). Penggunaannya sangat sederhana, sebelum mendefinisikan objek tersebut kita gunakan statement "DELIMITER" diikuti tanda pemisah baru. Setelah di akhir pendefinisian kita kembalikan delimiter lagi kepada tanda titik koma.

Contoh Penggunaan :

  1. DELIMITER |

  2. CREATE TRIGGER hapus_tr_penjualan AFTER DELETE

  3. ON tr_penjualan FOR EACH ROW

  4. BEGIN

  5. INSERT INTO tr_penjualan_hapus

  6. (       tgl_transaksi,

  7. kode_cabang,

  8. kode_kasir,

  9. kode_item,

  10. kode_produk,

  11. jumlah_pembelian,

  12. tgl_perubahan,

  13. nama_user

  14. )

  15. VALUES

  16. (       OLD.tgl_transaksi,

  17. OLD.kode_cabang,

  18. OLD.kode_kasir,

  19. OLD.kode_item,

  20. OLD.kode_produk,

  21. OLD.jumlah_pembelian,

  22. SYSDATE(),

  23. CURRENT_USER

  24. );

  25. END;

  26. |

  27. DELIMITER ;

Keterangan Contoh :

Terlihat pada baris 1 delimiter / pemisah tanda garis pipa ( | ) digunakan sebelum pendefinisian trigger "hapus_tr_penjualan". Dan setelah pendefinisian selesai dilakukan maka tanda titik koma dikembalikan sebagai delimiter seperti terlihat pada baris 30.