MySQL - Stored Procs - Странность при попытке использовать выходной параметр - PullRequest
0 голосов
/ 27 ноября 2010

Если честно, сейчас я чувствую себя довольно глупо. Но это просто не работает .

Сценарий
У меня есть хранимая процедура, которая включает в себя выходной параметр. Я пытаюсь выбрать значение в этот параметр. Это кажется простым, но это продолжает давать мне ошибочные результаты. Я проверил много интернет-источников, и я уверен, что я пытаюсь сделать это правильно.


код

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».

Ответы [ 2 ]

1 голос
/ 27 ноября 2010

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

0 голосов
/ 28 ноября 2010

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

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

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

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

...