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');
以下查询创建一个过程,该过程从 SELECT 查询中检索 Product_Name 和位置到局部变量。在这里我们使用两个 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.html