【问题标题】:mysql stored-procedure: out parametermysql存储过程:out参数
【发布时间】:2009-07-11 12:02:55
【问题描述】:

我有一个来自这个 (google book) 的 mysql 存储过程,一个例子是这样的:

DELIMITER $$

DROP PROCEDURE IF EXISTS my_sqrt$$
CREATE PROCEDURE my_sqrt(input_number INT, OUT out_number FLOAT)
BEGIN
    SET out_number=SQRT(input_number);
END$$

DELIMITER ;

程序编译得很好。 (我在 ubuntu 中使用 MySQL 查询浏览器)。

但是当我调用程序时:

CALL my_sqrt(4,@out_value);

(也在查询浏览器中)

它返回一个错误:

(1064) check the manual that correspond to the...

为什么这个例子不起作用?

【问题讨论】:

    标签: mysql stored-procedures


    【解决方案1】:

    无法复制。对我来说效果很好:

    mysql> CALL my_sqrt(4, @out_value);
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT @out_value;
    +------------+
    | @out_value |
    +------------+
    | 2          | 
    +------------+
    1 row in set (0.00 sec)
    

    也许您应该粘贴整个错误消息而不是对其进行总结。

    【讨论】:

    • 这是整个错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的“SELECT @out_value”附近使用正确的语法
    • 好的。在我看来,这与您在查询浏览器中的存在有关。从 mysql 命令行工具试试。
    • QueryBrowser 有同样的问题。
    【解决方案2】:

    您必须使用正确的输入参数签名 *IN 在下面的代码中丢失。

    CREATE PROCEDURE my_sqrt(IN input_number INT, OUT out_number FLOAT)
    

    【讨论】:

    • IN 是可选的,参数前没有任何内容暗示 IN
    • 那么我们如何区分参数是输入还是输出...?
    • 我同意这是不好的做法,但查询仍然有效。
    【解决方案3】:

    我只是尝试在终端中调用一个函数,而不是在 MySQL 查询浏览器中调用它,它可以工作。 所以,看起来我在那个程序中做错了什么......

    我不知道是什么,因为我之前成功调用了一些程序(但那里没有输出参数)......

    对于我输入的这个

    CALL my_sqrt(4,@out_value);
    SELECT @out_value;
    

    结果是一个错误:

    您的 SQL 语法有错误; 检查对应的手册 您的 MySQL 服务器版本 在 'SELECT 附近使用正确的语法 @out_value' 在第 2 行

    奇怪的是,如果我只写:

    CALL my_sqrt(4,@out_value); 
    

    结果消息是:“查询已取消”

    我想,现在我只会使用终端...

    【讨论】:

      【解决方案4】:

      我知道这是一个旧线程,但如果有人正在寻找为什么他们的程序无法在工作台中运行的答案并认为唯一的结果是“查询已取消”或类似的没有线索:

      有错误或问题的输出是隐藏的。我不知道为什么,我明白这很烦人,但它就在那里。只需将光标移到消息上方的行上方,它将变成一个双箭头(向上和向下),然后您可以单击并向上拖动该行,然后您将看到一个控制台,其中包含您错过的消息!

      【讨论】:

        【解决方案5】:

        如果您从存储过程中调用,请不要使用@。就我而言,它返回 0

        调用 SP_NAME(L_OUTPUT_PARAM)

        【讨论】:

          【解决方案6】:
          SET out_number=SQRT(input_number); 
          

          而不是这样写:

          select SQRT(input_number); 
          

          请不要写SET out_number,你的输入参数应该是:

          PROCEDURE `test`.`my_sqrt`(IN input_number INT, OUT out_number FLOAT) 
          

          【讨论】:

          • 和sql查询是CALL my_sqrt(4,@out_value);
          【解决方案7】:

          尝试将 OUT 更改为 INOUT 以用于您的 out_number 参数定义。

          CREATE PROCEDURE my_sqrt(input_number INT, INOUT out_number FLOAT)

          INOUT 表示out_number(在您的情况下为@out_value)的输入变量也将用作您可以从中选择值的输出变量。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-01-09
            • 2013-10-10
            • 1970-01-01
            • 2014-01-01
            • 2011-07-29
            • 2013-03-22
            • 1970-01-01
            相关资源
            最近更新 更多