mysql stored-procedure:out参数

dom*_*ojk 28 mysql stored-procedures

我有一个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 ;
Run Code Online (Sandbox Code Playgroud)

程序编译得很好.(我在ubuntu中使用MySQL Query Browser).

但是,当我调用该程序时:

CALL my_sqrt(4,@out_value);
Run Code Online (Sandbox Code Playgroud)

(也在查询浏览器中)

它返回一个错误:

(1064) check the manual that correspond to the...
Run Code Online (Sandbox Code Playgroud)

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

cha*_*aos 38

无法复制.它对我来说很好:

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)
Run Code Online (Sandbox Code Playgroud)

也许您应该粘贴整个错误消息而不是总结它.

  • 好的.听起来这跟你在查询浏览器中的存在有关.从mysql命令行工具尝试它. (2认同)

dom*_*ojk 6

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

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

对于这个我已经输入了

CALL my_sqrt(4,@out_value);
SELECT @out_value;
Run Code Online (Sandbox Code Playgroud)

结果出现错误:

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

奇怪的是,如果我只写:

CALL my_sqrt(4,@out_value); 
Run Code Online (Sandbox Code Playgroud)

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

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


小智 6

您必须使用正确的签名输入参数*IN在以下代码中缺失.

CREATE PROCEDURE my_sqrt(IN input_number INT, OUT out_number FLOAT)
Run Code Online (Sandbox Code Playgroud)

  • IN 是可选的,参数之前没有任何内容暗示 IN (3认同)