MySQL 存儲過程參數

MySQL  存儲過程參數

MySQL存儲過程參數簡介

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

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

在存儲過程當中定義參數的語法以下:mysql

MODE param_name param_type(param_size)

上面語法說明以下 -git

  • 根據存儲過程當中參數的目的,MODE能夠是INOUTINOUT
  • param_name是參數的名稱。參數的名稱必須遵循MySQL中列名的命名規則。
  • 在參數名以後是它的數據類型和大小。和變量同樣,參數的數據類型能夠是任何有效的MySQL數據類型

若是存儲過程有多個參數,則每一個參數由逗號(,)分隔。github

MySQL存儲過程參數示例

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

  • orderStatusIN參數,它是要對訂單計數的訂單狀態。
  • 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
相關文章
相關標籤/搜索