MySQL 存储过程变量

总结:在本教程中,您将了解存储过程中的变量,如何声明和使用变量。此外,您将了解变量的作用域。

变量是命名的数据对象,其值可以在存储过程执行期间更改。您通常在存储过程中使用变量来保存即时结果。这些变量是存储过程的本地变量。

在使用变量之前,必须先声明它。

声明变量

要在存储过程中声明变量,请使用 DECLARE 如下语句:

DECLARE variable_name datatype(size) [DEFAULT default_value];

在这个语法中:

  • 首先,在 DECLARE 关键字后指定变量的名称。变量名必须遵循 MySQL 表列名的命名规则。
  • 其次,指定变量的数据类型和长度。变量可以具有任何MySQL数据类型如 INT , VARCHAR ,和 DATETIME 。
  • 第三,使用 DEFAULT 选项为变量分配默认值。如果您声明一个变量而不指定默认值,则其值为 NULL 。

以下实例声明了一个以 totalSale 数据类型 DEC(10,2) 和默认值命名的变量 0.0 ,如下所示:

DECLARE totalSale DEC(10,2) DEFAULT 0.0;

MySQL 允许您使用单个 DECLARE 语句声明两个或多个共享相同数据类型的变量。下面的实例声明了两个整数变量 x 和 y ,并将它们的默认值设置为零。

DECLARE x, y INT DEFAULT 0;

分配变量

一旦声明了一个变量,它就可以使用了。要为变量赋值,请使用以下 SET 语句:

SET variable_name = value;

例如:

DECLARE total INT DEFAULT 0;
SET total = 10;

total 变量的值 10 在赋值之后。

除了 SET 语句之外,您还可以使用 SELECT INTO 语句将查询结果分配给变量,如以下实例所示:

DECLARE productCount INT DEFAULT 0;

SELECT COUNT(*) 
INTO productCount
FROM products;

在这个例子中:

  • 首先,声明一个名为 productCount 的变量并将其初始值设为 0。
  • 然后,使用 SELECT INTO 语句将从 products 表中查询到的产品数量赋值给 productCount 变量。

变量作用域

变量具有其自身的作用域(Scope)以定义其生命周期。在存储过程中声明的变量,当存储过程执行到 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 ;

这个怎么运作。

首先,声明一个 totalOrder 默认值为零的变量。此变量将保存 orders 表中的订单数。

DECLARE totalOrder INT DEFAULT 0;

其次,使用 SELECT INTO 语句为变量分配 totalOrder 从 orders 表中选择的订单数:

SELECT COUNT(*) 
INTO totalOrder 
FROM orders;

第三,选择变量的值 totalOrder 。

SELECT totalOrder;

请注意,您将在后续教程中学习如何实际使用变量。本教程中的实例只是一个说明,以便您理解该概念。

此语句调用存储过程 GetTotalOrder() :

CALL GetTotalOrder();

这是输出:

在本教程中,您学习了如何在存储过程中声明和使用变量。