MySQL 存储过程 - 参数

MySQL 存储过程参数简介

存储过程就像是编程语言的函数,可以设置参数。这些参数使存储过程更加灵活和有用。在MySQL中,参数具有以下三种模式之一:  IN,OUT或INOUT。

IN

IN 是默认模式。IN在存储过程中定义参数时,调用程序必须将参数传递给存储过程。此外,IN参数的值受到保护。这意味着即使IN参数的值在存储过程内部发生更改,其原始值也会在存储过程结束后保留​​。换句话说,存储过程仅适用于IN参数的副本。

OUT

OUT 可以在存储过程内更改参数的值,并将其新值传递回调用程序。请注意,存储过程OUT在启动时无法访问参数的初始值。

INOUT

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

在存储过程中定义参数的语法如下:

与变量一样,参数的数据类型可以是任何有效的  MySQL数据类型。

如果存储过程具有多个参数,则每个参数由逗号(,) 分隔。

IN 参数示例

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);

OUT 参数示例

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;

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)。

SET @counter = 1;
CALL set_counter(@counter,1); -- 2
CALL set_counter(@counter,1); -- 3
CALL set_counter(@counter,5); -- 8
SELECT @counter; -- 8