Prosedur dan Fungsi
- Prosedur dan fungsi merupakan objek database yang berisi runtutan perintah untuk melaksanakan satu tugas khusus tertentu.
- Prosedur dan fungsi disimpan di dalam database, sehingga jika database dihapus, keduanya kan hilang.
- Prosedur dan fungsi sering juga disebut sebagai stored procedure dan stored function.
- Sekali dibuat, prosedur dan fungsi dapat digunakan secara berulang.
Manfaat Prosedur dan Fungsi
Pembuatan prosedur dan fungsi memiliki beberapa manfaat, di antaranya:
-
Sintaks SQL lebih fleksibel
Mengizinkan kita untuk menulis kode logis di dalam prosedur atau fungsi (bisa mengandung kontruksi pengulangan maupun percabangan).
-
Memiliki kemampuan untuk menanganni kesalahan (error)
Kesalahan yang terjadi pada saat eksekusi prosedur atau fungsi dapat ditangani dengan benar.
-
Pembungkusan kode (code packaging and encapsulation)
Prosedur dan fungsi di simpan di dalam server database. Dengan demikian, kode hanya ditulis sekali, tapi prosedur atau fungsi tersebut dapat digunakan oleh banyak aplikasi klien. Tentu hal ini akan meringankan tugas dari aplikasi klien.
-
Mudah dipelihara
Kita hanya perlu merubah kode prosedur atau fungsi di sisi server dan perubahan otomatis akan diterpakna ke semua aplikasi klien.
Perbedaan Prosedur dan Fungsi
Perbedaan antara prosedur dan fungsi terletak pada peruntukan, cara pembuatan dan cara eksekusinya. Berikut hal-hal yang perlu diperhatikan.
-
Prosedur tidak mengembalikan nilai
Prosedur hanya melakukan suatu proses atau operasi tertentu, contohnya mengubah struktur tabel dan data dalam suatu tabel. Prosedur dieksekusi menggunakan perintah
CALL
. -
Fungsi mengembalikan nilai
Cara eksekusinya adalah dengan meletakkan nama fungsi (beserta parameternya, jika ada) sebagai ekspresi, misalnya dalam perintah
SELECT
, dalam rumus perhitungan maupun ayng lain. Ini berarti bahwa pemanggilan fungsi sama seperti penggunaan variabel atau konstanta. -
Cara Eksekusi
Fungsi tidak bisa dieksekusi menggunakan perintah CALL. Demikian juga, prosedur tidak dapat dieksekusi di dalam ekspresi.
-
Parameter
Parameter yang didefinisikan di dalam prosedur dapat bersifat sebagai parameter masukan (input only), parameter keluaran (output only), mapupun gabungan dari keduanya (dikenal dengan parameter masukan/keluaran). Karena alasan tersebut,s ebenarnya prosedur juga dapat digunakan untuk mengembalikan nilai, asalkan nilai tersebut ditampung ke dalam parameter keluaran. Fungsi hanya memiliki parameter masukan.
-
Klausa RETURNS
Karena fungsi merupakan sub-program yagn mengembalikan nilai, maka saat pembuatannya kita harus menggunakan klausa
RETURNS
di bagian kepala atau judul fungsi dan diikuti dengan tipe data dari nilai yang akan dikembalikan.Selain itu, di bagian akhir badan fungsi kita juga perlu menggunakan klausa
RETURN
untuk mengembalikan nilai yang diperoleh dari proses yang telah dilakukan oleh fungsi. KlausaRETURNS
danRETURN
tidak ditemukans saat kita mendeklarasikan prosedur.
Membuat dan Mengeksekusi Prosedur
- Prosedur dapat memiliki satu atau lebih perintah yang dikumpulkan menjadi satu kelompok. Oleh karena itu, kita perlu menggunakan blok
BEGIN-END
. - Setiap perintah di dalma prosedur harus dipisahkan menggunakan tanda titik koma/ semicolon (;).
Format pembuatan prosedur pada umumnya sebagaimana berikut.
CREATE PROCEDURE [nama_prosedur] ([daftar parameter])
BEGIN
[daftar deklarasi variabel]
[perintah1];
[perintah2]
... dst
END;
DELIMITER //
CREATE PROCEDURE select_penerbit()
BEGIN
SELECT penerbit_nama
FROM penerbit
WHERE penerbit_id='PB06';
END;
//
select_penerbit()
tersebut berfungsi untuk menampilkan nama penerbit yang memiliki id penerbit PB06
.
Selanjutnya, kita coba membuat prosedur yang memiliki parameter.
DELIMITER //
CREATE PROCEDURE
insert_penerbit(id char(4), nama varchar(50))
BEGIN
INSERT INTO penerbit
(penerbit_id, penerbit_nama)
VALUES (id, nama);
END;
//
Sinar Terang
dengan penerbit_id PB10
bertengger di baris terakhir.
Membuat dan Mengeksekusi Fungsi
Untuk membuat fungsi kita perlu menggunakan CREATE FUNCTION
disusul dengan RETURNS
dan diakhiri dengan RETURN
. Berikut formatnya.
CREATE FUNCTION
[nama_fungsi]([daftar parameter])
RETURNS [tipe data]
BEGIN
[daftar deklarasi variabel]
[perintah1];
[perintah2];
... [dst]
RETURN [nilai keluaran];
END;
RETUNRS
[tipe data] berfungsi untuk menentukan tipe data keluaran dari fungsi tersebut. Semisal kita ingin emngembalikan nilai berupa bilangan bulat, berarti kita perlu menulis RETURNS INT
.
Mari kita buat contohnya.
CREATE FUNCTION harga_buku(isbn CHAR(13))
RETURNS DECIMAL(10, 0) DETERMINISTIC
BEGIN
-- Mendeklarasikan veriabel
DECLARE harga DECIMAL(10,0);
-- Seleksi data dan menampung hasilnya ke dalam variabel
SELECT buku_harga INTO harga
FROM buku
WHERE buku_isbn = isbn;
-- Mengembalikan nilai hasil proses
RETURN harga;
END;
//
Ingin lebih jelas? kita coba begini.
Kita juga bisa memanggil fungsi di dalam ekspresi secara langsung. Contoh:
Dalam contoh tersebut, pemanggilan fungsi secara langsung digunakan untuk proses perkalian dengan bilangan lain. Dengan demikian, eksekusi fungsi perlakuannya sama dengan penggunaan variabel normal.Menghapus Prosedur dan Fungsi
Kita gunakan DROP PROCEDURE
untuk menghapus prosedur, dan DROP FUNCTION
untuk menghapus fungsi, diikuti nama prosedur ataupun fungsi. Contoh:
Menampilkan Daftar Prosedur dan Fungsi
Ada beberapa variasi perintah di dalam MySQL untuk menampilkan prosedur maupun fungsi.
Query-1
Menampilkan seluruhprosedur yang tersimpan di dalam database beserta properti dan informasi metadata lainnya.
Query-2
Menampilkan prosedur berdasarkan filter yang dilakukan menggunakan klausa LIKE
.
Query-3
Menampilkan seluruh fungsi yang tersimpan dalam database, beserta properti dan informasi metadata dari fungsi-fungsi tersebut.
Hak Akses untuk Bekerja dengan Prosedur dan Fungsi
Untuk bekerja menggunakan prosedur dan fungsi kita perlu memiliki beberapa hak akses berikut.
-
CREATE ROUTINE
Untuk membuat prosedur maupun fungsi.
-
EXECUTE
Untuk mengeksekusi prosedur maupun fungsi.
-
ALTER ROUTINE
Untuk mengubah atau menghapus prosedur maupun fungsi.
Variabel di dalam Prosedur dan Fungsi
- Pada saat membuat prosedur maupun fungsi, terkadang kita memerlukan satu atau lebih variabel untuk menampung nilai sementara dari proses yang dilakukan di dalam prosedur atau fungsi bersangkutan.
- Untuk mendeklarasikan variabel, kita gunakan perintah
DECLARE
, formatnya adalah - Perintah
DECLARE
harus berada di dalam blokBEGIN-END
sebagai mana pada contoh sebelumnya di sini. Pada contoh tersebut kita mendeklarasikan variabelharga
dengan tipeDECIMAL
dengan lebar 10. - Untuk melakukan inisialisasi nilai terhadap variabel yang telah dideklarasikan, kita perlu menggunakan perintah
SET
dengan format Contoh: - Jika suatu variabel diugnakan untuk menampung nilai yang diperoleh dari suatu tabel dalam database, kita bisa mengisikannya ke dalam variabel dengan perintah
SELECT ... INTO
. Contoh:
Pemilihan dalam Prosedur dan Fungsi
IF
danCASE
bisa kita gunakan untuk melakukan pemilihan perintah atau aksi. Pemilihan ini didasarkan pada kondisi tertentu.- Dalam blok pemilihan, aksi hanya dieksekusi jika kondisi yang didefinisikan bernilai benar.
Perintah IF
Bentuk umum perintah IF
adalah:
Bentuk 1
Ini adalah bentuk yang paling sederhana, karena hanya memiliki satu kondisi untuk diperiksa. Jika ekspresi bernilai benar, maka daftar aksi akan dieksekusi, namun jika salah, maka aksi tidak akan dijalankan.
Bentuk 2
Ini adalah bentuk yang sedikit lebih kompleks. Jika kondisi1 bernilai benar, maka daftar aksi1 akan dijalankan. Jika tidak, maka akan dilanjutkan pengecekan kondisi2, jika benar, maka daftar aksi2 akan dijalankan. Jika tidak maka daftar aksi3 yang akan dijalankan.Kita coba contoh berikut.
DELIMITER //
CREATE FUNCTION get_penerbit9isbn CHAR(13)
RETURNS VARCHAR(50) DETERMINISTIC
BEGIN
DECLARE namapenerbit VARCHAR(50);
SELECT b.penerbit_nama INTO namapenerbit
FROM
buku a,
penerbit b
WHERE
a.penerbit_id = b.penerbit_id
AND
a.buku_isbn = isbn;
IF namapenerbit IS NULL THEN
SET namapenerbit = '';
END IF;
RETURN namapenerbit;
END;
//
Penjelasan Kode
Inti penggunaan IF
pada kode di atas adalah, jika namapenerbit
bernilai NULL
maka variabel namapenerbit
akan diisi dengan nilai string kosong.
Sekarang coba kita tes fungsi tersebut.
Perintah CASE
Format penggunaan CASE
adalah sebagai berikut.
CASE [ekspresi]
WHEN [nilai1]
THEN [daftar aksi1];
WHEN [nilai2]
THEN [daftar aksi2];
...[dst]
ELSE [daftar aksi]
END CASE
Penjelasan Kode
Jika ekspresi yang diperiksa memiliki nilai yang sama dengan nilai1, maka yang akan dieksekusi adalah daftar aksi1. Jika ekspresi sama dengan nilai2, maka yang akan dieksekusi adalah daftar aksi2, dan seterusnya.
Jika semua nilai konstan yang didefinisikan tidak ada yang sama dengan ekspresi, maka yang akan dieksekusi adalah daftar aksi yang terdapat pada bagian ELSE
.
Sekarang kita coba menerapkan CASE
dengan fungsi berikut.
DELIMITER //
CREATE FUNCTION ubah_format_tanggal(tanggal DATE)
RETURNS VARCHAR(30) DETERMINISTIC
BEGIN
DECLARE dd INT(2);
DECLARE mm INT(2);
DECLARE yy INT(4);
DECLARE bulan VARCHAR(9);
SET dd = EXTRACT(DAY FROM tanggal);
SET mm = EXTRACT(MONTH FROM tanggal);
SET yy = EXTRACT(YEAR FROM tanggal);
CASE mm
WHEN 1 THEN SET bulan = 'Januari';
WHEN 2 THEN SET bulan = 'Februari';
WHEN 3 THEN SET bulan = 'Maret';
WHEN 4 THEN SET bulan = 'April';
WHEN 5 THEN SET bulan = 'Mei';
WHEN 6 THEN SET bulan = 'Juni';
WHEN 7 THEN SET bulan = 'Juli';
WHEN 8 THEN SET bulan = 'Agustus';
WHEN 9 THEN SET bulan = 'September';
WHEN 10 THEN SET bulan = 'Oktober';
WHEN 11 THEN SET bulan = 'November';
WHEN 12 THEN SET bulan = 'Desember';
END CASE;
RETURN CONCAT(
CONVERT(dd, CHAR),
' ',
bulan,
' ' ,
CONVERT(yy, CHAR)
);
END
//
Penjelasan Kode
Fungsi di atas berguna untuk mengubah format tanggal yang dilewatkan sebagai parameter, dari bentuk standar (dalam format angka) ke bentuk tanggal yang menggunakan nama bulan.
Sekarang mari kita coba gunakan fungsi tersebut.
SELECT
buku_judul "Judul",
ubah_format_tanggal(buku_tgl_terbit) "Tanggal Terbit",
buku_harga "Harga"
FROM
buku;
ubah_format_tanggal
.
Pengulangan dalam Prosedur dan Fungsi
Satu atau beberapa aksi dapat dieksekusi secara berulang menggunakan blok perulangan. Di dalam MySQL blok perulangan dapat dibuat menggunakan:
LOOP
WHILE
REPEAT
Perintah LOOP
LOOP
merupakan bentuk perulangan yang tidak memiliki kondisi, maka normalnya perulangan akan dilakukan secara terus-menerus.- Untuk menghentikan perulangan tersebut, kita perlu menggunakan perintah
LEAVE
.
Berikut format sintaksnya
Mari langsung kita buat contohnya dengan memasukkan LOOP
ke dalam sebuah fungsi.
DELIMITER //
CREATE FUNCTION jumlahkan(n INT)
RETURNS int(11) DETERMINISTIC
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE total INT DEFAULT 0;
myloop: LOOP
SET i = i + 1;
IF i > n THEN
-- keluar dari perulangan
LEAVE myloop;
END IF;
SET total = total + i;
END LOOP myoop;
RETURN total;
END;
//
Penjelasan Kode
Kita memberi label pada badan perulangan dengan nama myloop
. Fungsi di atas berguna untuk menjumlahkan n buah bilangan positif pertama.
Sebagai contoh, jika n bernilai 5, maka hasilnya adalah 15, berasal dari 1 + 2 + 3 + 4 + 5.
Sekarang, kita coba eksekusi fungsi LOOP
tersebut.
Perintah WHILE
WHILE
merupakan bentuk preintah untuk melakukan perulangan dengan cara memeriksa kondisi tertentu.- Kondisi yang akan diperiksa ditempatkan di bagian awal blok.
- Aksi yang berada di dalam badan perulangan hanya akan dieksekusi jika kondisi terpenuhi (bernilai benar).
- Jika kondisi bernilai salah, maka aksi di dalam badan perulangan akan diabaikan dan proses eksekusi dilanjutkan ke aksi setelah blok perulangan (jika ada).
Bentuk umum sintaksnya adalah
Mari kita buat fungsi yang mengandung WHILE
DELIMITER //
CREATE FUNCTION jumlahkan_while(n INT)
RETURNS int(11) DETERMINISTIC
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE total INT DEFAULT 0;
WHILE (i <= n) DO
SET total = total + i;
SET i = i + 1;
END WHILE;
RETURN total;
END;
//
Penjelasan Kode
Fungsi di atas merupakan modifikasi dari kode program sebelumnya. Perbedaannya, kali ini kita menggunakan perintah WHILE
dalam proses pengulangan aksinya. Hasil yang diperoleh sama seperti pada fungsi sebelumnya.
Perintah REPEAT
REPEAT
hampir sama denganWHILE
, hanya berbeda pada penempatan kondisinya saja.- Pada
REPEAT
, pemeriksaan kondisi ditempatkan pada bagian akhir blok perulangan. REPEAT
minimal akan menjalankan aksi minimal 1 kali.
Format sintaks REPEAT
sebagai berikut.
DELIMITER //
CREATE FUNCTION jumlahkan_repeat(n INT)
RETURNS int(11) DETERMINISTIC
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE total INT DEFAULT 0;
REPEAT
SET total = total + i;
SET i = i + 1;
UNTIL (i > n)
END REPEAT;
RETURN total;
END;
//
Penjelasan Kode
Ketika dieksekusi, cara kerja fungsi di atas akan sama seperti dua fungsi sebelumnya 😂
Perintah LEAVE dan ITERATE
- Proses pengulangan dapat dipaksa untuk berhenti atau untuk diteruskan menggunakan pernyataan loncat (jump statement).
- Untuk menghentikan, kita bisa menggunakan
LEAVE
, sedangkan untuk melanjutkan perulangan kita bisa menggunakanITERATE
.
Mari kita coba terapkan keduanya pada fungsi berikut.
DELIMITER //
CREATE PROCEDURE tampilkan_bil_genap(n INT)
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE str VARCHAR(200) DEFAULT '';
next: LOOP
SET i = i + 1;
IF (i mod 2 = 1) THEN
ITERATE next;
END IF;
IF (i > n) THEN
LEAVE next;
END IF;
SET str = CONCAT(str, CONVERT(i, CHAR), ' ');
ENd LOOP next;
SELECT str AS "Bilangan Genap";
END;
//
Penjelasan Kode
Pada kode di atas, kita membuat sebuah prosedur yang dapat menampilkan bilangan genap yang terdapat antara bilangan 1 dan n. Nilai n ditentukan pada saat pemanggilan prosedur.
Sekarang kita coba panggil prosedur di atas.
Tentu saja
Perintah tersebut akan menampilkan bilangan genap aygn berada dalam rentang 1 dan 20.