Stored procedures can provide improved performance because less information needs to be sent between the server and the client. The tradeoff is that this does increase the load on the database server system because more of the work is done on the server side and less is done on the client (application) side
Sebenarnya Sabtu kemarin saya menemukan (kembali) buku yang sesungguhnya sudah lama saya beli, tetapi belum selesai dibaca. Biasa, semangat untuk beli buku kadang tidak dibarengi dengan semangat untuk menyelesaikan membacanya, hehe. Menarik sekali – koq baru sadar ya –buku ini membahas tentang pemasaran, hal yang relatif baru bagi saya. Berjudul “The END of MARKETING as we know it MATINYA PEMASARAN” karya Sergio Zyman. Saya fikir perusahaan tempat saya bekerja sekarang sudah menerapkan beberapa hal dalam buku ini.
Tetapi dalam tulisan kali ini saya belum ingin membahas tentang itu. Saat ini saya juga baru tertarik dengan ‘mainan baru’ store procedure di dalam sistem database. Ini karena pekerjaan terakhir memang baru bersentuhan dengan store procedure dengan oracle sebagai databasenya. Terus terang selama ini saya menggunakan database hanya untuk penyimpanan data saja. Dengan demikian ada kekuatan oracle yang belum termanfaatkan, bahkan menjadi mubadzir. Padahal kita tahu bahwa kemubadziran adalah temanna Mr Satan, hehe. Tetapi (lagi-lagi) saya tidak ingin membahas store procedure dalam Oracle, saat ini saya ingin membahas store procedure dalam MySQL.
Gambar di atas adalah database kasir yang saya punya, kalau tanda plus pada Tables diklik akan terlihat daftar tabel yang ada, namun Views sampai Triggers belum ada isinya sama sekali. Inilah kemubadziran itu…
Namun apa yang membuat store procedure menjadi menarik ? Apa sih keuntungan-keuntungan penggunaan store procedure ini, setidaknya ada beberapa hal yang bisa dicatat :
- Menghilangkan kemubadziran. Seperti sudah saya ungapkan di atas. Oracle, Postgree dan tentu saja MySQL (versi 5.0 ke atas) sudah mendukung adanya Store Procedure, sungguh sayang jika kita lewatkan begitu saja. Kan yo kasihan pembuatnya sudah susah payah menyediakan fitur, jika tidak dimanfaatkan.
- Ketika menggunakan multi koneksi database yang berbeda-beda, maka dengan store procedure akan memberikan performa yang sama.
- Tentu saja lebih aman. Karena programmer aplikasi tidak perlu mengetahui daftar tabel, dsb. Programmer aplikasi hanya memakai procedure yang telah disiapkan oleh Database Engineer.
- Meningkatkan performa. Karena akan meminimalkan komunikasi antara server (database) dengan client (aplikasi PHP).
Mungkin saja masih ada atau mungkin malah banyak keuntungan lainnya. Tetapi daftar di atas bagi saya sudah cukup alasan untuk mengeksplore dan menggunakan store procedure di aplikasi yang dibangun untuk ke depannya.
Dalam framework yang saya gunakan, GTFW dan CI berbasis MVC, dengan pemanfaatan Store Procedure ini saya fikir memungkinkan bagi kita untuk menghilangkan Model nya dan kita tarik dalam sistem database kita. Jadi aplikasi tinggal mengurusi tentang View dan Controller nya saja. Oks, mari kita mulai pembuatan store procedurenya. Dalam kasus ini saya ingin menyimpan store procedure untuk menampilkan data, yang sebelumnya berada di model dalam CI :
SELECT *
FROM kategori
WHERE KategoriNama like ? or KategoriKode like ?
ORDER BY KategoriNama
LIMIT ?, ?
Saya coba procedure-kan query di atas dengan menjalankan code
DELIMITER $$
CREATE PROCEDURE GetKategori(IN key_kat varchar(15),IN awal int,IN jumlah int)
BEGIN
SELECT *
FROM kategori
WHERE KategoriNama like key_kat or KategoriKode like key_kat
ORDER BY KategoriNama
LIMIT awal, jumlah
END$$
DELIMITER ;
Yes, langsung ketemu bug error. Dengan sukses mengeluarkan pesan error :
Error Code : 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘awal, jumlah END’ at line 12 (0 ms taken)
Wew, kenapa pula ini, langsung deh tanya ke Pakde Google dan ternyata tersangkut ke-http://bugs.mysql.com/bug.php?id=11918 Baca-baca, dan mengejutkan, ternyata si MySQL belum bisa menggunakan limit dalam procedure-nya. Posisi terahir tentang isyu limit ini adalah
[20 Jan 2:55] Razvan Marescu
I just created a SP that was supposed to use this feature, but it seems that hasn’t been implemented (5.1.42-community-log).
Could we please get a status update on this request? Is there any chance to be implemented?
Thanks
Jadi, apakah ini berhubungan dengan terbelinya MySQL oleh perusahaan Oracle ? Kita tahu dalam query Oracle tidak ada fasilitas limit seperti halnya pada MySQL. Wallahu ‘alam.
Tetapi ternyata di forum tersebut diberikan penyelesaian atas masalah ini, walaupun terlihat menjadi lebih ribet. Untuk kasus di atas procedure-nya menjadi :
DELIMITER $$
DROP PROCEDURE IF EXISTS `kasir`.`GetKategori`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `GetKategori`(IN key_kat varchar(15),IN awal int,IN banyak int)
BEGIN
PREPARE STMT FROM
“SELECT *
FROM kategori
WHERE KategoriNama like ? or KategoriKode like ?
ORDER BY KategoriNama
LIMIT ?,?”;
SET @KEY = key_kat;
SET @START = awal;
SET @LIMIT = banyak;
EXECUTE STMT USING @KEY,@KEY,@START, @LIMIT;
END$$
DELIMITER ;
Dan saatnya untuk mencoba memanggil procedure di atas
call GetKategori(‘%agama%’,0,2)
Ternyata bisa, dan menghasilkan :
Di atas adalah procedure untuk menampilkan data, sekarang mari kita coba dengan procedure untuk memasukkan data. Jika hal ini bekerja, maka saya rasa menjadi tidak masalah untuk operasi update dan delete-nya. Dan inilah code pembuatan procedure-nya.
DELIMITER $$
CREATE PROCEDURE GetKategorii(IN nama varchar(15),IN kode varchar(5),IN isPpn char(1))
BEGIN
INSERT INTO kategori (KategoriNama,KategoriKode,KategoriIsPpn)
VALUES (nama,kode,isPpn);
END$$
DELIMITER ;
Berhasil.
Dan coba kita masukkan data kategori baru dengan procedure ini.
CALL DoAddKategori(‘pemasaran’,’021′,’0′);
Coba kita lihat apakah datanya dapat masuk dengan sukses ?
Yes, berhasil. Tetapi tentu saja ini tidak cukup, jika hanya dapat dijalankan dari aplikasi SQL client. Maka saatnya mencari cara agar dapat dijalankan dari PHP dengan framework CI. Hmm, tapi koq tulisan ini saja sudah terlihat panjang ya ? Oks kalo begitu, penerapan procedure di PHP-nya menyusul saja nantinya, Insyaallah…
* Delimiter adalah karakter atau string yang memberi tahu MySQL bahwa kita telah selesai menulis statemen SQL. Ini diperlukan karena stored procedure dapat terdiri atas sejumlah statemen, dan setiap statemen harus diakhiri dengan semicolon.






