我有一个mysql存储过程(google book),其中一个例子就是:
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) check the manual that correspond to the...
为什么这个例子不起作用?
答案 0 :(得分:35)
无法复制。它对我来说很好:
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)
也许您应该粘贴整个错误消息,而不是总结它。
答案 1 :(得分:6)
您必须使用正确的签名输入参数* IN在以下代码中缺失。
CREATE PROCEDURE my_sqrt(IN input_number INT, OUT out_number FLOAT)
答案 2 :(得分:2)
我知道这是一个旧线程,但如果有人正在寻找他们的程序在工作台中不起作用的答案,并认为唯一的结果是“查询已取消”或类似的事情没有线索:
隐藏有错误或问题的输出。我不知道为什么,我确实理解这很烦人,但它确实存在。只需将光标移到消息上方的行上方,它就会转入双箭头(向上和向下),然后您可以单击并向上拖动该行,然后您将看到一个控制台,其中包含您错过的消息!
答案 3 :(得分:1)
我只是尝试在终端而不是MySQL查询浏览器中调用函数,它可以工作。 所以,看起来我在那个程序中做错了......
我不知道自从我成功之前调用了一些程序(但是那里没有out参数)...
对于我已经进入的那个
CALL my_sqrt(4,@out_value);
SELECT @out_value;
导致错误:
您的SQL语法有错误; 检查对应的手册 您的MySQL服务器版本 正确的语法在'SELECT附近使用 第2行的@out_value'
奇怪的是,如果我只写:
CALL my_sqrt(4,@out_value);
结果消息为:“查询已取消”
我想,现在我只会使用终端......
答案 4 :(得分:0)
如果您是从存储过程中调用的,请不要使用@。就我而言,它返回0
调用SP_NAME(L_OUTPUT_PARAM)
答案 5 :(得分:0)
尝试将OUT
参数定义的INOUT
更改为out_number
。
CREATE PROCEDURE my_sqrt(input_number INT, INOUT out_number FLOAT)
INOUT
表示out_number
(在您的情况下为@out_value
)的输入变量也将用作输出变量,您可以从中选择值。