在计算机编程中,变量是用于存储和表示数据的一种命名内存位置。变量可以存储各种类型的数据,如整数、浮点数、字符串、布尔值等。
MySQL 的存储过程中也支持变量声明和定义,让我们看一下 MySQL 存储过程是如何处理变量的。
MySQL 提供了用户定义变量(User-Defined Variables)的功能,允许你在查询中声明和使用变量。
使用 SET 语句来声明和赋值一个变量,语法如下:
SET @variable_name = value;在上面的语法中,@variable_name 是变量的名称,value 是要赋给变量的值。变量名称可以以 @ 开头,后面跟着一个合法的标识符。
以下是一个使用变量的示例:
-- 声明并赋值一个整数变量
mysql> set @age=25;
Query OK, 0 rows affected (0.00 sec)
-- 声明并赋值一个字符串变量
mysql> set @name='John';
Query OK, 0 rows affected (0.00 sec)
-- 使用变量进行查询
mysql> select @name, @age;
+-------+------+
| @name | @age |
+-------+------+
| John | 25 |
+-------+------+
1 row in set (0.04 sec)在上面的示例中,我们声明了一个名为 @age 的整数变量,并将值 25 赋给它。我们还声明了一个名为 @name 的字符串变量,并将值 'John' 赋给它。最后,我们使用这些变量进行了一个查询,并将它们的值作为结果返回。
变量在查询中可以像任何其他列或表达式一样使用。你可以在 SELECT 语句、WHERE 子句、ORDER BY 子句等地方使用变量。你还可以在查询中使用变量进行计算、比较和赋值等操作。
MySQL 中,变量的命名规则如下:
变量名必须以 @ 符号开头。例如:@variable_name。
变量名必须是一个合法的标识符,由字母、数字和下划线组成。
变量名区分大小写。例如,@variable 和 @Variable 是两个不同的变量。
变量名不能与 MySQL 的保留关键字冲突。
以下是一些有效的变量名示例:
SET @age = 25;
SET @employee_name = 'John';
SET @total_salary = 10000.00;在上面的示例中,@age、@employee_name 和 @total_salary 都是有效的变量名,符合 MySQL 变量的命名规则。
如果声明变量没有使用 @ 字符开头,则抛出错误提示,如下:
-- 声明一个错误的变量
mysql> set myVar = 10;
1193 - Unknown system variable 'myVar'
-- 声明一个正确的变量
mysql> set @myVar = 10;
Query OK, 0 rows affected (0.00 sec)
mysql> select @myVar;
+--------+
| @myVar |
+--------+
| 10 |
+--------+
1 row in set (0.07 sec)在 MySQL 存储过程中,你可以使用变量来存储和操作数据。存储过程变量是在存储过程中声明的,它们可以存储各种类型的数据,如整数、浮点数、字符串等。
要在存储过程中声明一个变量,可以使用 DECLARE 语句,语法如下:
DECLARE variable_name [,variable_name...] datatype [DEFAULT value];变量可以在一个 DECLARE 语句中被声明,而且变量可以给出一个默认值(初始值)。如果你不给出 DEFAULT 子句,那么这个变量将会被赋予空值。
使用 DEFAULT 是一项很好的实践,因为除非你给出一个初始值,否则任何依赖于这个变量的后续操作都将在赋值之前返回 NULL 值。
在上面的语法中:
variable_name 是变量的名称
datatype 是变量的数据类型,可以是任何你可以在 CREATE TABLE 语句中使用的有效 MySQL 数据类型。
value 是可选的默认值
以下是一个使用变量的示例:
-- 创建过程,获取用户个数
CREATE PROCEDURE get_user_count()
BEGIN
-- 声明一个变量,类型为 int,默认值为 0
-- 该变量用来存储用户数
DECLARE user_count INT DEFAULT 0;
-- 获取用户数,存储到 user_count 变量中
SELECT COUNT(*) INTO user_count FROM `user`;
-- 输出用户数
SELECT user_count;
END;
-- 调用存储过程
mysql> call get_user_count();
+------------+
| user_count |
+------------+
| 1 |
+------------+
1 row in set (0.07 sec)
Query OK, 0 rows affected (0.00 sec)在上面的示例中,我们创建了一个名为 get_user_count 的存储过程。
在存储过程中,我们声明了一个名为 user_count 的整数变量,并将默认值设置为 0。然后,我们使用 SELECT COUNT(*) INTO user_count 查询语句将 user 表中用户的数量赋值给 user_count 变量。最后,我们使用 SELECT user_count 返回 user_count 变量的值。
注意:存储过程变量可以在存储过程中的任何地方使用,包括查询、计算和赋值等操作,它们可以帮助你更灵活地处理和操作数据。
下面例子向我们演示了各种数据类型的声明:
-- 整数
DECLARE l_int1 int default -2000000;
DECLARE l_int2 INT unsigned default 4000000;
DECLARE l_bigint1 BIGINT DEFAULT 4000000000000000;
-- 浮点数
DECLARE l_float FLOAT DEFAULT 1.8e8;
DECLARE l_double DOUBLE DEFAULT 2e45;
DECLARE l_numeric NUMERIC(8,2) DEFAULT 9.95;
-- 日期
DECLARE l_date DATE DEFAULT '1999-12-31';
DECLARE l_datetime DATETIME DEFAULT '1999-12-31 23:59:59';
-- 字符串
DECLARE l_char CHAR(255) DEFAULT 'This will be padded to 255 chars';
DECLARE l_varchar VARCHAR(255) DEFAULT 'This will not be padded';
DECLARE l_text TEXT DEFAULT 'This is a really long string. In stored programs
we can use text columns fairly freely, but in tables there are some
limitations regarding indexing and use in various expressions.';MySQL 在变量命名方面具有惊人的灵活性。
MySQL 并不像其他大多数编程语言,MySQL 允许非常长的变量名(大于 255 个字符)。
MySQL 变量名可以包含特殊的字符,并且允许以数字字符开始。
尽管如此,我们还是建议您不要把 MySQL 这种灵活性的优势取代好的命名习惯,并且建议避免使用过长的变量名。
你可以使用 SET 语句操纵变量赋值,请使用如下语法:
SET variable_name = expression [,variable_name = expression ...]就像你所看到的,你完全可以通过使用一个 SET 语句来完成多次赋值。
大多数语言并不会在对变量赋值时使用 SET 语句,于是结果就很容易造成了在不使用具体的 SET 来对变量赋值时造成的错误。
示例:尝试不使用 SET 语句对变量赋值
mysql> Create procedure no_set_stmt( )
BEGIN
DECLARE i INTEGER;
-- 给变量 i 赋值
i=1;
END;
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '=1;
END' at line 4上述示例中,就像经常会犯的存储程序编译错误,错误信息并不会直接指明当前缺失的 SET 语句,所以当检查你程序的编译错误时,应该加倍检查所有的变量赋值,确保他们包含 SET。