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數據類型

如果存儲過程有多個參數,則每個參數由逗號(,)分隔。

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參數示例

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

  • 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM