MySQL memberi kita kemampuan untuk membuat prosedur tersimpan . Prosedur tersimpan adalah bagian kuat dari MySQL (dan sistem manajemen basis data lainnya, seperti SQL Server) dan prosedur tersebut memungkinkan Anda melakukan lebih dari sekadar tampilan.
prosedur tersimpan adalah kumpulan pernyataan SQL yang disimpan dalam database. Prosedur tersimpan dapat berisi logika bisnis, yang merupakan salah satu aspek kunci yang membedakan prosedur tersimpan dari tampilan. Prosedur tersimpan dapat menerima parameter, dan Anda dapat mengatur variabel, tulis IF
pernyataan, dll dalam prosedur tersimpan.
Bagaimana Cara Kerja Prosedur Tersimpan?
Pertama-tama, Anda membuat prosedur tersimpan. Kemudian setelah dibuat, Anda dapat menjalankannya (atau lebih tepatnya, Anda "menyebutnya").
Untuk menjalankan prosedur tersimpan, Anda "memanggilnya". Saat Anda memanggilnya, Anda juga memberikan parameter apa pun yang mungkin diperlukan. Prosedur tersimpan kemudian akan dijalankan, menggunakan parameter Anda dengan cara apa pun yang ditentukan oleh kode.
Misalnya, Anda dapat menulis prosedur tersimpan yang menerima FruitId
parameter. Prosedur tersimpan kemudian dapat mengambil parameter itu dan menggunakannya untuk memeriksa inventaris untuk buah tertentu itu. Oleh karena itu, Anda dapat memanggil prosedur tersimpan, setiap kali dengan ID buah yang berbeda dan itu akan mengembalikan nilai yang menunjukkan berapa banyak buah yang tersedia.
Buat Prosedur Tersimpan
Prosedur tersimpan dibuat menggunakan CREATE PROCEDURE
pernyataan.
Sintaks
Berikut sintaks untuk membuat prosedur tersimpan:
CREATE PROCEDURE sp_name(p_1 INT) BEGIN ...code goes here... END;
Ganti sp_name dengan nama apa pun yang ingin Anda gunakan untuk prosedur tersimpan. Tanda kurung diperlukan — tanda kurung menyertakan parameter apa pun. Jika tidak ada parameter yang diperlukan, tanda kurung boleh kosong.
Bagian utama dari prosedur tersimpan berada di antara BEGIN
dan END
kata kunci. Kata kunci ini digunakan untuk menulis pernyataan majemuk. Sebuah pernyataan majemuk dapat berisi beberapa pernyataan, dan ini dapat bersarang jika diperlukan. Oleh karena itu, Anda dapat membuat sarang BEGIN
dan END
blok.
Dalam kebanyakan kasus, Anda juga perlu mengapit CREATE PROCEDURE
pernyataan dengan DELIMITER
perintah dan ubah END;
ke END //
. Seperti ini:
DELIMITER // CREATE PROCEDURE sp_name(p_1 INT) BEGIN ...code goes here... END // DELIMITER ;
Saya akan menjelaskan alasannya segera, tetapi untuk saat ini, mari kita lihat sebuah contoh.
Contoh
Berikut adalah contoh sederhana untuk membuat prosedur tersimpan. Menjalankan kode berikut terhadap FruitShop kami database akan membuat prosedur tersimpan yang disebut spCheckFruitStock :
DELIMITER // CREATE PROCEDURE spCheckFruitStock(thisFruit SMALLINT) BEGIN SELECT Fruit.FruitName, Fruit.Inventory, Units.UnitName FROM Fruit INNER JOIN Units ON Fruit.UnitId = Units.UnitId WHERE Fruit.FruitId = thisFruit; END // DELIMITER ;
Sekarang kita dapat memanggil prosedur tersimpan itu seperti ini:
CALL spCheckFruitStock(1);
Di sini, kami melewati parameter 1
yang merupakan ID untuk
Apple
.
Ini hasilnya:
Kita dapat melakukan hal yang sama untuk buah apa pun di database kita, cukup dengan mengubah parameter yang diteruskan ke prosedur tersimpan.
Tentang DELIMITER
Perintah
Pada contoh di atas, kami menambahkan beberapa DELIMITER
perintah dan kami mengganti titik koma dengan dua garis miring. Apa yang terjadi di sini?
Kami melakukan ini untuk memberi tahu MySQL agar menggunakan pembatas yang berbeda saat membuat prosedur tersimpan kami.
Alasan untuk ini adalah, MySQL sudah mengenali titik koma sebagai pembatas untuk menandai akhir setiap pernyataan SQL. Oleh karena itu, segera setelah MySQL melihat titik koma pertama, ia akan menafsirkan pembatas seperti itu dan prosedur tersimpan kami akan rusak.
DELIMITER
perintah memungkinkan kita untuk memberitahu MySQL untuk menggunakan pembatas yang berbeda. Dalam contoh di atas, kami menyetelnya menjadi dua garis miring (//
) tapi ini bisa apa saja (walaupun, hindari menggunakan garis miring terbalik (\
) karena itu adalah karakter pelarian untuk MySQL). Dengan mengubah pembatas, MySQL tidak akan mencoba menafsirkan titik koma sebagai akhir pernyataan — MySQL akan menunggu hingga melihat dua garis miring.
Setelah kita membuat prosedur tersimpan, kita dapat menggunakan DELIMITER ;
untuk mengatur ulang pembatas kembali ke titik koma.
Menghapus Prosedur Tersimpan
Anda dapat menghapus prosedur tersimpan dengan menggunakan DROP PROCEDURE
penyataan. Seperti ini:
DROP PROCEDURE spCheckFruitStock;
Mengubah Prosedur Tersimpan
Anda dapat mengubah beberapa aspek prosedur tersimpan dengan menggunakan ALTER PROCEDURE
penyataan.
Namun, untuk mengubah isi prosedur tersimpan, atau parameternya, Anda harus menghapus prosedur dan membuatnya lagi. Seperti ini:
DROP PROCEDURE IF EXISTS spCheckFruitStock; DELIMITER // CREATE PROCEDURE spCheckFruitStock(thisFruit SMALLINT) BEGIN SELECT Fruit.FruitId, Fruit.FruitName, Fruit.Inventory, Units.UnitName FROM Fruit INNER JOIN Units ON Fruit.UnitId = Units.UnitId WHERE Fruit.FruitId = thisFruit; END // DELIMITER ;
Di sini, kami menambahkan Fruit.FruitId
ke daftar kolom untuk kembali.
Hasil:
Prosedur Tersimpan Lebih Lanjut
Contoh di atas adalah contoh sederhana untuk mendemonstrasikan sintaks pembuatan dan pemanggilan prosedur tersimpan. Mari kita lihat prosedur tersimpan yang sedikit lebih rumit:
DROP PROCEDURE IF EXISTS spCheckFruitStockLevel; DELIMITER // CREATE PROCEDURE spCheckFruitStockLevel( IN pFruitId SMALLINT(5), OUT pStockLevel VARCHAR(6)) BEGIN DECLARE stockNumber SMALLINT; SELECT Fruit.Inventory into stockNumber FROM Fruit INNER JOIN Units ON Fruit.UnitId = Units.UnitId WHERE Fruit.FruitId = pFruitId; IF stockNumber > 10 THEN SET pStockLevel = 'High'; ELSEIF (stockNumber <= 10 AND stockNumber >= 5) THEN SET pStockLevel = 'Medium'; ELSEIF (stockNumber < 5) THEN SET pStockLevel = 'Low - Please Replace Now!'; END IF; END // DELIMITER ;
Contoh di atas menerima dua mode parameter yang berbeda (IN
dan OUT
). IN
adalah default, jadi inilah mengapa contoh sebelumnya tidak menyertakan mode.
Di sini, kami juga menetapkan variabel. Kami menggunakan DECLARE stockNumber SMALLINT
untuk mendeklarasikan variabel bernama stockNumber
dengan jenis SMALLINT
(bilangan bulat kecil).
Kami menggunakan SELECT
pernyataan untuk mencari inventaris untuk ID buah yang diberikan dan menetapkannya ke stockNumber
kami variabel.
Terakhir, kami menggunakan SQL IF
pernyataan untuk menentukan tingkat stok, menempatkan nilai ini ke dalam pStockLevel
parameter (yang tentu saja adalah OUT
parameter — ini adalah nilai yang akan kita lihat saat kita memanggil prosedur tersimpan).
Memanggil Prosedur Tersimpan dengan OUT
atau INOUT
Parameter
Dalam contoh terakhir kami, kami menetapkan dua parameter, sebuah IN
parameter dan OUT
parameter.
Saat kita memanggil prosedur tersimpan ini, kita masih perlu menyertakan OUT
parameter. Namun, karena kita tidak akan mengetahui nilainya (bagaimanapun juga, itulah mengapa kita menyebutnya — untuk mengetahui nilainya!), kita perlu menggunakan variabel. Kemudian kita dapat menggunakan SELECT
pernyataan untuk mengetahui nilainya.
Seperti ini:
CALL spCheckFruitStockLevel(1, @stockLevel); select @stockLevel;
Hasil:
Mode Parameter
Kami baru saja menggunakan dua mode parameter (IN
dan OUT
). Di MySQL, ada tiga mode parameter yang dapat digunakan dengan prosedur tersimpan.
- IN
- Saat Anda menggunakan mode parameter ini, Anda (atau aplikasi Anda) harus melewati nilai parameter saat Anda memanggil prosedur tersimpan. Parameter ini dilindungi. Oleh karena itu, nilai aslinya dipertahankan setelah prosedur tersimpan dijalankan. Jika prosedur tersimpan mengubah nilai, itu hanya akan terjadi pada salinan parameter.
Mode ini adalah mode default. Jika Anda tidak memberikan mode parameter, itu akan menjadi
IN
. - KELUAR
- Nilai dari sebuah
OUT
parameter dapat berubah dalam prosedur tersimpan, dan nilainya dikembalikan ke aplikasi pemanggil. - MASUK KELUAR
- Mode ini merupakan kombinasi dari
IN
danOUT
mode. Anda dapat meneruskan nilai awal, prosedur tersimpan dapat mengubahnya, dan ini akan mengembalikan nilai baru ke aplikasi pemanggil.