0

Если честно, я сейчас чувствую себя довольно глупо. Но это просто не работает.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».

+0

Можете ли вы показать вывод «показать таблицу создания таблицы« Таблица »и« выбрать »из« Таблицы »? – Martin

+0

Попробуйте вызвать 'show warnings;' сразу после вас 'CALL spGetId ('bleep', @Bloop)', для меня, похоже, проблема с преобразованием типа – ajreal

+0

Протестировано с 'create table' от вашего последнего редактирования и работает без проблем , Вы уверены, что тестируете это в правой базе данных? –

ответ

0

Мне нужно научиться меняться в тестовых средах.

Я до сих пор не уверен проблема была, но похоже, что phpMyAdmin выполнял какое-то преобразование типа, и я выполнял все свои тесты через этого конкретного клиента.

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

Итак, извлеченный урок: никогда не доверяйте клиенту. Не помню, чтобы переключить его немного.

1

Ваш хранимый proc работает. Я думаю, что он возвращает значение ascii символа '1' вместо целочисленного значения 1.

+0

Это звучит довольно жизнеспособно. Но возвращаемый идентификатор должен * 2, поэтому я не уверен, почему он будет возвращать «1». И если столбец является int (11), а возвращаемое значение sproc - int (11), то зачем ему возвращать значение ascii? Вы знаете, есть ли там что-нибудь еще в игре? – JMTyler

 Смежные вопросы

  • Нет связанных вопросов^_^