MySQL 存储过程参数
简介:在本教程中,您将学习如何编写具有参数的存储过程。您还将通过几个示例来了解不同类型的参数。
MySQL存储过程参数简介
您开发的存储过程几乎都需要参数。这些参数使存储过程更加灵活和有用。在MySQL中,参数具有以下三种模式之一: IN,OUT或INOUT。
IN - 是默认模式。IN在存储过程中定义参数时,调用程序必须将参数传递给存储过程。此外,IN参数的值受到保护。这意味着即使IN参数的值在存储过程内部发生更改,其原始值也会在存储过程结束后保留。换句话说,存储过程仅适用于IN参数的副本。
OUT- OUT可以在存储过程内更改参数的值,并将其新值传递回调用程序。请注意,存储过程OUT在启动时无法访问参数的初始值。
INOUT- INOUT 参数是IN 和OUT 参数的组合。这意味着调用程序可以传递参数,并且存储过程可以修改INOUT参数,并将新值传递回调用程序。
在存储过程中定义参数的语法如下:
MODE param_name param_type(param_size)
MODE可能是IN,OUT或INOUT,根据在存储过程中的参数的目的。
这param_name是参数的名称。参数的名称必须遵循MySQL中列名的命名规则。
遵循参数名称是其数据类型和大小。与变量一样,参数的数据类型可以是任何有效的 MySQL数据类型。
如果存储过程具有多个参数,则每个参数由逗号(,) 分隔。
让我们通过一些例子来练习,以便更好地理解。 我们将使用示例数据库中的表进行演示。
MySQL存储过程参数示例
IN参数示例
以下示例说明如何在GetOfficeByCountry存储过程中使用IN参数来选择位于特定国家/地区的办事处。
DELIMITER //
CREATE PROCEDURE GetOfficeByCountry(IN countryName VARCHAR(255))
BEGIN
SELECT officeCode,city,phone
FROM offices
WHERE country = countryName;
END //
DELIMITER ;
这countryName是IN存储过程的参数。在存储过程中,我们选择位于countryName参数指定的国家/地区的所有办公室。
假设,我们希望在美国获得所有办公室,我们只需要将值(USA)传递给存储过程,如下所示:
CALL GetOfficeByCountry('USA');
+------------+---------------+-----------------+
| officeCode | city | phone |
+------------+---------------+-----------------+
| 1 | San Francisco | +1 650 219 4782 |
| 2 | Boston | +1 215 837 0825 |
| 3 | NYC | +1 212 555 3000 |
+------------+---------------+-----------------+
3 rows in set (0.00 sec)
要获取法国的所有办事处,我们将France文字字符串传递给GetOfficeByCountry 存储过程,如下所示:
CALL GetOfficeByCountry('France')
+------------+-------+-----------------+
| officeCode | city | phone |
+------------+-------+-----------------+
| 4 | Paris | +33 14 723 4404 |
+------------+-------+-----------------+
1 row in set (0.00 sec)
OUT参数示例
以下存储过程按订单状态返回订单数。它有两个参数:
orderStatus: IN参数,即我们要计算订单的订单状态。
total:OUT存储特定订单状态的订单数的 参数。
以下是CountOrderByStatus存储过程的源代码。
DELIMITER $$
CREATE PROCEDURE CountOrderByStatus(
IN orderStatus VARCHAR(25),
OUT total INT)
BEGIN
SELECT count(orderNumber)
INTO total
FROM orders
WHERE status = orderStatus;
END$$
DELIMITER ;
为了获得已发货的订单数量,我们调用CountOrderByStatus 存储过程并将订单状态作为Shipped传递值,并传递参数(@total)以获取返回值。
CALL CountOrderByStatus('Shipped',@total);
SELECT @total;
+--------+
| @total |
+--------+
| 303 |
+--------+
1 row in set (0.00 sec)
要获取进程中的订单数,我们CountOrderByStatus按如下方式调用存储过程:
CALL CountOrderByStatus('in process',@total);
SELECT @total AS total_in_process;
+------------------+
| total_in_process |
+------------------+
| 7 |
+------------------+
1 row in set (0.00 sec)
INOUT参数示例
以下示例演示如何INOUT在存储过程中使用 参数。
DELIMITER $$
CREATE PROCEDURE set_counter(INOUT count INT(4),IN inc INT(4))
BEGIN
SET count = count + inc;
END$$
DELIMITER ;
这个怎么运作。
set_counter 存储过程接受一个INOUT 参数(count)和一个IN参数(inc)。
在存储过程中,我们通过inc参数的值增加counter(count) 。
看看我们如何调用set_counter 存储过程:
SET @counter = 1;
CALL set_counter(@counter,1); -- 2
CALL set_counter(@counter,1); -- 3
CALL set_counter(@counter,5); -- 8
SELECT @counter; -- 8
在本教程中,我们向您展示了如何为存储过程定义参数,并向您介绍了不同的参数模式:IN,OUT和INOUT。