MySQL存储过程参数
简介:在本教程中,您将学习如何使用包含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()接受一个INOUT参数(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参数的参数创建存储过程。