在本教學中,您將學習如何編寫具有參數的MySQL存儲過程。還將通過幾個存儲過程示例來瞭解不同類型的參數。
MySQL存儲過程參數簡介
在現實應用中,開發的存儲過程幾乎都需要參數。這些參數使存儲過程更加靈活和有用。 在MySQL中,參數有三種模式:IN
,OUT
或INOUT
。
IN
- 是默認模式。在存儲過程中定義IN
參數時,調用程式必須將參數傳遞給存儲過程。 另外,IN
參數的值被保護。這意味著即使在存儲過程中更改了IN
參數的值,在存儲過程結束後仍保留其原始值。換句話說,存儲過程只使用IN
參數的副本。OUT
- 可以在存儲過程中更改OUT
參數的值,並將其更改後新值傳遞回調用程式。請注意,存儲過程在啟動時無法訪問OUT
參數的初始值。INOUT
-INOUT
參數是IN
和OUT
參數的組合。這意味著調用程式可以傳遞參數,並且存儲過程可以修改INOUT
參數並將新值傳遞回調用程式。
在存儲過程中定義參數的語法如下:
MODE param_name param_type(param_size)
上面語法說明如下 -
- 根據存儲過程中參數的目的,
MODE
可以是IN
,OUT
或INOUT
。 param_name
是參數的名稱。參數的名稱必須遵循MySQL中列名的命名規則。- 在參數名之後是它的數據類型和大小。和變數一樣,參數的數據類型可以是任何有效的MySQL數據類型。
如果存儲過程有多個參數,則每個參數由逗號(,
)分隔。
讓我們練習一些例子來更好的理解。 我們將使用示例資料庫(zaixiandb)中的表進行演示。
MySQL存儲過程參數示例
1.IN參數示例
以下示例說明如何使用GetOfficeByCountry
存儲過程中的IN
參數來查詢選擇位於特定國家/地區的辦公室。
USE `zaixiandb`;
DROP procedure IF EXISTS `GetOfficeByCountry`;
DELIMITER $$
USE `zaixiandb`$$
CREATE PROCEDURE GetOfficeByCountry(IN countryName VARCHAR(255))
BEGIN
SELECT *
FROM offices
WHERE country = countryName;
END$$
DELIMITER ;
countryName
是存儲過程的IN參數。在存儲過程中,我們查詢位於countryName
參數指定的國家/地區的所有辦公室。
假設我們想要查詢在美國(USA
)的所有辦事處,我們只需要將一個值(USA
)傳遞給存儲過程,如下所示:
CALL GetOfficeByCountry('USA');
執行上面查詢語句,得到以下結果 -
要在法國獲得所有辦事處,我們將France
字串傳遞給GetOfficeByCountry
存儲過程,如下所示:
CALL GetOfficeByCountry('France')
2.OUT參數示例
以下存儲過程通過訂單狀態返回訂單數量。它有兩個參數:
orderStatus
:IN
參數,它是要對訂單計數的訂單狀態。total
:存儲指定訂單狀態的訂單數量的OUT
參數。
以下是CountOrderByStatus
存儲過程的源代碼。
USE `zaixiandb`;
DROP procedure IF EXISTS `CountOrderByStatus`;
DELIMITER $$
CREATE PROCEDURE CountOrderByStatus(
IN orderStatus VARCHAR(25),
OUT total INT)
BEGIN
SELECT count(orderNumber)
INTO total
FROM orders
WHERE status = orderStatus;
END$$
DELIMITER ;
要獲取發貨訂單的數量,我們調用CountOrderByStatus
存儲過程,並將訂單狀態傳遞為已發貨,並傳遞參數(@total
)以獲取返回值。
CALL CountOrderByStatus('Shipped',@total);
SELECT @total;
執行上面查詢語句後,得到以下結果 -
+--------+
| @total |
+--------+
| 303 |
+--------+
1 row in set
要獲取正在處理的訂單數量,調用CountOrderByStatus
存儲過程,如下所示:
執行上面查詢語句後,得到以下結果 -
+------------------+
| total_in_process |
+------------------+
| 7 |
+------------------+
1 row in set
INOUT參數示例
以下示例演示如何在存儲過程中使用INOUT
參數。如下查詢語句 -
DELIMITER $$
CREATE PROCEDURE set_counter(INOUT count INT(4),IN inc INT(4))
BEGIN
SET count = count + inc;
END$$
DELIMITER ;
上面查詢語句是如何運行的?
set_counter
存儲過程接受一個INOUT
參數(count
)和一個IN
參數(inc
)。- 在存儲過程中,通過
inc
參數的值增加計數器(count
)。
下麵來看看如何調用set_counter
存儲過程:
SET @counter = 1;
CALL set_counter(@counter,1); -- 2
CALL set_counter(@counter,1); -- 3
CALL set_counter(@counter,5); -- 8
SELECT @counter; -- 8
在本教學中,我們向您展示了如何在存儲過程中定義參數,並介紹了不同的參數模式:IN
,OUT
和INOUT
。