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。