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數據類型。
如果存儲過程有多個參數,則每個參數由逗號(,)分隔。
MySQL存儲過程參數示例
1.IN參數示例
以下示例說明如何使用 ClassInfoProcedure 存儲過程中的IN參數來查詢選擇相應的課程信息。
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)傳遞給存儲過程,如下所示:
CALL ClassInfoProcedure(3);
執行上面查詢語句,得到以下結果

2.OUT參數示例
以下存儲過程通過訂單狀態返回訂單數量。它有兩個參數:
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參數示例
以下示例演示如何在存儲過程中使用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
