存储过程就像是编程语言的函数,可以设置参数。这些参数使存储过程更加灵活和有用。在MySQL中,参数具有以下三种模式之一: IN,OUT或INOUT。
IN
IN 是默认模式。IN在存储过程中定义参数时,调用程序必须将参数传递给存储过程。此外,IN参数的值受到保护。这意味着即使IN参数的值在存储过程内部发生更改,其原始值也会在存储过程结束后保留。换句话说,存储过程仅适用于IN参数的副本。
OUT
OUT 可以在存储过程内更改参数的值,并将其新值传递回调用程序。请注意,存储过程OUT在启动时无法访问参数的初始值。
INOUT
INOUT 参数是IN 和OUT 参数的组合。这意味着调用程序可以传递参数,并且存储过程可以修改INOUT参数,并将新值传递回调用程序。
在存储过程中定义参数的语法如下:
与变量一样,参数的数据类型可以是任何有效的 MySQL数据类型。
如果存储过程具有多个参数,则每个参数由逗号(,) 分隔。
DROP PROCEDURE IF EXISTS test;
DElIMITER $$
CREATE PROCEDURE test(IN startIdx int)
BEGIN
DECLARE idx INT DEFAULT startIdx;
set idx = idx + 1;
set startIdx = 20;
select idx,startIdx;
END $$
DElIMITER;
CALL test(10);
DROP PROCEDURE IF EXISTS test;
DElIMITER $$
CREATE PROCEDURE test(IN startIdx int, OUT res int)
BEGIN
DECLARE idx INT DEFAULT startIdx;
set idx = idx + 1;
set startIdx = 20;
set res = idx;
END $$
DElIMITER;
CALL test(10, @res);
SELECT @res;
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)。
SET @counter = 1;
CALL set_counter(@counter,1); -- 2
CALL set_counter(@counter,1); -- 3
CALL set_counter(@counter,5); -- 8
SELECT @counter; -- 8