MySQL存储过程:输出参数

39
我有一个来自这个(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 Query Browser)。
然而,当我调用这个过程时:
CALL my_sqrt(4,@out_value);

(也在查询浏览器中)
它返回一个错误:
(1064)您的SQL语法有误,请检查与您的MySQL服务器版本相对应的手册,以了解正确的语法使用方法,在第2行附近的位置有“SELECT @out_value”
为什么这个例子不起作用?
7个回答

49

无法复制。对我而言,它运行良好:

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行使用的正确语法。 - domagojk
2
好的。听起来像是与你在“查询浏览器”中有关。尝试用mysql命令行工具操作。 - chaos
在 QueryBrowser 中也遇到了相同的问题。 - fubo

8

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

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

4
IN是可选的,参数前面没有任何内容表示参数为IN。 - Adrien Horgnies
那么我们如何区分参数是用于输入还是输出的呢? - user4022749
1
这虽然是不好的实践,但查询仍然是有效的。 - Adrien Horgnies

6

我刚刚尝试在终端中调用一个函数而不是使用 MySQL Query Browser,它成功了。

所以看起来我在那个程序中做错了什么...

我不知道是什么问题,因为我之前成功地调用过一些存储过程(但没有输出参数)...

对于这个函数,我输入了

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

然后会出现错误:

您的SQL语法有误; 请检查与您的MySQL服务器版本相应的手册 以获取正确的语法,位于第2行附近的 'SELECT @out_value'

奇怪的是,如果我只写:

CALL my_sqrt(4,@out_value); 

结果消息是:"查询已取消"
我猜,现在我只会使用终端...

3
我知道这是一个旧帖子,但如果有人正在寻找为什么他们的过程在工作台中无法正常工作,并且认为唯一的结果是“查询已取消”或任何没有线索的类似情况:输出错误或问题被隐藏了。我不知道为什么,我明白这很烦人,但它确实存在。只需将光标移动到消息上面的行上方,它将变成一个双箭头(向上和向下),您可以单击并拖动该行向上移动,然后您将看到一个控制台,其中包含您错过的消息!

2
如果您在存储过程内部调用,请勿使用“@”。在我的情况下,它将返回0。
调用SP_NAME(L_OUTPUT_PARAM)。

1
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); - Noby Nirmal

0

尝试将OUT更改为INOUT,以便定义out_number参数。

CREATE PROCEDURE my_sqrt(input_number INT, INOUT out_number FLOAT)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接