在计算机编程中,变量是用于存储和表示数据的一种命名内存位置。变量可以存储各种类型的数据,如整数、浮点数、字符串、布尔值等。
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。