Stored Procedure Lanjutan: Variabel, Parameter & Logika IF/LOOP di MySQL (Part 13)

Rifqi An Rifqi An
Maret 08, 2026


Stored Procedure Lanjutan: Variabel, Parameter & Logika IF/LOOP di MySQL (Part 13)

Pernah gak sih, ngalamin ngoding stored procedure itu kayak jalan di tempat gelap, cuma bisa maju terus tanpa bisa belok atau berhenti sejenak buat mikir? Nah, di seri Belajar Database MySQL kita yang ke-13 ini, kita bakal upgrade ilmu ngoding Stored Procedure kamu jadi lebih sakti! Siap-siap bikin SP yang pinter, bisa mikir sendiri pake variabel, terima "perintah" lewat parameter, dan bahkan punya "logika" buat mutusin jalan yang harus diambil. Udah kayak punya asisten pribadi di dalam database, gaes!

Daftar Isi

Pendahuluan: Kenapa Stored Procedure Ini Penting Banget, Sih?

Kalau di bagian sebelumnya kita udah bahas dasar-dasar Stored Procedure, nah sekarang kita mau naik level nih. Stored Procedure (SP) itu ibarat kumpulan instruksi SQL yang disimpan di dalam database. Bayangin kamu punya resep masakan yang sama, tapi tiap hari ganti bahan atau porsi. Daripada nulis resep dari awal terus, mendingan resepnya dibikin fleksibel, kan? Nah, itulah gunanya variabel dan parameter!

Dengan parameter, SP kita bisa jadi lebih dinamis. Terus, pakai logika IF/ELSE dan LOOP, SP kita bisa jadi "cerdas" buat ngambil keputusan atau ngulang tugas tertentu. Ini penting banget buat otomatisasi, efisiensi, dan mengurangi jumlah kode yang harus kita tulis di sisi aplikasi. Programmer sejati itu maunya ngoding sedikit, hasil maksimal, dan bisa cepet ngopi!

Variabel Lokal: Gudang Rahasia Stored Procedure Kita

Di dalam Stored Procedure, kita bisa declare (mendeklarasikan) variabel lokal. Variabel ini cuma bisa dipake di dalam SP itu sendiri, jadi aman dan ga bakal tabrakan sama variabel lain. Ibarat kamu punya catatan kecil buat nyimpen info sementara pas lagi masak. Penting banget buat nyimpen hasil perhitungan atau data sementara sebelum diproses lebih lanjut.

Cara mendeklarasikannya gampang banget, tinggal pakai kata kunci DECLARE, diikuti nama variabel, tipe data, dan nilai default (opsional). Untuk mengisi atau mengubah nilainya, kita pakai SET atau SELECT ... INTO.


DELIMITER //

CREATE PROCEDURE sp_contoh_variabel()
BEGIN
    -- Deklarasi variabel
    DECLARE total_harga DECIMAL(10, 2) DEFAULT 0.00;
    DECLARE nama_produk VARCHAR(255);
    DECLARE jumlah_item INT;

    -- Mengisi nilai variabel
    SET total_harga = 150000.50;
    SET nama_produk = 'Keyboard Mekanik RGB Super Gaming';
    SET jumlah_item = 2;

    -- Menggunakan variabel
    SELECT CONCAT('Produk: ', nama_produk, ', Jumlah: ', jumlah_item, ', Total: Rp ', total_harga) AS InformasiPesanan;

    -- Contoh lain: mengambil data dari tabel ke variabel
    -- Misalkan ada tabel 'produk' dengan kolom 'harga'
    -- SELECT harga INTO total_harga FROM produk WHERE id = 1;
END //

DELIMITER ;

-- Cara panggil SP-nya:
-- CALL sp_contoh_variabel();

Gampang, kan? Sekarang SP kamu udah punya "otak" buat nyimpen data sementara. Mantul!

Parameter: Bikin Stored Procedure Lebih Fleksibel dari Yoga Master!

