MySQL存储过程参数

时间:2019-11-20 08:52:20  来源:igfitidea点击:

简介:在本教程中,您将学习如何使用包含IN,OUT和INTOUT参数的参数来创建存储过程。

MySQL存储过程参数简介

您开发的几乎存储过程都需要参数。
这些参数使存储过程更加灵活和有用。

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

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

CALL GetOfficeByCountry('USA');

要在法国找到办事处,请按如下所示将文字字符串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()接受一个I​​NOUT参数(counter)和一个IN参数(inc)。
它将inc(参数)指定的值增加计数器(counter)。

这些语句说明了如何调用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参数的参数创建存储过程。