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

时间:2013-03-26 10:46:38

标签: php mysql stored-procedures

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

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

DELIMITER $$

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

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

call new_routine(7);

那么我为什么要/需要使用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

并像这样称呼它

call new_routine(7, @name);
select @name;

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

我尝试使用谷歌搜索,但显然没有向谷歌提出正确的问题以获得明确的答案。

4 个答案:

答案 0 :(得分:6)

引自PROCEDURE

上的MySQL文档
  

对于每个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)
   
mysql> delimiter ;

mysql> CALL simpleproc(@a);
Query OK, 0 rows affected (0.00 sec)
   
mysql> SELECT @a;
+------+
| @a   |
+------+
| 3    |
+------+
1 row in set (0.00 sec)

答案 1 :(得分:5)

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

许多人的Out-Parameters通常被认为是不好的做法,但是如果你想要一个可以在通话后使用的价值(也可以通过功能显然计算),它们可以很方便。在大多数情况下,有一种更好的方法可以在不使用out-parameters的情况下实现您想要的效果。

然而,如果你愿意的话,唯一的“优点”就是你在变量中有一个值而不是结果集,如果你决定在你的sql或者你想要使用的sql中进一步使用那个值,那么它可能看起来更方便它

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

答案 2 :(得分:2)

一些文档:http://dev.mysql.com/doc/refman/5.0/en/call.html也许它会有所帮助,引用:

  

要使用OUT或INOUT参数从过程中获取值,   通过用户变量传递参数,然后检查   过程返回后变量的值。 (如果你打电话的话   从另一个存储过程或函数中的过程,你   也可以将例程参数或本地例程变量作为IN传递   或INOUT参数。)对于INOUT参数,初始化其值   在将其传递给程序之前。以下程序有一个OUT   过程设置为当前服务器版本的参数,以及   一个INOUT值,该过程从其当前值开始递增1   值:

CREATE PROCEDURE p (OUT ver_param VARCHAR(25), INOUT incr_param INT)
BEGIN
  # Set value of OUT parameter
  SELECT VERSION() INTO ver_param;
  # Increment value of INOUT parameter
  SET incr_param = incr_param + 1;
END;

答案 3 :(得分:0)

以下文章

中说明了使用OUT关键字

13.2.1. CALL Syntax

  

CALL可以使用参数将值传回给调用者   声明为OUT或INOUT参数。