Parameter ini yang bikin Stored Procedure kamu bisa diajak ngobrol. Bayangin kamu bikin fungsi di bahasa pemrograman lain, pasti ada argumennya, kan? Nah, parameter itu mirip argumen. Kita bisa ngirim data ke SP (IN), ngambil data dari SP (OUT), atau bahkan ngirim data sekaligus ngambil data yang udah diubah dari SP (INOUT).

  • IN Parameter (Input): Ini yang paling umum. SP menerima nilai dari luar, dan nilai itu nggak bisa diubah di dalam SP. Anggap aja kamu ngasih resep ke koki, dia cuma bisa baca, nggak bisa nambahin bumbu sendiri tanpa izin.
  • OUT Parameter (Output): SP memproses sesuatu di dalamnya, lalu mengembalikan nilai ke pemanggilnya. Ini kayak koki ngasih hasil masakannya ke kamu.
  • INOUT Parameter (Input/Output): Ini paling fleksibel. Kamu ngirim nilai ke SP, SP bisa mengubah nilai itu, lalu mengembalikan nilai yang sudah diubah. Koki bisa kamu kasih bahan, dia olah, terus dikembalikan ke kamu hasil olahan bahan itu.

Contoh IN Parameter


DELIMITER //

CREATE PROCEDURE sp_sapa_programmer(IN nama_programmer VARCHAR(100))
BEGIN
    SELECT CONCAT('Halo, ', nama_programmer, '! Semangat ngodingnya, jangan lupa ngopi!') AS PesanSemangat;
END //

DELIMITER ;

-- Cara panggil:
-- CALL sp_sapa_programmer('Budi');
-- Hasil: Halo, Budi! Semangat ngodingnya, jangan lupa ngopi!

Contoh OUT Parameter


DELIMITER //

CREATE PROCEDURE sp_hitung_total_gaji(
    IN jam_kerja INT,
    IN tarif_per_jam DECIMAL(10, 2),
    OUT total_gaji DECIMAL(10, 2)
)
BEGIN
    SET total_gaji = jam_kerja * tarif_per_jam;
END //

DELIMITER ;

-- Cara panggil dan ambil hasilnya:
-- SET @gaji_budi = 0;
-- CALL sp_hitung_total_gaji(160, 50000, @gaji_budi);
-- SELECT @gaji_budi AS GajiBudi;
-- Hasil: GajiBudi = 8000000.00

Dengan parameter, SP kamu bisa jadi reusable banget. Satu SP bisa dipake berkali-kali dengan input yang berbeda. Ini mengurangi redundancy kode dan bikin maintenance jadi lebih gampang. Programmer idaman banget!

Logika Kondisional dengan IF-ELSE: Mikirin Jalan Saat Ngoding

Nah, ini nih yang bikin SP kamu jadi "pintar". Dengan IF-ELSE, SP bisa ngambil keputusan berdasarkan kondisi tertentu. Mirip banget sama if-else di bahasa pemrograman lain. Kalau kondisinya begini, lakukan ini; kalau tidak, lakukan itu. Sering banget dipake buat validasi, diskon, atau penentuan status.


DELIMITER //

CREATE PROCEDURE sp_cek_status_pembayaran(IN jumlah_bayar DECIMAL(10, 2), IN total_tagihan DECIMAL(10, 2))
BEGIN
    DECLARE status_pembayaran VARCHAR(50);

    IF jumlah_bayar < total_tagihan THEN
        SET status_pembayaran = 'Belum Lunas';
    ELSEIF jumlah_bayar = total_tagihan THEN
        SET status_pembayaran = 'Lunas';
    ELSE
        SET status_pembayaran = 'Pembayaran Lebih (Kembalian)';
    END IF;

    SELECT CONCAT('Status Pembayaran: ', status_pembayaran) AS HasilCek;
END //

DELIMITER ;

-- Contoh panggil:
-- CALL sp_cek_status_pembayaran(100000, 150000); -- Belum Lunas
-- CALL sp_cek_status_pembayaran(150000, 150000); -- Lunas
-- CALL sp_cek_status_pembayaran(200000, 150000); -- Pembayaran Lebih

