MySQL - 儲存程式中的變數



您可以在過程中建立使用者定義變數或系統變數。您可以使用 DECLARE 語句在儲存程式中定義變數。您可以將這些變數用於儲存程式上下文之外。這些儲存程式也可以接受引數。

宣告區域性變數

您可以使用 DECLARE 語句宣告區域性變數。變數的值可以是常量。

語法

遵循以下語法宣告區域性變數:

DECLARE var_name type [DEFAULT value]

其中,var_name 是變數名,type 是變數的資料型別。

示例

以下是如何在過程中宣告區域性變數的示例:

DELIMITER //
CREATE PROCEDURE RepeatExample()
BEGIN
   DECLARE val INT;
   DECLARE squares INT;
   DECLARE res VARCHAR(100);
   SET val=1;
   SET squares=1;
   SET res = '';
   REPEAT
      SET squares = val*val;
      SET res = CONCAT(res, squares,',');
      SET val = val + 1;
   UNTIL val >= 10
   END REPEAT;
   SELECT res;
END// 
DELIMITER ;

您可以按如下方式呼叫上述過程:

CALL RepeatExample;

輸出

以下是上述程式的輸出:

res
1,4,9,16,25,36,49,64,81,

接受值作為引數

MySQL 中的過程和函式接受引數,您可以在呼叫它們時向它們傳遞值。

示例

以下查詢建立一個接受引數的函式:

DELIMITER //
CREATE FUNCTION sample(a INT, b INT)
   RETURNS INT
   DETERMINISTIC
   BEGIN
      declare RES INT;
      SET RES = a+b;
      return RES;
   END//
DELIMITER ;

您可以按如下方式呼叫上述函式:

ELECT sample(2258, 6695);

輸出

上述查詢產生如下所示的輸出:

sample(2258, 6695)
8953

示例

以下查詢建立一個接受引數的過程:

DELIMITER //
CREATE PROCEDURE sample(IN a INT, IN b INT, OUT RES INT)
   BEGIN
      SET RES = a+b;
   END//
DELIMITER ;

您可以按如下方式呼叫上述過程:

CALL sample(1254, 5894, @res);
SELECT @res;

輸出

以下是上述 MySQL 查詢的輸出:

@res
7148

將查詢值讀取到區域性變數中

您可以使用 INTO 子句將查詢值讀取到區域性變數中。

示例

假設我們已建立一個名為 dispatches 的表,如下所示:

CREATE TABLE Dispatches( 
   Product_Name VARCHAR(255), 
   Name_Of_Customer VARCHAR(255), 
   Month_Of_Dispatch VARCHAR(255), 
   Price INT, Location VARCHAR(255)
);

讓我們使用 INSERT 語句向其中插入 5 條記錄。

Insert into dispatches values
('Key-Board', 'Raja', TIMESTAMP('2019-05-04', '15:02:45'), 
7000, 'Hyderabad'),
('Earphones', 'Roja', TIMESTAMP('2019-06-26', '14:13:12'), 
2000, 'Vishakhapatnam'),
('Mouse', 'Puja', TIMESTAMP('2019-12-07', '07:50:37'), 
3000, 'Vijayawada'),
('Mobile', 'Vanaja' , TIMESTAMP ('2018-03-21', '16:00:45'), 
9000, 'Chennai'),
('Headset', 'Jalaja' , TIMESTAMP('2018-12-30', '10:49:27'), 
6000, 'Goa');

以下查詢建立一個過程,該過程將 Product_Name 和 location 從 SELECT 查詢檢索到區域性變數。在這裡,我們使用兩個 OUT 引數來儲存這些值:

DELIMITER // ;
Create procedure proc (OUT name VARCHAR(255), OUT loc VARCHAR(255))
   BEGIN
      SELECT Product_Name, Location into name, loc FROM Dispatches 
	  where Name_Of_Customer = 'Roja';
   END //
DELIMITER ;

您需要透過傳遞兩個變數來呼叫此過程,並且可以使用 SELECT 語句從它們中檢索值。

CALL proc(@name, @loc);
SELECT @name, @loc;

輸出

上述 MySQL 查詢將生成以下輸出:

@name @loc
Earphones Vishakhapatnam

直接設定值

您還可以使用 SET 語句直接在 MySQL 中為變數設定值。

示例

以下查詢建立一個過程,我們在這裡聲明瞭兩個變數,並使用 SET 語句為它們賦值:

DELIMITER //

CREATE PROCEDURE RepeatExample()
BEGIN
   DECLARE val INT;
   DECLARE squares INT;
   DECLARE res VARCHAR(100);
   SET val=1;
   SET squares=1;
   SET res = '';
   REPEAT
      SET squares = val*val;
      SET res = CONCAT(res, squares,',');
      SET val = val + 1;
   UNTIL val >= 10
   END REPEAT;
   SELECT res;
END//

DELIMITER ;

您可以按如下方式呼叫上述過程:

CALL RepeatExample; //

輸出

以下是上述查詢的輸出:

res
1,4,9,16,25,36,49,64,81,

區域性變數的作用域和解析

區域性變數的作用域在其宣告的塊 (BEGIN...END) 內。如果您嵌套了塊語句,則內部塊可以使用在外部塊中宣告的變數。

如果您在過程或函式中建立預處理語句,則它不能使用區域性變數。

區域性變數的名稱應與當前儲存程式中使用的任何表列(查詢返回)不同。

mysql_statements_reference.htm
廣告