MySQL 存储过程参数

在本教程中,您将学习如何创建参数,包括存储过程 IN , OUT 和 INTOUT 参数。

摘要:在本教程中,您将学习如何创建参数,包括存储过程 IN , OUT 和 INTOUT 参数。

MySQL存储过程参数介绍

通常,存储过程有参数。这些参数使存储过程更加有用和可重用。存储过程中的参数具有以下三种模式之一: IN,OUT , 或 INOUT 。

IN 参数

IN 是默认模式。 IN 在存储过程中定义参数时,调用程序必须将参数传递给存储过程。

此外, IN 参数值受到保护。这意味着即使您更改了 IN 存储过程内部参数的值,存储过程结束后其原始值也不会改变。换句话说,存储过程只对 IN 参数的副本起作用。

OUT 参数

OUT 可以在存储过程中更改参数的值,并将其新值传递回调用程序。

请注意,存储过程 OUT 在启动时无法访问参数的初始值。

INOUT 参数

一个 INOUT 参数是的组合 IN 和 OUT 参数。这意味着调用程序可以传递参数,存储过程可以修改 INOUT 参数,并将新值传递回调用程序。

定义参数

以下是在存储过程中定义参数的基本语法:

[IN | OUT | INOUT] parameter_name datatype[(length)]

在这种语法中,

  • 首先,指定参数模式,可以是 IN , OUT 或者 INOUT 取决于存储过程中参数的用途。
  • 其次,指定参数的名称。参数名必须遵循MySQL中列名的命名规则。
  • 第三,指定参数的数据类型和最大长度。

MySQL存储过程参数实例

让我们举一些使用存储过程参数的例子。

IN参数实例

以下实例创建一个存储过程,用于查找位于输入参数指定的国家/地区的所有办公室 countryName :

DELIMITER //

CREATE PROCEDURE GetOfficeByCountry(
	IN countryName VARCHAR(255)
)
BEGIN
	SELECT * 
 	FROM offices
	WHERE country = countryName;
END //

DELIMITER ;

在本例中, countryName 是 IN 存储过程的参数。

假设您要查找位于美国的办公室,您需要将参数 ( USA ) 传递给存储过程,如以下查询所示:

CALL GetOfficeByCountry('USA');

MySQL 存储过程参数
MySQL 存储过程参数 - IN 参数实例

要在 中查找办公室 France ,请将文字字符串传递 France 给 GetOfficeByCountry 存储过程,如下所示:

CALL GetOfficeByCountry('France')

法国 IN 参数办公室

因为 countryName 是 IN 参数,所以必须传递一个参数。如果你不这样做,你会得到一个错误:

CALL GetOfficeByCountry();

这是错误:

Error Code: 1318. Incorrect number of arguments for PROCEDURE classicmodels.GetOfficeByCountry; expected 1, got 0

OUT 参数实例

以下存储过程按订单状态返回订单数。

DELIMITER $$

CREATE PROCEDURE GetOrderCountByStatus (
	IN  orderStatus VARCHAR(25),
	OUT total INT
)
BEGIN
	SELECT COUNT(orderNumber)
	INTO total
	FROM orders
	WHERE status = orderStatus;
END$$

DELIMITER ;

存储过程 GetOrderCountByStatus() 有两个参数:

  • 本 orderStatus :是的 IN 参数指定订单的状态返回。
  • 本 total :是的 OUT 参数,存储的订单在特定状态的数量。

要查找已发货的订单数量,您可以调用 GetOrderCountByStatus 并传递从 开始的订单状态 Shipped ,并传递会话变量 ( @total ) 以接收返回值。

CALL GetOrderCountByStatus('Shipped',@total);
SELECT @total;

MySQL 存储过程参数 - OUT 参数顺序发货

要获取处理中的订单数,请 GetOrderCountByStatus 按如下方式调用存储过程:

CALL GetOrderCountByStatus('in process',@total);
SELECT @total AS  total_in_process;

MySQL 存储过程参数 - 进程中的 OUT 参数命令

INOUT 参数实例

以下实例演示如何 INOUT 在存储过程中使用 参数:

DELIMITER $$

CREATE PROCEDURE SetCounter(
	INOUT counter INT,
    IN inc INT
)
BEGIN
	SET counter = counter + inc;
END$$

DELIMITER ;

在此实例中,存储过程 SetCounter() 接受一个 INOUT 参数 ( counter ) 和一个 IN 参数 ( inc )。它将计数器 ( counter )增加由 inc 参数指定的值。

这些语句说明了如何调用 SetSounter 存储过程:

SET @counter = 1;
CALL SetCounter(@counter,1); -- 2
CALL SetCounter(@counter,1); -- 3
CALL SetCounter(@counter,5); -- 8
SELECT @counter; -- 8

这是输出:

在本教程中,我们学习了如何创建存储过程的参数包括 IN , OUT ,和 INOUT 参数。