mysql中的存儲(chǔ)過(guò)程指的是存儲(chǔ)在數(shù)據(jù)庫(kù)中的SQL語(yǔ)句集合,當(dāng)創(chuàng)建好存儲(chǔ)過(guò)程后在運(yùn)行時(shí)提供所需參數(shù),存儲(chǔ)過(guò)程就可以以代碼指定的方式使用參數(shù)執(zhí)行并返回值
在MySQL中提供了創(chuàng)建存儲(chǔ)過(guò)程的能力。存儲(chǔ)過(guò)程是MySQL以及其他數(shù)據(jù)庫(kù)管理系統(tǒng)中的強(qiáng)大功能。接下來(lái)在文章中將為大家具體介紹MySQL中的存儲(chǔ)過(guò)程,具有一定的參考作用,希望對(duì)大家有所幫助。
【推薦課程:MySQL教程】
存儲(chǔ)過(guò)程:
存儲(chǔ)過(guò)程指的是存儲(chǔ)在數(shù)據(jù)庫(kù)中的SQL語(yǔ)句的集合。存儲(chǔ)過(guò)程它可以包含業(yè)務(wù)邏輯,這是區(qū)分存儲(chǔ)過(guò)程和視圖的關(guān)鍵之一。另外存儲(chǔ)過(guò)程還可以接受參數(shù),我們可以在存儲(chǔ)過(guò)程中設(shè)置變量,寫(xiě)入語(yǔ)句等。
存儲(chǔ)過(guò)程如何工作
首先要先創(chuàng)建一個(gè)存儲(chǔ)過(guò)程然后再運(yùn)行。在運(yùn)行的過(guò)程中需要提供它所需要的參數(shù),然后存儲(chǔ)過(guò)程將以代碼指定的任何方式使用參數(shù)執(zhí)行。例如,編寫(xiě)一個(gè)接受FruitId參數(shù)的存儲(chǔ)過(guò)程。然后在存儲(chǔ)過(guò)程可以獲取該參數(shù)并使用它來(lái)檢查該特定水果的庫(kù)存。因此我們可以調(diào)用存儲(chǔ)過(guò)程,即每次使用不同的水果ID它都將返回一個(gè)值,并顯示該庫(kù)存中有多少水果。
創(chuàng)建存儲(chǔ)過(guò)程
我們可以通過(guò)CREATE PROCEDURE語(yǔ)句創(chuàng)建存儲(chǔ)過(guò)程
CREATE?PROCEDURE?demo_name(p_1?INT) BEGIN ??...code?goes?here... END;
demo_name指的是存儲(chǔ)過(guò)程的名稱(chēng),括號(hào)是必須的,如果里面不包含任何參數(shù)則括號(hào)可以為空
存儲(chǔ)過(guò)程的主體是介于BEGIN和END關(guān)鍵字之間。這些關(guān)鍵字用于編寫(xiě)復(fù)合語(yǔ)句。復(fù)合語(yǔ)句可以包含多個(gè)語(yǔ)句,如果需要,可以嵌套這些語(yǔ)句。
例:創(chuàng)建一個(gè)存儲(chǔ)過(guò)程名為FruitStock:
DELIMITER?// CREATE?PROCEDURE?FruitStock(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?;
創(chuàng)建好了一個(gè)存儲(chǔ)過(guò)程,接下來(lái)將調(diào)用這個(gè)存儲(chǔ)過(guò)程
調(diào)用一個(gè)參數(shù)為1的ID
CALL?FruitStock(1);
刪除存儲(chǔ)過(guò)程
可以使用DROP PROCEDURE語(yǔ)句刪除存儲(chǔ)過(guò)程。
DROP?PROCEDURE?FruitStock;
改變存儲(chǔ)過(guò)程
在存儲(chǔ)過(guò)程中可通過(guò)下列語(yǔ)句更改存儲(chǔ)過(guò)程ALTER PROCEDURE。
需要注意要更改存儲(chǔ)過(guò)程的主體或其任何參數(shù)時(shí),需要?jiǎng)h除該過(guò)程然后再次創(chuàng)建
例:添加Fruit.FruitId所要返回的列表
DROP?PROCEDURE?IF?EXISTS?FruitStock; DELIMITER?// CREATE?PROCEDURE?FruitStock(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?;
總結(jié):