MySQL存儲過程參數

在本教學中,您將學習如何編寫具有參數的MySQL存儲過程。還將通過幾個存儲過程示例來瞭解不同類型的參數。

MySQL存儲過程參數簡介

在現實應用中,開發的存儲過程幾乎都需要參數。這些參數使存儲過程更加靈活和有用。 在MySQL中,參數有三種模式:INOUTINOUT

  • IN - 是默認模式。在存儲過程中定義IN參數時,調用程式必須將參數傳遞給存儲過程。 另外,IN參數的值被保護。這意味著即使在存儲過程中更改了IN參數的值,在存儲過程結束後仍保留其原始值。換句話說,存儲過程只使用IN參數的副本。
  • OUT - 可以在存儲過程中更改OUT參數的值,並將其更改後新值傳遞回調用程式。請注意,存儲過程在啟動時無法訪問OUT參數的初始值。
  • INOUT - INOUT參數是INOUT參數的組合。這意味著調用程式可以傳遞參數,並且存儲過程可以修改INOUT參數並將新值傳遞回調用程式。

在存儲過程中定義參數的語法如下:

MODE param_name param_type(param_size)

上面語法說明如下 -

  • 根據存儲過程中參數的目的,MODE可以是INOUTINOUT
  • 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參數示例

以下存儲過程通過訂單狀態返回訂單數量。它有兩個參數:

  • orderStatusIN參數,它是要對訂單計數的訂單狀態。
  • 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

在本教學中,我們向您展示了如何在存儲過程中定義參數,並介紹了不同的參數模式:INOUTINOUT


上一篇: MySQL存儲過程 下一篇: MySQL視圖