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');

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

因为 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;

要获取处理中的订单数,请 GetOrderCountByStatus 按如下方式调用存储过程:
CALL GetOrderCountByStatus('in process',@total);
SELECT @total AS total_in_process;

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 参数。