Если честно, сейчас я чувствую себя довольно глупо. Но это просто не работает .
Сценарий
У меня есть хранимая процедура, которая включает в себя выходной параметр. Я пытаюсь выбрать значение в этот параметр. Это кажется простым, но это продолжает давать мне ошибочные результаты. Я проверил много интернет-источников, и я уверен, что я пытаюсь сделать это правильно.
код
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».