4

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

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

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

4 回答 4

7

正如 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)

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)
于 2013-03-26T10:49:52.680 回答
5

是的,你是对的,第二次调用你现在只会得到名字本身。

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

但是,如果您愿意,唯一的“优势”是您在变量中而不是结果集中有一个值,如果您决定在 sql 或任何您想使用它的地方进一步使用该值,这可能看起来更方便。

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

于 2013-03-26T11:01:52.117 回答
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;
于 2013-03-26T10:49:45.090 回答
0

OUT关键字的使用在下面的文章中说明

13.2.1. 调用语法

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

于 2013-03-26T10:50:01.417 回答