MySQL Stored Procedure Parameters

摘要:在本教程中,您将学习如何创建带参数的存储过程,包括INOUTINTOUT参数。

MySQL存储过程参数介绍

通常,存储过程具有参数。这些参数使存储过程更加有用和可重用。存储过程中的参数具有以下三种模式之一: IN,OUTINOUT

IN参数

IN是默认模式。当您在存储过程中定义IN参数时,调用程序必须将参数传递给存储过程。

此外, IN参数的值受到保护。这意味着即使您更改存储过程内部IN参数的值,存储过程结束后其原始值也不会改变。换句话说,存储过程仅适用于IN参数的副本。

OUT参数

可以在存储过程内部更改OUT参数的值,并将其新值传递回调用程序。

请注意,存储过程启动时无法访问OUT参数的初始值。

INOUT参数

INOUT参数是INOUT参数的组合。这意味着调用程序可以传递参数,并且存储过程可以修改INOUT参数,并将新值传递回调用程序。

定义参数

以下是在存储过程中定义参数的基本语法:

[IN | OUT | INOUT] parameter_name datatype[(length)]Code language: SQL (Structured Query Language) (sql)

在这个语法中,

  • 首先,指定参数模式,根据存储过程中参数的用途,可以是INOUTINOUT
  • 其次,指定参数的名称。参数名称必须遵循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)
MySQL Stored Procedure Parameters

要查找France的办事处,请将文字字符串France传递给GetOfficeByCountry存储过程,如下所示:

CALL GetOfficeByCountry('France')Code language: SQL (Structured Query Language) (sql)

由于countryNameIN参数,因此您必须传递一个参数。如果你不这样做,你会得到一个错误:

CALL GetOfficeByCountry();Code language: SQL (Structured Query Language) (sql)

这是错误:

Error Code: 1318. Incorrect number of arguments for PROCEDURE classicmodels.GetOfficeByCountry; expected 1, got 0Code 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; -- 8Code language: SQL (Structured Query Language) (sql)

这是输出:

在本教程中,您学习了如何使用INOUTINOUT参数等参数创建存储过程。

本教程有帮助吗?