Kode di atas menunjukkan bagaimana SP bisa bereaksi berbeda tergantung input yang diberikan. Ini powerful banget buat bikin logika bisnis yang kompleks di dalam database!

Pengulangan dengan LOOP: Auto-Pilot Saat Ngoding Berjamaah

Kadang, kita butuh SP buat ngulang suatu tugas berkali-kali sampai kondisi tertentu terpenuhi. Nah, di MySQL, kita punya beberapa jenis loop, tapi yang paling sering dipake itu WHILE dan REPEAT. Ini kayak punya asisten yang bisa kamu suruh "Kerjakan ini terus sampai aku bilang berhenti!"

Contoh WHILE Loop

WHILE loop akan terus berjalan selama kondisi yang ditentukan bernilai TRUE.


DELIMITER //

CREATE PROCEDURE sp_hitung_mundur(IN mulai_dari INT)
BEGIN
    DECLARE counter INT DEFAULT mulai_dari;
    DECLARE hasil_deret VARCHAR(255) DEFAULT '';

    WHILE counter > 0 DO
        SET hasil_deret = CONCAT(hasil_deret, counter, '...');
        SET counter = counter - 1;
    END WHILE;

    SET hasil_deret = CONCAT(hasil_deret, 'GO!');
    SELECT hasil_deret AS HitunganMundur;
END //

DELIMITER ;

-- Panggil:
-- CALL sp_hitung_mundur(5);
-- Hasil: 5...4...3...2...1...GO!

Penting untuk selalu memastikan ada kondisi yang bisa menghentikan loop, kalau tidak, nanti jadi infinite loop dan server kamu bisa nangis darah!

Kombinasi Maut: Variabel, Parameter, dan IF/LOOP dalam Satu Stored Procedure

Sekarang, saatnya kita gabungkan semua jurus sakti tadi! Bayangin kamu punya SP yang menerima nama pelanggan dan jumlah pembelian. SP ini kemudian menghitung diskon berdasarkan jumlah pembelian (IF-ELSE), lalu mencatat log diskonnya (mungkin pakai LOOP kalau ada banyak item), dan mengembalikan total yang harus dibayar setelah diskon.

Ini adalah contoh sederhana, tapi bisa banget dikembangkan jadi lebih kompleks untuk kasus nyata.


DELIMITER //

CREATE PROCEDURE sp_hitung_diskon_dan_final(
    IN id_pelanggan INT,
    IN total_belanja DECIMAL(10, 2),
    OUT jumlah_bayar_final DECIMAL(10, 2)
)
BEGIN
    DECLARE persentase_diskon DECIMAL(5, 2) DEFAULT 0.00;
    DECLARE nama_pelanggan_var VARCHAR(255);
    DECLARE pesan_log VARCHAR(500);

    -- Asumsi: Ambil nama pelanggan dari tabel 'pelanggan'
    SELECT nama INTO nama_pelanggan_var FROM pelanggan WHERE id = id_pelanggan;
    
    -- Logika IF-ELSE untuk diskon
    IF total_belanja >= 1000000 THEN
        SET persentase_diskon = 0.10; -- Diskon 10%
        SET pesan_log = CONCAT('Pelanggan ', nama_pelanggan_var, ' dapat diskon 10% untuk total belanja Rp ', total_belanja);
    ELSEIF total_belanja >= 500000 THEN
        SET persentase_diskon = 0.05; -- Diskon 5%
        SET pesan_log = CONCAT('Pelanggan ', nama_pelanggan_var, ' dapat diskon 5% untuk total belanja Rp ', total_belanja);
    ELSE
        SET persentase_diskon = 0.00; -- Tidak ada diskon
        SET pesan_log = CONCAT('Pelanggan ', nama_pelanggan_var, ' belum dapat diskon untuk total belanja Rp ', total_belanja);
    END IF;

    -- Hitung jumlah akhir setelah diskon
    SET jumlah_bayar_final = total_belanja - (total_belanja * persentase_diskon);

    -- Contoh sederhana LOGGING (bisa diimplementasikan ke tabel log)
    -- SELECT pesan_log AS LogDiskon;

    -- Update database, misalnya update status pesanan atau saldo pelanggan
    -- UPDATE pesanan SET status = 'Selesai', total_bayar = jumlah_bayar_final WHERE id_pelanggan = id_pelanggan;
    -- INSERT INTO log_transaksi (deskripsi) VALUES (pesan_log);

