在現實應用中,開發的存儲過程幾乎都須要參數。這些參數使存儲過程更加靈活和有用。 在MySQL中,參數有三種模式:IN
,OUT
或INOUT
。html
IN
- 是默認模式。在存儲過程當中定義IN
參數時,調用程序必須將參數傳遞給存儲過程。 另外,IN
參數的值被保護。這意味着即便在存儲過程當中更改了IN
參數的值,在存儲過程結束後仍保留其原始值。換句話說,存儲過程只使用IN
參數的副本。OUT
- 能夠在存儲過程當中更改OUT
參數的值,並將其更改後新值傳遞迴調用程序。請注意,存儲過程在啓動時沒法訪問OUT
參數的初始值。INOUT
- INOUT
參數是IN
和OUT
參數的組合。這意味着調用程序能夠傳遞參數,而且存儲過程能夠修改INOUT
參數並將新值傳遞迴調用程序。在存儲過程當中定義參數的語法以下:mysql
MODE param_name param_type(param_size)
上面語法說明以下 -git
MODE
能夠是IN
,OUT
或INOUT
。param_name
是參數的名稱。參數的名稱必須遵循MySQL中列名的命名規則。若是存儲過程有多個參數,則每一個參數由逗號(,
)分隔。github
1.IN參數示例sql
如下示例說明如何使用 ClassInfoProcedure 存儲過程當中的IN
參數來查詢選擇相應的課程信息。yii
use test; DROP PROCEDURE IF EXISTS ClassInfoProcedure; -- 注意存儲名不加引號。 DELIMITER $$ use test$$ CREATE PROCEDURE ClassInfoProcedure(IN id INT) BEGIN SELECT * FROM classInfo WHERE ids = id; END$$ DELIMITER ; -- 注意這裏的 ';' 前要留空格。
id是存儲過程的IN參數。在存儲過程當中,咱們查詢id參數對應的課程信息。
假設咱們想要查詢id 對應的課程,咱們只須要將一個值(id)傳遞給存儲過程,以下所示:spa
CALL ClassInfoProcedure(3);
執行上面查詢語句,獲得如下結果 code
2.OUT參數示例htm
如下存儲過程經過訂單狀態返回訂單數量。它有兩個參數:blog
orderStatus
:IN
參數,它是要對訂單計數的訂單狀態。total
:存儲指定訂單狀態的訂單數量的OUT
參數。如下是CountOrderByStatus
存儲過程的源代碼。
use test; DROP PROCEDURE IF EXISTS CountOrderByStatus; DELIMITER $$ use test$$ CREATE PROCEDURE CountOrderByStatus(IN orderStatus VARCHAR(25), OUT orderCount INT) BEGIN SELECT count(sid) INTO orderCount FROM orderinfo WHERE order_status = orderStatus; END$$ DELIMITER ;
執行
查看客戶端以下
要獲取發貨訂單的數量,咱們調用CountOrderByStatus
存儲過程,並將訂單狀態傳遞爲已收貨’50’,並傳遞參數(@total
)以獲取返回值。
CALL CountOrderByStatus('50',@total); SELECT @total;
執行上面查詢語句後,獲得如下結果
注意:由於上面定義了兩個參數,因此調用是也要如上 傳遞兩個參數,若是傳遞一個參數,會提示以下錯誤。
如下示例演示如何在存儲過程當中使用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 SELECT @counter; -- 2 CALL set_counter(@counter,5); -- 7 SELECT @counter; -- 7