Cara Membuat Function Di Mysql

function (stored function) itu blok kode SQL yang bisa dipanggil berulang kali dan mengembalikan satu nilai. biasanya dipakai buat kalkulasi atau logika yang sering muncul di query. sebelum bikin function, kalian perlu paham dulu fungsi agregat COUNT, SUM, AVG dan cara membuat view di MySQL.
momen saya pertama kali nyadar kegunaan function di MySQL itu pas logika hitung diskon yang sama harus dipakai di lima query yang beda-beda. tanpa function, saya harus nyalin rumusnya lima kali, dan setiap ada perubahan, lima tempat itu harus diubah satu-satu. dengan function, cukup ubah satu tempat. dari pengalaman itu saya langsung jatuh cinta sama fitur ini 🙂
1. Perbedaan Function dan Stored Procedure
sebelum mulai bikin, penting banget paham bedanya, karena dua-duanya sering bikin bingung:
| Aspek | Function | Stored Procedure |
|---|---|---|
| Return value | ✅ Wajib (satu nilai) | ❌ Bisa 0 atau banyak |
| Digunakan di query SQL | ✅ Bisa (SELECT func()) | ❌ Tidak bisa |
| Parameter | IN saja | IN, OUT, INOUT |
| Output | Hanya RETURN | SELECT + OUT param |
intinya gini: kalau kalian butuh sesuatu yang dipanggil langsung di dalam SELECT dan mengembalikan satu nilai, pakai function. kalau butuh alur proses panjang yang tidak harus mengembalikan apa-apa, procedure lebih pas.
2. Sintaks Dasar Function
DELIMITER //
CREATE FUNCTION nama_function(parameter TIPE)
RETURNS tipe_data
DETERMINISTIC
BEGIN
-- logika SQL
RETURN nilai;
END //
DELIMITER ;
penjelasannya satu-satu:
DELIMITER //, buat ngubah delimiter supaya;di dalam function tidak menghentikan definisi. ini langkah yang paling sering dilupakan pemula, dan hasilnya error misteriussyntax error near ''DETERMINISTIC, label bahwa function selalu mengembalikan nilai sama untuk input yang samaRETURNS, tipe data yang dikembalikan, perhatikan ada huruf S di akhir, beda samaRETURNRETURN, nilai yang dikembalikan, ini yang menentukan hasilnya
3. Contoh Function Sederhana
Function Menghitung PPN
DELIMITER //
CREATE FUNCTION hitung_ppn(harga DECIMAL(10,2))
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
RETURN harga * 0.11;
END //
DELIMITER ;
penggunaannya:
SELECT hitung_ppn(100000); -- 11000.00
-- Di query tabel
SELECT nama, harga, hitung_ppn(harga) as ppn
FROM produk;
liat enaknya? rumus PPN cukup ditulis sekali, terus dipakai di mana aja. kalau tarif pajak berubah, ubah satu tempat, semua query langsung ikut.
Function Diskon
DELIMITER //
CREATE FUNCTION hitung_diskon(harga DECIMAL(10,2), persen INT)
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
RETURN harga - (harga * persen / 100);
END //
DELIMITER ;
-- Penggunaan
SELECT hitung_diskon(100000, 20); -- 80000.00
function bisa nerima lebih dari satu parameter, tinggal pisahin pakai koma. ini contoh yang paling sering saya pakai di project toko online.
4. Function dengan Logika Kondisi
function tidak cuma bisa ngitung, tapi juga bisa ngambil keputusan pakai IF ELSEIF:
DELIMITER //
CREATE FUNCTION kategori_nilai(nilai INT)
RETURNS VARCHAR(10)
DETERMINISTIC
BEGIN
DECLARE grade VARCHAR(10);
IF nilai >= 90 THEN
SET grade = 'A';
ELSEIF nilai >= 80 THEN
SET grade = 'B';
ELSEIF nilai >= 70 THEN
SET grade = 'C';
ELSEIF nilai >= 60 THEN
SET grade = 'D';
ELSE
SET grade = 'E';
END IF;
RETURN grade;
END //
DELIMITER ;
-- Penggunaan
SELECT kategori_nilai(85); -- B
dua hal baru di sini: DECLARE buat deklarasi variabel lokal, dan SET buat ngasih nilai. di MySQL, ELSEIF ditulis sambung tanpa spasi, beda sama elif di python.
5. Function dengan Query
function juga bisa baca data dari tabel lain, contohnya hitung total belanja seorang pelanggan:
DELIMITER //
CREATE FUNCTION total_order(id_pelanggan INT)
RETURNS DECIMAL(10,2)
READS SQL DATA
BEGIN
DECLARE total DECIMAL(10,2);
SELECT SUM(total) INTO total
FROM orders
WHERE customer_id = id_pelanggan;
RETURN COALESCE(total, 0);
END //
DELIMITER ;
-- Penggunaan
SELECT nama, total_order(id) as total_belanja
FROM customers;
karena function ini baca data tabel, labelnya bukan DETERMINISTIC tapi READS SQL DATA. ada juga COALESCE(total, 0) buat nanganin pelanggan yang tidak punya order sama sekali, biar hasilnya 0 bukan NULL.
6. Function Menghitung Umur
DELIMITER //
CREATE FUNCTION hitung_umur(tanggal_lahir DATE)
RETURNS INT
DETERMINISTIC
BEGIN
DECLARE umur INT;
SET umur = TIMESTAMPDIFF(YEAR, tanggal_lahir, CURDATE());
RETURN umur;
END //
DELIMITER ;
-- Penggunaan
SELECT nama, hitung_umur(tanggal_lahir) as umur
FROM karyawan;
TIMESTAMPDIFF(YEAR, ...) ngitung selisih tahun antara tanggal lahir dan hari ini. function ini saya pakai terus di laporan karyawan, daripada nulis rumusnya berulang-ulang.
7. Function Format Rupiah
DELIMITER //
CREATE FUNCTION format_rupiah(angka DECIMAL(15,2))
RETURNS VARCHAR(50)
DETERMINISTIC
BEGIN
RETURN CONCAT('Rp', FORMAT(angka, 0, 'id_ID'));
END //
DELIMITER ;
-- Penggunaan
SELECT format_rupiah(15000000); -- Rp15.000.000
kalau kalian banyak tampilin harga di aplikasi, function ini langsung dipakai di query dan hasilnya sudah rapi berformat rupiah, tidak perlu format ulang di kode PHP atau JavaScript.
8. Melihat dan Menghapus Function
-- Lihat function yang ada
SHOW FUNCTION STATUS WHERE Db = 'nama_database';
-- Lihat definisi function
SHOW CREATE FUNCTION hitung_ppn;
-- Hapus function
DROP FUNCTION IF EXISTS hitung_ppn;
tiga perintah ini wajib hafal. kalau mau ubah function yang sudah ada, mysql tidak punya ALTER FUNCTION buat ganti isinya, jadi caranya DROP dulu, terus CREATE lagi. SHOW CREATE FUNCTION juga berguna buat backup definisi sebelum dihapus.
9. DETERMINISTIC vs NOT DETERMINISTIC
-- DETERMINISTIC: input sama → hasil selalu sama
CREATE FUNCTION tambah(a INT, b INT) RETURNS INT DETERMINISTIC ...
-- NOT DETERMINISTIC: hasil bisa berbeda (pakai NOW(), RAND())
CREATE FUNCTION get_tahun() RETURNS INT NOT DETERMINISTIC ...
kalau ragu, pakai NOT DETERMINISTIC aja. function DETERMINISTIC itu di-cache lebih agresif oleh MySQL dan bisa dipakai di index.
buat function yang dipanggil di banyak baris, misalnya di SELECT atas tabel besar, perhatikan perbedaan ini sejak awal. salah kasih label bisa bikin MySQL nolak function kalian di konteks tertentu, dan errornya kadang bikin bingung. aturan sederhananya, kalau function pakai
NOW(),RAND(), atau baca data tabel, tandaiNOT DETERMINISTIC.
10. Izin Eksekusi dan Debug Cepat
function yang sudah jadi kadang tidak bisa dipanggil user lain karena belum ada izin. di MySQL, hak eksekusi diatur terpisah.
-- Beri izin ke user aplikasi
GRANT EXECUTE ON FUNCTION hitung_ppn TO 'app_user'@'localhost';
-- Cek siapa yang bisa eksekusi
SHOW GRANTS FOR 'app_user'@'localhost';
jika muncul ERROR 1370: execute command denied, hampir pasti belum GRANT. saya sendiri pernah stuck setengah jam karena function jalan di root tapi error di user aplikasi, ternyata cuma kurang satu baris GRANT di atas 🙂
buat debug cepat, jangan langsung SELECT di tabel besar. coba di SELECT polos dulu:
SELECT hitung_ppn(100000); -- harus 11000
SELECT hitung_diskon(100000,20); -- harus 80000
SELECT kategori_nilai(85); -- harus B
kalau tiga tes kecil di atas sudah benar, baru pakai di query JOIN yang panjang. cara ini hemat waktu, tidak perlu bongkar query besar hanya buat cek function.
Kesimpulan
rangkuman cara bikin function di MySQL, dari awal sampai akhir:
- ubah delimiter dulu pake
DELIMITER // - tulis
CREATE FUNCTIONdiikuti nama dan parameter - tentukan tipe data return dengan
RETURNS - kasih label
DETERMINISTIC,NOT DETERMINISTIC, atauREADS SQL DATA - isi logika SQL di dalam
BEGIN ... END - kembalikan hasilnya dengan
RETURN nilai; - balikin delimiter normal pake
DELIMITER ;
Baca Juga Mengenai :
Pertanyaan yang Sering Diajukan
Apa itu function di MySQL?
function atau stored function adalah blok kode SQL yang bisa dipanggil berulang kali dan mengembalikan satu nilai. cocok buat kalkulasi atau logika yang sering dipakai di query.
Bagaimana cara membuat function di MySQL?
pakai CREATE FUNCTION diikuti nama, parameter, tipe return, lalu logika SQL di dalam BEGIN dan END, dan akhiri dengan RETURN. jangan lupa ubah DELIMITER dulu biar titik koma di dalam function tidak menghentikan definisi.
Apa bedanya function dan stored procedure di MySQL?
function wajib mengembalikan satu nilai dan bisa dipanggil langsung di query SELECT, sedangkan procedure bisa mengembalikan 0 atau banyak nilai dan dipanggil pakai CALL.
Kapan pakai DETERMINISTIC dan NOT DETERMINISTIC?
pakai DETERMINISTIC kalau input sama selalu menghasilkan output sama, misal hitung diskon. kalau function pakai NOW(), RAND(), atau baca data tabel, tandai NOT DETERMINISTIC.

