Вопрос по stored-procedures, mysql – хранимая процедура mysql: параметр out

26

У меня есть хранимая процедура 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 ;

Процедура компилируется нормально. (Я использую MySQL Query Browser в Ubuntu).

Однако, когда я вызываю процедуру:

CALL my_sqrt(4,@out_value);

(также в браузере запросов)

Возвращает ошибку:

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

Почему этот пример не работает?

Ваш Ответ

6   ответов
0

не используйте @. В моем случае это возвращает 0

CALL SP_NAME (L_OUTPUT_PARAM)

1

а не MySQL Query Browser, и это работает. Похоже, я что-то не так делаю в этой программе ...

Я не знаю, что, поскольку я успешно вызывал некоторые процедуры раньше (но там, где нет выходных параметров) ...

Для этого я вошел

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

И это приводит к ошибке:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT @out_value' at line 2

Странно, если я напишу просто:

CALL my_sqrt(4,@out_value); 

В результате появится сообщение: «Запрос отменен»

Я думаю, сейчас я буду использовать только терминал ...

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)

Возможно, вам следует вставить все сообщение об ошибке, а не суммировать его.

Вот вся ошибка: у вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса, который можно использовать рядом с «SELECT @ out_value»; в строке 2 domagojk
Хорошо. Мне кажется, это как-то связано с твоим пребыванием в Query Browser. Попробуйте это из инструмента командной строки mysql.
была такая же проблема с QueryBrowser.
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);
6

риведенном ниже коде отсутствует IN.

CREATE PROCEDURE my_sqrt(IN input_number INT, OUT out_number FLOAT)
IN не является обязательным, ничто перед параметром не подразумевает IN
Итак, как мы можем отличить, что параметр для ввода или вывода ...?
Это плохая практика, я согласен, но запрос все равно будет действительным.
2

что это старая ветка, но если кто-то ищет ответ, почему его процедуры не работают в рабочей среде, и думает, что единственный результат - это "Запрос отменен" или что-нибудь подобное без подсказок:

вывод с ошибками или проблемами скрыт. Я не знаю, почему, я понимаю, это раздражает, но оно есть. просто наведите курсор на строку над сообщением, оно превратится в двойную стрелку (вверх и вниз), затем вы можете нажать и перетащить эту строку вверх, после чего вы увидите консоль с пропущенным сообщением!

Похожие вопросы