mysql儲存過程之引數(IN,OUT或INOUT)瞭解下
阿新 • • 發佈:2019-02-01
在現實應用中,開發的儲存過程幾乎都需要引數,就是這些引數,使得儲存過程更加靈活和有用。 在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資料型別。
在上面的儲存過程中,如果儲存過程有多個引數,則每個引數由逗號(,
)分隔。我們先來看in模式中,使用GetOfficeByCountry
儲存過程中的IN
引數來查詢選擇位於特定國家/地區的辦公室的例項:
USE `你的資料庫名稱`;
DROP procedure IF EXISTS `GetOfficeByCountry`;
DELIMITER $$
USE `資料庫名稱`$$
CREATE PROCEDURE GetOfficeByCountry(IN countryName VARCHAR(255))
BEGIN
SELECT *
FROM offices
WHERE country = countryName;
END$$
DELIMITER ;
在上面的sql中,countryName
是儲存過程的IN引數。在儲存過程中,我們查詢位於countryName
引數指定的國家/地區的所有辦公室。假設我們想要查詢在美國(USA
)的所有辦事處,我們只需要將一個值(USA
)傳遞給儲存過程,如下所示:
CALL GetOfficeByCountry('USA');
執行上面查詢語句,得到以下結果:
然而,如果要在法國獲得所有辦事處,我們就得將France
字串傳遞給GetOfficeByCountry
儲存過程,如下所示:
CALL GetOfficeByCountry('France')
咱們完事再來看out模式中,通過訂單狀態返回訂單數量。它有兩個引數:
orderStatus
:IN
引數,它是要對訂單計數的訂單狀態。total
:儲存指定訂單狀態的訂單數量的OUT
引數。
然後來看下CountOrderByStatus
儲存過程的原始碼:
USE `你的資料庫名稱`;
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
儲存過程,並將訂單狀態傳遞為已發貨,並傳遞引數()以獲取返回值:
CALL CountOrderByStatus('Shipped',@total);
SELECT @total;
執行上面查詢語句後,得到以下結果:
+--------+
| @total |
+--------+
| 303 |
+--------+
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 ;
上面的sql執行原理如下:
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
好啦,本次分享就到這裡了。如果感覺不錯的話,請多多點贊支援哦。。。