END //

DELIMITER ;

-- Contoh cara pakai (pastikan tabel pelanggan ada):
-- CREATE TABLE pelanggan (id INT PRIMARY KEY, nama VARCHAR(255));
-- INSERT INTO pelanggan VALUES (1, 'Rudi');
-- SET @final_bayar = 0;
-- CALL sp_hitung_diskon_dan_final(1, 1200000, @final_bayar);
-- SELECT @final_bayar AS TotalYangHarusDibayar;
-- CALL sp_hitung_diskon_dan_final(1, 600000, @final_bayar);
-- SELECT @final_bayar AS TotalYangHarusDibayar;

Dengan menggabungkan variabel, parameter, dan logika kondisional, SP kamu jadi powerful banget. Bayangin semua proses bisnis kompleks yang bisa kamu encapsulate di dalam database!

Latihan Ngoding Hari Ini: Kasus "Diskon Dadakan Programmer Malas"

Oke gaes, saatnya otak kamu dipanasin lagi. Kali ini, ceritanya kamu adalah developer di sebuah toko kopi "Ngopi Sambil Ngoding". Bos kamu (yang suka dadakan) minta kamu bikin SP yang bisa ngasih diskon "spesial" ke pelanggan yang berulang tahun di bulan ini. Tapi ada tapinya:

  • Kalau dia ulang tahun di bulan ini, dapat diskon 15%.
  • Kalau total pembeliannya lebih dari Rp 200.000 setelah diskon ulang tahun, dia dapat diskon tambahan 5% lagi dari sisa pembelian.
  • Kalau ada pelanggan yang namanya mengandung kata "coding" (misal: "Budi Coding" atau "Ani Codingsih"), dia otomatis dapat gratis satu cangkir kopi "Kopi Debugger" (nilai Rp 25.000) terlepas dari diskon lainnya.

Tugas kamu:

  1. Buatlah tabel pelanggan dengan kolom id (INT, PRIMARY KEY), nama (VARCHAR), tgl_lahir (DATE).
  2. Isi beberapa data pelanggan, termasuk yang ulang tahun di bulan ini dan yang namanya mengandung kata "coding".
  3. Buatlah Stored Procedure bernama sp_hitung_diskon_spesial yang menerima IN id_pelanggan INT dan IN total_belanja_awal DECIMAL(10, 2).
  4. SP ini harus mengembalikan OUT total_bayar_akhir DECIMAL(10, 2) dan OUT pesan_diskon VARCHAR(500).
  5. Di dalamnya, gunakan variabel, IF-ELSE untuk logika diskon, dan tentukan apakah pelanggan dapat "Kopi Debugger" gratis.
  6. Uji SP kamu dengan memanggilnya beberapa kali dengan ID pelanggan dan total belanja awal yang berbeda.

Hint: Kamu mungkin butuh fungsi MySQL seperti MONTH() untuk mengecek bulan ulang tahun. Jangan lupa pakai CONCAT() buat bikin pesan diskon yang informatif! Selamat mencoba, jangan sampai nemu bug yang bikin lembur!

Gimana, udah mulai kerasa kan sensasi jadi programmer sejati yang bisa bikin database kamu jadi lebih interaktif? Ini baru permulaan dari jurus-jurus sakti di MySQL. Di bagian selanjutnya, mungkin kita akan bahas trigger atau event yang juga gak kalah mantulnya. Tetap semangat ngoding, jangan lupa commit perubahanmu, dan yang terpenting: jangan lupa bahagia!

Sampai jumpa di artikel berikutnya, gaes!

Bagikan Artikel Ini