Pernah gak sih kalian ngerasa pegel ngetik query SQL yang panjang-panjang secara berulang kali tiap mau nampilin data? Aku juga gitu! Nah, kali ini aku mau share pengalaman nyobain fitur keren di MySQL yang namanya Stored Procedure.
Singkatnya, Stored Procedure itu kayak kita bikin shortcut (jalan pintas) buat query kita. Sekali dibikin kodenya, ke depannya kita tinggal panggil aja nama shortcut-nya. Praktis banget kan?
Kenalan Dulu Sama Database-nya
Biar nyambung, aku kasih tahu dulu struktur database yang aku pakai buat eksperimen ini. Namanya database rumah_sakit. Ada 6 tabel yang saling nyambung satu sama lain:
poliklinik & dokter: Buat nyimpen data poli dan nama dokter spesialisnya.
pasien: Buat biodata pasien.
obat: Daftar obat sama sisa stoknya.
rekam_medis: Ini tabel utamanya, nyatet waktu periksa sama diagnosa penyakit (nghubungin pasien dan dokter).
detail_resep: Buat nyatet obat apa aja yang dikasih pas pasien selesai diperiksa.
Mulai bikin Procedure nya
Sebelum masuk ke kodenya, nanti kalian bakal sering nemu tulisan DELIMITER $$ di awal, dan DELIMITER ; di akhir. Ini tuh cuma trik sementara biar sistem MySQL gak salah paham pas baca tanda titik koma (;) di dalam kodingan kita. Anggap aja kayak ganti gigi perseneling bentar.
1. Procedure Buat Ngecek Obat Habis
Apoteker dan bagian Farmasi pasti butuh banget fitur ini buat ngecek obat apa aja yang stoknya udah 0 biar bisa buruan restock.
Kode nya:
DELIMITER $$
CREATE PROCEDURE `obat_habis`()
BEGIN
SELECT `id_obat`, `nama_obat`, `harga`, `stok`
FROM `obat`
WHERE `stok` = 0
ORDER BY `nama_obat` ASC;
END$$
DELIMITER ;
Penjelasan:
Ini yang paling simpel. Kita cuma narik data dari tabel obat yang stoknya bener-bener nol. Gak butuh masukin parameter apa-apa (makanya tanda kurungnya kosong).
Cara panggilnya: Tinggal jalanin CALL obat_habis();
2. Procedure Buat Nyari Dokter
Gimana kalau admin pendaftaran mau nyari dokter, tapi cuma inget sepenggal namanya doang? Kita bikin pencariannya!
LEFT JOIN `poliklinik` p ON d.`id_poli` = p.`id_poli`
WHERE d.`nama_dokter` LIKE CONCAT('%', `p_nama_dokter`, '%')
ORDER BY d.`nama_dokter` ASC;
END$$
DELIMITER ;
Penjelasan:
Nah, kalau ini kita pakai parameter input (IN). Terus, pake LEFT JOIN ke tabel poliklinik biar ketahuan dokternya tugas di poli mana. Pakai trik LIKE CONCAT bikin pencariannya jadi fleksibel, ketik huruf tengahnya doang juga bakal ketemu!
Cara panggilnya: Misal mau nyari dokter yang ada unsur nama "Budi": CALL cari_dokter('Budi');
3. Procedure Buat Kepoin Kunjungan Pasien
Buat keperluan laporan bulanan, kita biasanya butuh data pasien mana yang paling sering datang. Kita langsung bikin dua aja deh: satu buat rekap jumlahnya, satu lagi buat ngintip detail riwayatnya.
Kode buat Rekap Total:
DELIMITER $$
CREATE PROCEDURE `kunjungan_pasien`()
BEGIN
SELECT
p.`nama_pasien`, p.`alamat`,
COUNT(r.`id_rekam`) AS `total_kunjungan`,
MAX(r.`tanggal_periksa`) AS `kunjungan_terakhir`
FROM `pasien` p
LEFT JOIN `rekam_medis` r ON p.`id_pasien` = r.`id_pasien`
GROUP BY p.`id_pasien`, p.`nama_pasien`, p.`alamat`
ORDER BY `total_kunjungan` DESC;
END$$
DELIMITER ;
Penjelasan:
Kita pakai fitur COUNT buat ngitung total kedatangannya. Pakai LEFT JOIN sengaja dipilih biar pasien yang baru daftar dan belum pernah periksa tetep muncul dengan status kunjungan "0".
LEFT JOIN `poliklinik` pol ON d.`id_poli` = pol.`id_poli`
WHERE p.`nama_pasien` LIKE CONCAT('%', `p_nama_pasien`, '%')
ORDER BY r.`tanggal_periksa` DESC;
END$$
DELIMITER ;
Penjelasan:
Kelihatan ribet ya ada banyak JOIN? Padahal intinya cuma nerjemahin angka ID di tabel rekam medis biar berubah jadi nama orang (pasien dan dokter) yang bisa dibaca.
Cara panggilnya:
Lihat rekap: CALL kunjungan_pasien();
Lihat riwayat si Citra: CALL riwayat_kunjungan('Citra');
Stored Procedure (prosedur tersimpan) dalam SQL adalah sekumpulan perintah SQL yang dibungkus menjadi satu kesatuan, diberi nama, dan disimpan langsung di dalam server database. Konsepnya mirip fungsi (function) pada bahasa pemrograman: logikanya ditulis satu kali, lalu dipanggil kapan saja lewat namanya tanpa menulis ulang seluruh query dari awal.
Ringkasnya: kalau biasanya kamu mengetik perintah INSERT atau UPDATE panjang berulang kali dari aplikasi, dengan Stored Procedure kamu cukup membungkusnya di database dan memanggilnya dengan satu baris CALL nama_prosedur(...).
Kapan Stored Procedure Digunakan?
Stored procedure efektif untuk pengelolaan database aplikasi pada kondisi berikut:
Query yang berulang (repetitive tasks): aplikasi sering menjalankan operasi yang sama (menambah data paket baru, mencatat transaksi, mengambil laporan bulanan) dengan nilai input berbeda.
Menyimpan logika bisnis (business logic): satu aksi membutuhkan beberapa langkah sekaligus, misalnya mengecek paket, menambah jumlah pengguna di tabel paket, lalu mencatat riwayat pembelian di tabel lain.
Meningkatkan keamanan data: administrator dapat memberi izin menjalankan prosedur (EXECUTE) tanpa memberi akses langsung (SELECT, INSERT, UPDATE, DELETE) ke tabel aslinya.
Mengurangi beban jaringan: aplikasi cukup mengirim satu baris CALL beserta parameternya, bukan ratusan baris teks query.
Struktur Tabel Contoh: Tabel paket
Agar mudah dipahami, kita memakai tabel paket dengan ENGINE=InnoDB pada MySQL / MariaDB berikut:
Setelah prosedur tersimpan di database, panggil kapan saja dengan perintah CALL:
SQL: memanggil prosedur
CALL tambah_paket_baru('PKT-001', 'Paket Internet Hemat 50 Mbps', 250000);
Cara Membaca Query-nya (Bedah Baris demi Baris)
Bagi pemula, sintaks seperti DELIMITER $$ atau IN mungkin terlihat asing. Berikut arti setiap bagian kode di atas:
Bagian kode SQL
Cara baca & fungsinya
DELIMITER $$
Mengubah tanda akhir perintah SQL sementara dari titik koma (;) menjadi $$, supaya MySQL tidak mengira titik koma di akhir baris INSERT sebagai akhir dari perintah pembuatan prosedur.
CREATE PROCEDURE tambah_paket_baru (...)
Membuat prosedur baru bernama tambah_paket_baru. Tanda kurung berisi daftar parameter, yaitu data yang harus dikirim saat prosedur dipanggil.
IN p_id_paket VARCHAR(50)
IN berarti parameter ini input (masukan dari luar). p_id_paket adalah nama variabel penampung (awalan p_ dipakai agar tidak tertukar dengan kolom asli id_paket), dan VARCHAR(50) adalah tipe datanya, disesuaikan dengan kolom tabel.
BEGIN ... END $$
Pembuka dan penutup tubuh prosedur (seperti kurung kurawal { ... } di bahasa pemrograman). Semua perintah yang akan dijalankan diletakkan di antaranya.
INSERT INTO paket ... VALUES (..., 0);
Isi utama prosedur. Mengambil nilai dari p_id_paket, p_nama_paket, dan p_harga_paket lalu memasukkannya ke tabel paket. Nilai banyak_pengguna diisi langsung 0.
DELIMITER ;
Mengembalikan tanda akhir perintah SQL ke aturan normal, yaitu titik koma (;).
CALL tambah_paket_baru(...)
Mengeksekusi prosedur. 'PKT-001' masuk ke p_id_paket, 'Paket Internet Hemat 50 Mbps' ke p_nama_paket, dan 250000 ke p_harga_paket.
Contoh Tambahan: Prosedur untuk Update Data
Selain menambah baris baru, prosedur juga sering dipakai untuk memperbarui data. Contohnya tambah_pengguna_paket, yang menambah jumlah pengguna setiap kali ada pelanggan baru berlangganan paket tertentu:
SQL: prosedur update tambah_pengguna_paket
DELIMITER $$
CREATE PROCEDURE tambah_pengguna_paket (
IN p_id_paket VARCHAR(50),
IN p_jumlah_baru INT(11)
)
BEGIN
UPDATE paket
SET banyak_pengguna = banyak_pengguna + p_jumlah_baru
WHERE id_paket = p_id_paket;
END $$
DELIMITER ;
-- Cara memanggilnya (menambah 5 pengguna ke PKT-001):
CALL tambah_pengguna_paket('PKT-001', 5);
Tempat Praktik SQL Interaktif (tabel paket)
Ubah kode SQL sesukamu: buat prosedur baru, ubah nilai, atau panggil dengan CALL, lalu klik Jalankan Query SQL.
Simulasi di browser
Memuat playground... Jika bagian ini tidak berubah, aktifkan JavaScript atau muat ulang halaman. Isi artikel di atas tetap bisa dibaca.
Catatan: ini simulasi yang berjalan di browsermu dengan JavaScript, bukan koneksi ke server MySQL/MariaDB sungguhan. Query tidak dikirim ke server mana pun dan tidak disimpan. Yang didukung: tabel paket, INSERT, UPDATE, DELETE, SELECT sederhana (WHERE, ORDER BY, LIMIT), serta CREATE/DROP PROCEDURE dan CALL dengan parameter IN. CREATE OR REPLACE PROCEDURE hanya ada di MariaDB; di MySQL gunakan DROP PROCEDURE IF EXISTS.
Contoh latihan (klik untuk memuat ke editor, lalu ubah kodenya):
1
Ctrl + Enter untuk menjalankan. Tombol Tab memindahkan fokus.
DDL (Data Definition Language) merupakan kumpulan perintah SQL, atau biasa disebut query, yang digunakan untuk membuat, mengubah, dan menghapus struktur database. Intinya, DDL digunakan untuk mengatur bentuk atau struktur dari database.
2. Macam-Macam Query DDL
a. CREATE: Untuk membuat database atau tabel.
b. ALTER: Untuk mengubah struktur tabel.
c. DROP: Untuk menghapus database/tabel.
d. TRUNCATE: Menghapus seluruh data yang ada di dalam tabel tanpa menghapusstruktur nya.
3. Apa perbedaan antara trigger before dan trigger after
4. Apa yang harus di perhatikan dalam menulis trigger
JAWABAN
1. Trigger adalah sebuah perintah khusus dalam database yang akan dijalankan secara otomatis ketika terjadi suatu kejadian (event) tertentu pada tabel.
2. Trigger akan berjalan secara otomatis ketika terjadi operasi tertentu pada tabel, seperti INSERT (menambah data), UPDATE (mengubah data), atau DELETE (menghapus data).
3. BEFORE berarti trigger dijalankan sebelum operasi dilakukan.
Biasanya BEFORE digunakan untuk:
melakukan validasi,
memeriksa data,
mengubah nilai sebelum disimpan.
--AFTER berarti trigger dijalankan setelah operasi berhasil dilakukan.
Biasanya AFTER digunakan untuk:
mencatat aktivitas,
memperbarui tabel lain,
melakukan proses setelah data berhasil disimpan.
4. Dalam menulis trigger, perlu memperhatikan event yang digunakan (INSERT, UPDATE, atau DELETE), waktu eksekusi (BEFORE atau AFTER), tabel yang digunakan, serta perintah yang akan dijalankan secara otomatis.
Pengertian Trigger
Trigger adalah fitur pada database yang berfungsi untuk menjalankan perintah SQL secara otomatis ketika terjadi suatu kejadian pada tabel, seperti data ditambahkan, diubah, atau dihapus.
Artinya, kita tidak perlu menjalankan perintah tersebut secara manual karena database akan mengeksekusinya sendiri.
Cara kerja Trigger
Trigger bekerja berdasarkan tiga jenis kejadian utama:
INSERT → saat data baru ditambahkan.
UPDATE → saat data diubah.
DELETE → saat data dihapus.
Selain itu, trigger dapat dijalankan:
BEFORE → sebelum kejadian terjadi.
AFTER → setelah kejadian terjadi.
Ilustrasi
Misalnya ada tabel barang dan log_barang.
Ketika barang baru ditambahkan ke tabel barang, trigger otomatis mencatat aktivitas tersebut ke tabel log_barang.
Alurnya:
Tambah data ke barang → Trigger aktif → Data aktivitas masuk ke log_barang.
Jenis-jenis Trigger
Jenis
Fungsi
BEFORE INSERT
Berjalan sebelum data ditambahkan.
AFTER INSERT
Berjalan setelah data ditambahkan.
BEFORE UPDATE
Berjalan sebelum data diubah.
AFTER UPDATE
Berjalan setelah data diubah.
BEFORE DELETE
Berjalan sebelum data dihapus.
AFTER DELETE
Berjalan setelah data dihapus.
Contoh Trigger
Tabel barang
id_barang
nama_barang
stok
1
Buku
20
Tabel log_barang
id_log
aktivitas
Trigger AFTER INSERT
CREATETRIGGER tambah_log
AFTERINSERTON barang
FOREACHROWINSERTINTO log_barang(aktivitas)
VALUES ('Barang baru ditambahkan');
Hasil
Jika menjalankan:
INSERTINTO barang (nama_barang, stok)
VALUES ('Pensil', 50);
Maka secara otomatis tabel log_barang akan berisi:
id_log
aktivitas
1
Barang baru ditambahkan
Kegunaan Trigger
Mencatat riwayat aktivitas (log).
Memperbarui stok secara otomatis.
Memvalidasi data sebelum disimpan.
Menjaga konsistensi data antar tabel.
Mengurangi pekerjaan yang harus dilakukan secara manual.
Kelebihan dan Kekurangan
Kelebihan
Kekurangan
Berjalan otomatis.
Sulit dilacak jika trigger terlalu banyak.
Mengurangi pekerjaan manual.
Bisa memperlambat proses jika logikanya rumit.
Menjaga konsistensi data.
Perlu pengelolaan yang baik agar tidak membingungkan.
Stored Procedure SQL (Tabel paket) - Catatan Blogger Dark Mode
Pengertian
Stored Procedure (prosedur tersimpan) adalah sekumpulan perintah SQL yang dibungkus menjadi satu kesatuan, diberi nama, dan disimpan langsung di dalam server database. Stored Procedure sangat penting karena kita cukup menulis logika query satu kali saja (mirip seperti fungsi pada bahasa pemrograman), lalu memanggil namanya kapan saja dibutuhkan menggunakan perintah CALL tanpa harus menulis ulang seluruh query dari awal.
Kapan Stored Procedure digunakan? Prosedur digunakan saat aplikasi sering menjalankan query yang berulang (repetitive), menyimpan logika bisnis di dalam database, meningkatkan keamanan (user hanya diberi akses menjalankan prosedur tanpa akses langsung ke tabel), serta menghemat beban jaringan.
b. Prosedur Menambah Jumlah Pengguna (tambah_pengguna_paket)
Prosedur ini digunakan untuk memperbarui (UPDATE) kolom banyak_pengguna dengan menambahkan jumlah pengguna baru berdasarkan id_paket yang dipilih.
Query:
DELIMITER $$
CREATE PROCEDURE tambah_pengguna_paket (
IN p_id_paket VARCHAR(50),
IN p_jumlah_baru INT(11)
)
BEGIN
UPDATE paket
SET banyak_pengguna = banyak_pengguna + p_jumlah_baru
WHERE id_paket = p_id_paket;
END $$
DELIMITER ;
CALL tambah_pengguna_paket('PKT-001', 5);
Hasil:
id_paket
nama_paket
harga_paket
banyak_pengguna
PKT-001
Paket Hemat 50 Mbps
250000
15
PKT-002
Paket Keluarga 100 Mbps
375000
6
PKT-003
Paket Gamer 150 Mbps
499000
0
banyak_pengguna pada PKT-001 bertambah dari 10 menjadi 15
c. Cara Membaca Query Stored Procedure
Berikut adalah cara membaca setiap baris perintah pada pembuatan dan pemanggilan Stored Procedure di atas:
- DELIMITER $$ : Mengubah tanda akhir perintah SQL sementara dari titik koma (;) menjadi $$ agar titik koma di dalam BEGIN...END tidak menghentikan pembuatan prosedur.
- CREATE PROCEDURE nama_prosedur (...) : Perintah untuk membuat prosedur baru beserta daftar parameter di dalam tanda kurung.
- IN p_id_paket VARCHAR(50) : Kata kunci IN berarti parameter masukan (input). p_id_paket adalah nama variabel penampung nilai yang dikirim saat prosedur dipanggil.
- BEGIN ... END $$ : Pembuka dan penutup isi prosedur tempat kita menuliskan perintah INSERT, UPDATE, DELETE, atau SELECT.
- DELIMITER ; : Mengembalikan tanda akhir perintah SQL kembali menjadi titik koma (;).
- CALL tambah_paket_baru(...) : Perintah untuk memanggil/menjalankan prosedur beserta nilai datanya.
3. Tempat Praktek SQL (Ubah & Jalankan Query):
Silakan ubah kode SQL di bawah ini (bisa membuat prosedur baru, mengubah nilai parameter pada CALL, atau menjalankan query biasa) lalu klik tombol Jalankan Query untuk melihat perubahannya pada bagian Hasil:
Query:
Siap dijalankan. Silakan edit kode SQL di atas lalu klik "Jalankan Query".