Artikel

Mencoba Membuat Procedure di Database Rumah Sakit

Oktober 22, 2026 0 komentar

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!

Kodenya:

DELIMITER $$
CREATE PROCEDURE `cari_dokter`(IN `p_nama_dokter` VARCHAR(100))
BEGIN
    SELECT d.`id_dokter`, d.`nama_dokter`, d.`spesialisasi`, p.`nama_poli`
    FROM `dokter` d
    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".

Kode buat Cek Detail Riwayatnya:

DELIMITER $$
CREATE PROCEDURE `riwayat_kunjungan(IN `p_nama_pasien` VARCHAR(100))
BEGIN
    SELECT 
        p.`nama_pasien`, r.`tanggal_periksa`,
        d.`nama_dokter`, pol.`nama_poli`, r.`diagnosa`
    FROM `rekam_medis` r
    JOIN `pasien` p ON r.`id_pasien` = p.`id_pasien`
    JOIN `dokter` d ON r.`id_dokter` = d.`id_dokter`
    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');




    Mengupload: 11962 dari 11962 byte diupload.





Artikel

Stored Procedure

Oktober 21, 2026 1 komentar

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:

SQL: struktur tabel paket
CREATE TABLE `paket` (
  `id_paket` varchar(50) NOT NULL,
  `nama_paket` varchar(200) NOT NULL,
  `harga_paket` int(11) DEFAULT NULL,
  `banyak_pengguna` int(11) DEFAULT NULL,
  PRIMARY KEY (`id_paket`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Contoh Query Stored Procedure pada Tabel paket

Kita akan membuat prosedur tambah_paket_baru untuk memasukkan paket internet baru ke tabel paket, dengan nilai awal banyak_pengguna otomatis 0.

1. Membuat Stored Procedure (CREATE PROCEDURE)

SQL: membuat prosedur tambah_paket_baru
DELIMITER $$

CREATE PROCEDURE tambah_paket_baru (
    IN p_id_paket VARCHAR(50),
    IN p_nama_paket VARCHAR(200),
    IN p_harga_paket INT(11)
)
BEGIN
    INSERT INTO paket (id_paket, nama_paket, harga_paket, banyak_pengguna)
    VALUES (p_id_paket, p_nama_paket, p_harga_paket, 0);
END $$

DELIMITER ;

2. Memanggil / Menjalankan Stored Procedure (CALL)

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 SQLCara 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.