【问题标题】:What is the purpose of OUT in MySQL stored procedures?MySQL存储过程中OUT的目的是什么?
【发布时间】:2013-03-26 10:46:37
【问题描述】:

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

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

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;

哪个会只给我名称而不是返回的行中的所有内容?

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

【问题讨论】:

    标签: php mysql stored-procedures


    【解决方案1】:

    引用自 MySQL 文档 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)
    

    【讨论】:

    • 如果不使用 OUT 和 INOUT 是否会返回 CALL?不使用 OUT 和 INOUT 不是传回值吗?例如,我的问题中的第一个存储过程没有使用 OUT 或 INOUT,但 CALL 正在传回值?我不明白。
    • @oshirowanen 也许我误解了你的问题。你能解释一下吗。 IN 就像将值传递给函数/过程。 OUT 只会在PROCEDURE 中使用,您可以使用它来返回自定义数据。 INOUT 双向工作。
    • 基本上,我不明白如果 CALL 接收回数据而不必使用 OUT,为什么会存在 OUT
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      一些文档: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;
      

      【讨论】:

      • 如果不使用 OUT 和 INOUT 是否会返回 CALL?不使用 OUT 和 INOUT 不是传回值吗?例如,我的问题中的第一个存储过程没有使用 OUT 或 INOUT,但 CALL 正在传回值?我不明白。
      【解决方案4】:

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

      13.2.1. CALL Syntax

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

      【讨论】:

      • 如果不使用 OUT 和 INOUT 是否会返回 CALL?不使用 OUT 和 INOUT 不是传回值吗?例如,我的问题中的第一个存储过程没有使用 OUT 或 INOUT,但 CALL 正在传回值?我不明白。
      猜你喜欢
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-09
      • 2012-11-29
      • 2012-07-26
      • 1970-01-01
      相关资源
      最近更新 更多