在MySQL存储过程中OUT的目的是什么?

osh*_*nen 4 php mysql stored-procedures

OUTMySQL存储过程的目的是什么?

如果我有一个简单的存储过程,如下所示:

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `new_routine`(
    IN iID int
)
BEGIN
    select * from table1 where id = iID;
END
Run Code Online (Sandbox Code Playgroud)

这将通过运行给我所有我想要的结果:

call new_routine(7);
Run Code Online (Sandbox Code Playgroud)

那么我为什么要/需要使用OUT

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `new_routine`(
    IN iID int,
    OUT vName varchar(100)
)
BEGIN
    select name into vName from table1 where id = iID;
END
Run Code Online (Sandbox Code Playgroud)

并称之为这样

call new_routine(7, @name);
select @name;
Run Code Online (Sandbox Code Playgroud)

哪个会给我一个名字,而不是返回的行中的所有内容?

我已经尝试过谷歌搜索,但显然没有向谷歌提出正确的问题以获得明确的答案.

hjp*_*r92 6

正如MySQL doc所引用的那样 PROCEDURE

对于每个OUT或INOUT参数,在CALL语句中传递一个用户定义的变量,该变量调用该过程,以便在过程返回时获取其值.如果从另一个存储过程或函数中调用该过程,还可以将例程参数或本地例程变量作为IN或INOUT参数传递.


后来,一个例子:

mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
    -> BEGIN
    ->   SELECT COUNT(*) INTO param1 FROM t;
    -> END//
Query OK, 0 rows affected (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
mysql> delimiter ;
Run Code Online (Sandbox Code Playgroud)
mysql> CALL simpleproc(@a);
Query OK, 0 rows affected (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
mysql> SELECT @a;
+------+
| @a   |
+------+
| 3    |
+------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)


DrC*_*ste 5

是的,你是对的,通过第二次通话你现在只能获得这个名字.

对于许多人来说,Out-Parameters通常被认为是不好的做法,但是如果你想要一个可以在调用之后使用的值(它们也可以通过函数显然计算),它们可以很方便.在大多数情况下,有一种更好的方法可以在不使用out-parameters的情况下实现您的需求.

但是,如果您愿意,唯一的"优势"是您在变量中有一个值而不是结果集,如果您决定在您的sql中使用该值,或者您希望使用它,那么它可能看起来更方便.

所以在大多数情况下你应该不使用out-parameters,而是使用函数.如果你有返回结果集和out-parameters的过程,试着将它们分解成更小的函数/过程以避免out-parameters,因为它只是不好阅读和维护;)