June 16, 2026
Laporan Praktikum Basis Data: Prosedur, Fungsi dan Trigger
Nama Lengkap: Muhammad Fauza Asfadani
Muhammad Fauza Asfadani
5 min read
NPM: 2505060011
Prodi: Teknologi Informasi 25
Kelas: Rombel 1 Praktikum Basis Data
Pendahuluan
Prosedur, Fungsi, dan Trigger adalah fitur lanjutan dalam sistem manajemen basis data relasional (RDBMS) yang memungkinkan eksekusi logika bisnis secara langsung di dalam server basis data. Beberapa teknik yang umum digunakan meliputi:
- Stored Procedure: Sekumpulan pernyataan SQL yang disimpan di dalam basis data dan dapat dipanggil kapan saja. Digunakan untuk menyederhanakan operasi yang kompleks dan berulang, serta meningkatkan performa eksekusi karena dikompilasi langsung di server.
- Function: Mirip dengan prosedur, namun dirancang secara spesifik untuk memproses data dan mengembalikan sebuah nilai tunggal ( return value ). Fungsi ini biasanya dapat disematkan dan dipanggil langsung di dalam query seperti pada perintah SELECT .
- Trigger: Blok kode prosedural yang dieksekusi secara otomatis ( triggered ) sebagai respons terhadap peristiwa tertentu pada sebuah tabel, seperti sebelum ( BEFORE ) atau sesudah ( AFTER ) aksi INSERT , UPDATE , atau DELETE . Fitur ini sangat krusial untuk menjaga integritas data tanpa perlu instruksi manual dari pengguna.
Metodologi
Alat dan Bahan
Dalam melaksanakan praktikum ini, diperlukan beberapa perangkat keras dan perangkat lunak sebagai berikut:
- Laptop dengan koneksi internet
- Sistem Operasi Windows
- Aplikasi Paket Web server FlyEnv / XAMPP
- Sistemi pengelola database phpMyAdmin atau Command Prompt
- Medium
- GitHub
Langkah Kerja
- Mengaktifkan modul NGINX dan MariaDB pada aplikasi.
- Membuka CLI atau GUI untuk memanajemen basis datanya.
- Membuat basis data db_toko_buku dan mengaktifkannya.
- Membuat tabel buku , pelanggan , dan transaksi beserta relasinya sesuai panduan Modul 9.
- Mengisi data sampel ( INSERT ) ke dalam ketiga tabel tersebut.
- Mengimplementasikan dan menganalisis teknik otomatisasi query (Procedure, Function, dan Trigger) untuk menyelesaikan poin-poin soal pada Tugas Modul.
Hasil dan Analisis
1. Pembuatan Stored Procedure untuk Tambah Transaksi
DELIMITER //
CREATE PROCEDURE `tambah_transaksi` (
`p_id_pelanggan` INT,
`p_id_buku` INT,
`p_jumlah` INT
)
BEGIN
DECLARE v_harga DECIMAL(10,2);
DECLARE v_stok INT;
DECLARE v_total_harga DECIMAL(10,2);
SELECT harga, stok INTO v_harga, v_stok FROM buku WHERE id_buku = p_id_buku;
IF v_stok < p_jumlah THEN
SELECT 'ERROR: Stok buku tidak mencukupi!' AS pesan;
ELSE
SET v_total_harga = v_harga * p_jumlah;
UPDATE buku SET stok = stok - p_jumlah WHERE id_buku = p_id_buku;
INSERT INTO transaksi (id_pelanggan, id_buku, jumlah, total_harga, tanggal_transaksi)
VALUES(p_id_pelanggan, p_id_buku, p_jumlah, v_total_harga, CURRENT_DATE());
UPDATE pelanggan SET total_belanja = total_belanja + v_total_harga WHERE id_pelanggan = p_id_pelanggan;
SELECT 'Transaksi berhasil' AS pesan;
END IF;
END //
DELIMITER ;DELIMITER //
CREATE PROCEDURE `tambah_transaksi` (
`p_id_pelanggan` INT,
`p_id_buku` INT,
`p_jumlah` INT
)
BEGIN
DECLARE v_harga DECIMAL(10,2);
DECLARE v_stok INT;
DECLARE v_total_harga DECIMAL(10,2);
SELECT harga, stok INTO v_harga, v_stok FROM buku WHERE id_buku = p_id_buku;
IF v_stok < p_jumlah THEN
SELECT 'ERROR: Stok buku tidak mencukupi!' AS pesan;
ELSE
SET v_total_harga = v_harga * p_jumlah;
UPDATE buku SET stok = stok - p_jumlah WHERE id_buku = p_id_buku;
INSERT INTO transaksi (id_pelanggan, id_buku, jumlah, total_harga, tanggal_transaksi)
VALUES(p_id_pelanggan, p_id_buku, p_jumlah, v_total_harga, CURRENT_DATE());
UPDATE pelanggan SET total_belanja = total_belanja + v_total_harga WHERE id_pelanggan = p_id_pelanggan;
SELECT 'Transaksi berhasil' AS pesan;
END IF;
END //
DELIMITER ;Analisis: Procedure ini dirancang untuk mengotomatisasi proses transaksi secara penuh. Sistem akan menerima parameter p_id_pelanggan , p_id_buku , dan p_jumlah . Pertama, sistem memeriksa ketersediaan stok buku. Jika stok kurang dari jumlah beli, transaksi dibatalkan dengan pesan error. Jika stok memadai, sistem secara berurutan akan menghitung total harga, mengurangi stok di tabel buku , mencatat riwayat di tabel transaksi , dan menambahkan nilai total_belanja pada tabel pelanggan . Pendekatan ini memastikan konsistensi data yang kuat karena seluruh alur transaksi dibungkus menjadi satu kesatuan proses.
Pengaplikasian Procedure:
-- Memanggil prosedur untuk pelanggan dengan ID 1 yang membeli 2 buah buku dengan ID 1
CALL tambah_transaksi(1, 1, 2);
-- Memanggil prosedur untuk pelanggan dengan ID 1 yang membeli 10 buah buku dengan ID 4
CALL tambah_transaksi(1, 4, 10);
-- Memeriksa hasil pemanggilan pada tabel transaksi dan perubahan stok di tabel buku
SELECT * FROM transaksi;
SELECT * FROM buku;-- Memanggil prosedur untuk pelanggan dengan ID 1 yang membeli 2 buah buku dengan ID 1
CALL tambah_transaksi(1, 1, 2);
-- Memanggil prosedur untuk pelanggan dengan ID 1 yang membeli 10 buah buku dengan ID 4
CALL tambah_transaksi(1, 4, 10);
-- Memeriksa hasil pemanggilan pada tabel transaksi dan perubahan stok di tabel buku
SELECT * FROM transaksi;
SELECT * FROM buku;
Penjelasan Pengaplikasian: Untuk mengeksekusi Stored Procedure yang telah dibuat, digunakan perintah CALL diikuti dengan nama prosedur dan parameter yang dibutuhkan (ID Pelanggan, ID Buku, dan Jumlah). Pada contoh di atas, setelah pemanggilan berhasil, kita dapat memverifikasi tabel transaksi untuk melihat riwayat baru, tabel buku untuk memastikan stok berkurang sebanyak 2, dan tabel pelanggan untuk memastikan total_belanja bertambah sesuai kalkulasi harga. Dan untuk pemanggilan yang gagal karena kekurangan stok, stok nya tidak akanberkurang.
2. Pembuatan Function untuk Menghitung Diskon
DELIMITER //
CREATE FUNCTION `hitung_diskon` (`total_belanja` DECIMAL(10,2))
RETURNS DECIMAL(5,2)
BEGIN
IF total_belanja < 1000000 THEN
RETURN 0.00;
ELSEIF total_belanja < 5000000 THEN
RETURN 0.05;
ELSE
RETURN 0.10;
END IF;
END//
DELIMITER ;DELIMITER //
CREATE FUNCTION `hitung_diskon` (`total_belanja` DECIMAL(10,2))
RETURNS DECIMAL(5,2)
BEGIN
IF total_belanja < 1000000 THEN
RETURN 0.00;
ELSEIF total_belanja < 5000000 THEN
RETURN 0.05;
ELSE
RETURN 0.10;
END IF;
END//
DELIMITER ;Analisis: Fungsi hitung_diskon dibuat dengan logika kondisional (* IF-ELSEIF ) untuk menentukan persentase potongan harga. Fungsi ini menerima input total_belanja . Berdasarkan parameter yang masuk:
- Belanja kurang dari Rp 1.000.000 akan mengembalikan nilai diskon 0.00 (0%).
- Belanja di bawah Rp 5.000.000 (tapi di atas Rp 1.000.000) akan mengembalikan 0.05 (5%).
- Belanja di atas itu akan mendapatkan diskon maksimal, yakni 0.10 (10%). Nilai return ini bersifat skalar dan sangat dinamis saat dipanggil melalui query SELECT guna menghitung potongan akhir untuk seorang pelanggan.
Pengaplikasian Function:
-- Memanggil fungsi hitung diskon untuk transaksi kurang 1000000
SELECT hitung_diskon(500000) AS diskon_budi;
-- Memanggil fungsi hitung diskon untuk transaksi lebih 1000000
SELECT hitung_diskon(2000000) AS diskon_siti;-- Memanggil fungsi hitung diskon untuk transaksi kurang 1000000
SELECT hitung_diskon(500000) AS diskon_budi;
-- Memanggil fungsi hitung diskon untuk transaksi lebih 1000000
SELECT hitung_diskon(2000000) AS diskon_siti;
Penjelasan Pengaplikasian: Berbeda dengan prosedur, fungsi hitung_diskon langsung disematkan ke dalam query SELECT reguler layaknya fungsi bawaan. Parameter yang dimasukkan adalah sebuah data yang bertipe data DECIMAL. Hasil pemanggilan ini akan menciptakan kolom bayangan ( alias ) baru bernama persentase_diskon untuk tiap pelanggan.
3. Pembuatan Trigger untuk Update Status Member
DELIMITER //
CREATE TRIGGER `updateMember` BEFORE UPDATE ON `pelanggan`
FOR EACH ROW
BEGIN
IF NEW.total_belanja >= 5000000 THEN
SET NEW.status_member='PLATINUM';
ELSEIF NEW.total_belanja >= 1000000 THEN
SET NEW.status_member='GOLD';
ELSE
SET NEW.status_member='REGULER';
END IF;
END //
DELIMITER ;DELIMITER //
CREATE TRIGGER `updateMember` BEFORE UPDATE ON `pelanggan`
FOR EACH ROW
BEGIN
IF NEW.total_belanja >= 5000000 THEN
SET NEW.status_member='PLATINUM';
ELSEIF NEW.total_belanja >= 1000000 THEN
SET NEW.status_member='GOLD';
ELSE
SET NEW.status_member='REGULER';
END IF;
END //
DELIMITER ;Analisis: Trigger ini menggunakan timing BEFORE UPDATE yang ditautkan pada tabel pelanggan . Artinya, setiap kali ada nilai yang di-update (termasuk dari efek pemanggilan prosedur tambah_transaksi sebelumnya), trigger ini akan berjalan secara otomatis ( For Each Row ). Jika data total_belanja yang baru ( NEW.total_belanja ) mencapai Rp 5.000.000 atau lebih, kolom status_member akan langsung diubah menjadi PLATINUM . Jika di atas Rp 1.000.000 menjadi GOLD , dan di bawah itu tetap REGULER . Fitur ini memastikan level keanggotaan pelanggan selalu sinkron dengan transaksinya secara real time tanpa adanya campur tangan kode dari pihak aplikasi luar.
Pengaplikasian Trigger:
-- Mengeksekusi query untuk menampilkan detail pelanggan
SELECT * FROM pelanggan;-- Mengeksekusi query untuk menampilkan detail pelanggan
SELECT * FROM pelanggan;
Penjelasan Pengaplikasian: Karena Trigger bekerja di latar belakang, kita tidak memanggilnya menggunakan perintah khusus. Pengaplikasiannya dibuktikan saat melakukan pemanggilan prosedur untuk menambahkan transaksi. Saat query procedure dieksekusi, sistem secara otomatis ( triggered ) mengintervensi proses tersebut dan sekaligus mengubah kolom status_member menjadi PLATINUM (karena nilainya melebihi batas Rp 5.000.000) sebelum data akhir benar-benar disimpan ke dalam tabel.
Kesimpulan
Berdasarkan praktikum Basis Data terkait Modul 9 yang telah dilakukan, dapat disimpulkan bahwa implementasi Stored Procedure, Function, dan Trigger merupakan praktik fundamental untuk meningkatkan keandalan sebuah RDBMS. Penggunaan ketiga fitur ini memindahkan beban logika bisnis dari lapisan aplikasi (front-end/back-end) langsung ke lapisan basis data. Hal ini tidak hanya meminimalisir anomali dan mencegah ketidaksinkronan data antar tabel ( data integrity ), namun juga secara drastis mempercepat proses pengolahan data.
Referensi dan Lampiran
Sebagai bagian dari transparansi dan dokumentasi teknis, seluruh kode sumber ( query ) yang digunakan dalam praktikum ini telah diunggah ke repositori GitHub. Hal ini juga bertujuan untuk memudahkan pengelolaan versi ( version control ) di masa mendatang.
- GitHub Repositori : https://github.com/asfadani/asfadani_kuliah.git
- File SQL : TugasModul9_DBMS_2505060011.sql
- Referensi :Ahmad Ngroho. Modul 9 — SP-FC-TG. Universitas Tidar Magelang