jalasutra
Feb 13, 2010 @ 21:04:41
sama saja ternyata…
tidak semua buku yang dibeli belum terbaca
Shofiq Sulaiman
Feb 15, 2010 @ 08:38:13
Mungkin tidak persis sama,..
Setidaknya pernah membeli, membaca [sebagian] dan entah karena bukunya yang kurang menarik, atau penerjemahannya yang kurang mutu, atau karena kesibukan, atau karena suasana hati yang tidak sedang mood, atau karena lain-lainnya sehingga [sebagian] buku itu tidak tuntas terbaca
Ahmad Agus Al Umar
Mar 22, 2010 @ 12:31:44
wah lumayan buat pencerahan…biasanya saya menggunakan mysql hanya memanfaatkan table and view nya saja ternyata ada fitur yang menarik juga….tapi sayangnya sekarang udah beralih ke PostgreSQL….;-)
Teddy
Mar 26, 2010 @ 16:28:34
sama..
Semangat saat membeli nya saja ..
maka dari itu ayo kita baca lagi ..
Angga
Apr 29, 2010 @ 17:24:52
aku juga kebetulan lagi nemu masalah saat mau ngelimit di procedure. solusina kok jadi ribet gitu ya…
btw, thanks a lot ya
Febry
Mei 06, 2010 @ 07:53:37
Hmm, mau tanya dunks . .
kalo buat procedure dengan menggunakan statement prepare bisa ndak ?
misal :
PREPARE query FROM ‘CREATE PROCEDURE myProc (IN field1 varchar(5),
IN field2 varchar(10))
BEGIN
INSERT INTO Table1 VALUES (field1, field2);
END’;
EXECUTE query;
aku dah coba tapi error :
MySQL Database Error: This command is not supported in the prepared statement protocol yet.
Ada yang bisa bantu ndak ?
thanks yaks sebelumnya. .
lintang
Jul 24, 2010 @ 00:35:37
waduhhh…bentar, ta smaput dulu…mumett
Neng Ucrit
Agu 02, 2010 @ 15:16:15
klo untuk di CI bukannya bisa pakai query helper aja ya? CMIIW
Shofiq Sulaiman
Agu 18, 2010 @ 10:36:06
Kmaren dulu si pernah nyoba g bsa. Neng Ucrit uda nyoba dan bsa, share dunk, hehe ?
bajawapress
Jun 13, 2011 @ 16:30:36
Mantap banget…. Makasih banyak!!!
amee
Nov 22, 2011 @ 09:35:34
sangat membantu mas.. thanks yaah..