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
广告
© . All rights reserved.