在本教學中,您將學習如何編寫具有引數的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中列名的命名規則。如果儲存過程有多個引數,則每個引數由逗號(,
)分隔。
讓我們練習一些例子來更好的理解。 我們將使用範例資料庫(yiibaidb)中的表進行演示。
1.IN引數範例
以下範例說明如何使用GetOfficeByCountry
儲存過程中的IN
引數來查詢選擇位於特定國家/地區的辦公室。
USE `yiibaidb`;
DROP procedure IF EXISTS `GetOfficeByCountry`;
DELIMITER $$
USE `yiibaidb`$$
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 `yiibaidb`;
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
引數。如下查詢語句 -
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
。