Если честно, я сейчас чувствую себя довольно глупо. Но это просто не работает.MySQL-Stored Procs-Weirdness при попытке использовать выходной параметр
Сценарий
У меня есть хранимая процедура, которая включает в себя выходной параметр. Я пытаюсь выбрать значение INTO этого параметра. Это кажется простым, но оно продолжает давать мне ошибочные результаты. Я проверил множество онлайн-источников, и я уверен, что я стараюсь сделать это правильно.
Код
DELIMITER //
CREATE PROCEDURE `spGetId`(
IN ParamA VARCHAR(32),
OUT OutputId INT
)
BEGIN
SELECT `id` INTO OutputId
FROM `Table`
WHERE `column_a` = ParamA;
END//
CALL spGetId('foobar', @Bloop)//
SELECT @Bloop//
Результаты
У меня есть две строки в этой таблице, их идентификаторы быть '1' и '2'. Результат, который я верну, равен '31', независимо от того, соответствует ли инструкция SELECT чему-либо или нет. Я пробовал много вариантов, в том числе полностью исключая предложение WHERE и имея SELECT возвращает значение COUNT (1) в параметр (который дает мне результат «32», несмотря на то, что есть только 2 строки), и я попытался " объявляя «переменную @Bloop перед использованием в вызове sproc с помощью SET @Bloop = 0
.
Если у вас есть представление о том, почему это происходит, и что я могу сделать, чтобы вернуть правильное значение, я был бы очень обязан. Кроме того, если вы можете показать мне, как достичь того же желаемого результата, используя функцию , с возвратным значением, я был бы признателен, что даже еще! Мой желаемый подход использует хранимую функцию, но у меня были схожие проблемы с этим, затем я отказался и попытался использовать сохраненный процесс, только чтобы найти, что получаю аналогичные результаты.
Все, что вы предлагаете, было бы полезно!
Редактировать:
CREATE TABLE `Table` (
`id` int(11) NOT NULL auto_increment,
`column_a` varchar(32) character set utf8 NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
mysql> SELECT * FROM Table;
+------+----------+
| id | column_a |
+------+----------+
| 1 | asdf |
| 2 | foobar |
+------+----------+
Когда я называю spGetId() с любой аргумент, он возвращает значение '31' (даже если аргумент 'Foobar', который должен возвращать целое значение '2' (или ascii 0x32)). Если я изменю spGetId(), чтобы вернуть итоговую таблицу строк, вместо того, чтобы возвращать «2», он возвращает «32».
Можете ли вы показать вывод «показать таблицу создания таблицы« Таблица »и« выбрать »из« Таблицы »? – Martin
Попробуйте вызвать 'show warnings;' сразу после вас 'CALL spGetId ('bleep', @Bloop)', для меня, похоже, проблема с преобразованием типа – ajreal
Протестировано с 'create table' от вашего последнего редактирования и работает без проблем , Вы уверены, что тестируете это в правой базе данных? –