摘要:在本教程中,您将学习如何创建带参数的存储过程,包括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)]
Code language: SQL (Structured Query Language) (sql)
在这个语法中,
- 首先,指定参数模式,根据存储过程中参数的用途,可以是
IN
、OUT
或INOUT
。 - 其次,指定参数的名称。参数名称必须遵循MySQL中列名的命名规则。
- 第三,指定参数的数据类型和最大长度。
MySQL 存储过程参数示例
让我们举一些使用存储过程参数的示例。
IN 参数示例
以下示例创建一个存储过程,用于查找位于输入参数countryName
指定的国家/地区的所有办事处:
DELIMITER //
CREATE PROCEDURE GetOfficeByCountry(
IN countryName VARCHAR(255)
)
BEGIN
SELECT *
FROM offices
WHERE country = countryName;
END //
DELIMITER ;
Code language: SQL (Structured Query Language) (sql)
在此示例中, countryName
是存储过程的IN
参数。
假设您要查找位于美国的办事处,您需要将参数 ( USA
) 传递给存储过程,如以下查询所示:
CALL GetOfficeByCountry('USA');
Code language: SQL (Structured Query Language) (sql)
要查找France
的办事处,请将文字字符串France
传递给GetOfficeByCountry
存储过程,如下所示:
CALL GetOfficeByCountry('France')
Code language: SQL (Structured Query Language) (sql)
由于countryName
是IN
参数,因此您必须传递一个参数。如果你不这样做,你会得到一个错误:
CALL GetOfficeByCountry();
Code language: SQL (Structured Query Language) (sql)
这是错误:
Error Code: 1318. Incorrect number of arguments for PROCEDURE classicmodels.GetOfficeByCountry; expected 1, got 0
Code language: JavaScript (javascript)
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 ;
Code language: SQL (Structured Query Language) (sql)
存储过程GetOrderCountByStatus()
有两个参数:
orderStatus
:是IN
参数,指定要返回的订单的状态。-
total
:是OUT
参数,存储特定状态下的订单数量。
要查找已发货的订单数,您可以调用GetOrderCountByStatus
并传递截至Shipped
的订单状态,并传递会话变量 ( @total
) 以接收返回值。
CALL GetOrderCountByStatus('Shipped',@total);
SELECT @total;
Code language: SQL (Structured Query Language) (sql)
要获取正在处理的订单数,请调用存储过程GetOrderCountByStatus
如下所示:
CALL GetOrderCountByStatus('in process',@total);
SELECT @total AS total_in_process;
Code language: SQL (Structured Query Language) (sql)
INOUT 参数示例
以下示例演示如何在存储过程中使用INOUT
参数:
DELIMITER $$
CREATE PROCEDURE SetCounter(
INOUT counter INT,
IN inc INT
)
BEGIN
SET counter = counter + inc;
END$$
DELIMITER ;
Code language: SQL (Structured Query Language) (sql)
在此示例中,存储过程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
Code language: SQL (Structured Query Language) (sql)
这是输出:
在本教程中,您学习了如何使用IN
、 OUT
和INOUT
参数等参数创建存储过程。