Memanggil Stored Procedure di MySQL

Pendahuluan:
Sebuah fungsi pada pemrograman biasanya digunakan untuk mengerjakan tugas tertentu dan dapat digunakan berulang kali sehingga dengan adanya fungsi tersebut penulisan kode program menjadi lebih singkat karena cukup dengan memanggil nama fungsi yang dibuat. Di MySQL sendiri stored function dapat dipanggil ke dalam stored procedure untuk mengerjakan tugas tertentu yang tidak dapat dilakukan dengan cara pada umumnya, sebagaimana penulis memiliki tabel berikut:

Tabel Produk
Tabel Harga
Tabel Pesan
Tabel Transaksi

Dari tabel diatas penulis ingin ketika input data pada tabel transaksi bisa langsung mendapati hasil total harga dan total berat tanpa harus menghitungnya secara manual namun dalam praktiknya kita tidak dapat secara langsung menambahkan total harga dan total berat kedalam tabel transaksi dengan pernyataan insert karena adanya proses perhitungan terlebih dahulu dengan mendapatkan data bobot dan harga berdasarkan id_user, produkid dan jumlah barang yang dipesan dari tabel pesan sehingga tidak memungkinkan jika menggunakan pernyataan insert ataupun insert into select. Sederhananya, adapun rumus dan query untuk mendapatkan total harga adalah sebagai berikut: 

Rumus menghitung total harga:
(harga - (harga * diskon / 100)) * jumlah produk yang dipesan
Query:

//hitung total harga
mysql> select (harga.harga - (harga.harga * harga.diskon / 100)) * pesan.jumlah as Tharga from produk
    -> INNER JOIN harga ON harga.produkid = produk.id
    -> INNER JOIN pesan ON pesan.produkid = produk.id
    -> WHERE pesan.id = 1;
+------------+
| Tharga     |
+------------+
| 28800.0000 |
+------------+
1 row in set (0.00 sec)

Rumus menghitung total bobot:
bobot * jumlah
Query:

mysql> select produk.bobot * pesan.jumlah as TBerat from produk
    -> INNER JOIN pesan ON pesan.produkid = produk.id
    -> WHERE pesan.id = 1;
+--------+
| TBerat |
+--------+
|    500 |
+--------+
1 row in set (0.00 sec)

Tentu akan merepotkan jika kita menghitungnya terlebih dahulu secara manual, maka untuk mempermudah hal tersebut kita dapat membuat sebuah fungsi dari query diatas sehingga nantinya dapat dipanggil dan digunakan oleh stored procedure.

Memanggil fungsi didalam Stored Procedure

Umumnya untuk memanggil stored function didalam stored procedure mysql adalah dengan menyimpannya pada sebuah variable dengan menggunakan keyword declare, berikut adalah contohnya:

//Fungsi hitung total harga
delimiter $$
create function tharga (psnid int)
returns int
deterministic
begin
DECLARE hardis INT;
select (harga.harga - (harga.harga * harga.diskon / 100)) * pesan.jumlah from produk 
INNER JOIN harga ON harga.produkid = produk.id
INNER JOIN pesan ON pesan.produkid = produk.id
WHERE pesan.id = psnid
INTO hardis;
return hardis;
end $$
delimiter ;

//Fungsi hitung total berat
delimiter $$
create function tberat (psnid int)
returns int
deterministic
begin
DECLARE berat INT;
select produk.bobot * pesan.jumlah from produk 
INNER JOIN pesan ON pesan.produkid = produk.id
WHERE pesan.id = psnid
INTO berat;
return berat;
end $$
delimiter ;

Memanggil stored function didalam stored procedure:

delimiter $$
CREATE procedure pesan (IN psnid INT, IN hardis int, IN berat int, invoice varchar(25), resi varchar(25), keterangan text, tgl_transaksi date, kurir_id int)
BEGIN
DECLARE hargatotal INT;
DECLARE beratotal INT;
select tharga(psnid)
into hargatotal;
select tberat (psnid)
into beratotal;
insert into transaksi (pesan_id, t_harga, t_bobot, invoice, resi, keterangan, tgl_transaksi, kurir_id) values 
(psnid, hargatotal, beratotal, invoice, resi, keterangan, tgl_transaksi, kurir_id);
END $$
delimiter ;

Penjelasan:
delimiter $$ : Memulai delimiter
Create procedure pesan (field) : Pembuatan procedure pesan beserta kolom tabel dan function
Begin : Menandai awal dari pembuatan stored procedure
DECLARE hargatotal INT : Mendefinisikan variabel hargatotal untuk menampung nilai total harga dari fungsi tharga
DECLARE beratotal INT : Mendifinisikan variabel beratotal untuk menampung total berat dari fungsi tberat
select tharga(psnid) / tberat : Mendapatkan tharga dimana nilainya disimpan pada variabel hargatotal / beratotal
insert into transaksi(field) : Adalah field yang dipilih untuk mendapatkan input data
value (field) : Adalah field yang menampung nilai yang akan disimpan ke dalam tabel transaksi
end $$ : Mengakhiri delimiter
delimiter ; : Menutup delimiter

Berikut adalah hasilnya:

mysql> call pesan (1, 1, 1, "AKLDJS/AKJS22SLKJ", "122ASKJ", "COBA PROSEDUR PESAN", "2021-09-22", 1);
Query OK, 1 row affected (0.49 sec)
mysql> call pesan (2, 1, 1, "AKLDJS/AKJS22SLKJ", "122ASKJ", "PROSEDUR PESAN KE 2", "2021-09-22", 1);
Query OK, 1 row affected (0.17 sec)

mysql> select * from pesan where kustomerid = 1;
+----+----------+--------+------------+
| id | produkid | jumlah | kustomerid |
+----+----------+--------+------------+
|  1 |        1 |      4 |          1 |
|  2 |        2 |      1 |          1 |
|  3 |        3 |      3 |          1 |
+----+----------+--------+------------+
3 rows in set (0.00 sec)

mysql> select transaksi.t_harga, transaksi.t_bobot, transaksi.keterangan from transaksi
    -> inner join pesan on pesan.id = transaksi.pesan_id
    -> inner join kustomer on kustomer.id = pesan.kustomerid
    -> where kustomer.id = 1;
+---------+---------+----------------------+
| t_harga | t_bobot | keterangan           |
+---------+---------+----------------------+
|   28800 |     500 | COBA PROSEDUR PESANN |
|    8500 |     175 | PROSEDUR PESANN KE 2 |
+---------+---------+----------------------+
2 rows in set (0.10 sec)


Bayu Radityo

Seorang lulusan teknik informatika yang senang dalam berbagi ilmu pengetahuan, dan membuat karya digital berupa photomanipulation dan digital drawing. instagram external-link

Posting Komentar

Lebih baru Lebih lama