Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Prosedur Tersimpan MySQL

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 dan OUT mode. Anda dapat meneruskan nilai awal, prosedur tersimpan dapat mengubahnya, dan ini akan mengembalikan nilai baru ke aplikasi pemanggil.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Di mana Klausa Untuk Memfilter Baris di MySQL

  2. Cara Mengatur Kumpulan Karakter dan Susunan Basis Data di MySQL

  3. Cara Mengubah Ukuran Kolom di MySQL

  4. Bagaimana cara men-debug Lock wait timeout terlampaui di MySQL?

  5. Mysql menyisipkan datetime acak dalam rentang datetime tertentu