摘要:在本教程中,您将了解存储过程中的变量、如何声明和使用变量。此外,您还将了解变量的范围。
变量是一个命名数据对象,其值可以在存储过程执行期间更改。您通常在存储过程中使用变量来保存即时结果。这些变量是存储过程的本地变量。
在使用变量之前,必须声明它。
声明变量
要在存储过程中声明变量,请使用DECLARE
语句,如下所示:
DECLARE variable_name datatype(size) [DEFAULT default_value];
Code language: SQL (Structured Query Language) (sql)
在这个语法中:
- 首先,在
DECLARE
关键字后指定变量的名称。变量名必须遵循MySQL表列名的命名规则。 - 其次,指定变量的数据类型和长度。变量可以具有任何MySQL 数据类型,例如
INT
、VARCHAR
和DATETIME
。 - 第三,使用
DEFAULT
选项为变量分配默认值。如果声明变量时未指定默认值,则其值为NULL
。
以下示例声明一个名为totalSale
的变量,其数据类型为DEC(10,2)
,默认值为0.0
,如下所示:
DECLARE totalSale DEC(10,2) DEFAULT 0.0;
Code language: SQL (Structured Query Language) (sql)
MySQL 允许您使用单个DECLARE
语句声明两个或多个共享相同数据类型的变量。以下示例声明两个整数变量x
和y
,并将它们的默认值设置为零。
DECLARE x, y INT DEFAULT 0;
Code language: SQL (Structured Query Language) (sql)
分配变量
一旦声明了变量,就可以使用它了。要为变量赋值,可以使用SET
语句:
SET variable_name = value;
Code language: SQL (Structured Query Language) (sql)
例如:
DECLARE total INT DEFAULT 0;
SET total = 10;
Code language: SQL (Structured Query Language) (sql)
赋值后total
变量的值为10
。
除了SET
语句之外,您还可以使用SELECT INTO
语句将查询结果分配给变量,如下例所示:
DECLARE productCount INT DEFAULT 0;
SELECT COUNT(*)
INTO productCount
FROM products;
Code language: SQL (Structured Query Language) (sql)
在这个例子中:
- 首先,声明一个名为
productCount
的变量并将其值初始化为0
。 - 然后,使用
SELECT INTO
语句将从products
表中选择的产品数量分配给productCount
变量。
变量范围
变量有自己的作用域来定义其生命周期。如果在存储过程中声明变量,则当存储过程的END
语句到达时,该变量将超出范围。
当您在BEGIN END
块内声明变量时,如果到达END
,它将超出范围。
MySQL 允许您声明两个或多个在不同范围内共享相同名称的变量。因为变量只在其作用域内有效。但是,在不同作用域中声明具有相同名称的变量并不是良好的编程习惯。
名称以@
符号开头的变量是会话变量。在会话结束之前它都可用且可访问。
把它们放在一起
以下示例说明如何在存储过程中声明和使用变量:
DELIMITER $$
CREATE PROCEDURE GetTotalOrder()
BEGIN
DECLARE totalOrder INT DEFAULT 0;
SELECT COUNT(*)
INTO totalOrder
FROM orders;
SELECT totalOrder;
END$$
DELIMITER ;
Code language: SQL (Structured Query Language) (sql)
怎么运行的。
首先,声明一个变量totalOrder
,其默认值为零。该变量将保存orders
表中的订单数量。
DECLARE totalOrder INT DEFAULT 0;
Code language: SQL (Structured Query Language) (sql)
其次,使用SELECT INTO
语句将从orders
表中选择的订单数分配给变量totalOrder
:
SELECT COUNT(*)
INTO totalOrder
FROM orders;
Code language: SQL (Structured Query Language) (sql)
第三,选择变量totalOrder
的值。
SELECT totalOrder;
Code language: SQL (Structured Query Language) (sql)
请注意,您将在后续教程中学习如何实际使用变量。本教程中的示例只是一个说明,以便您理解这个概念。
此语句调用存储过程GetTotalOrder()
:
CALL GetTotalOrder();
Code language: SQL (Structured Query Language) (sql)
这是输出:
在本教程中,您学习了如何在存储过程中声明和使用变量。