SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 08.04.2011 21:54:24

saralexy
Участник
Зарегистрирован: 08.04.2011
Сообщений: 3

Обработка входных данных в хранимой процедуре

Всем добрый час!
У меня возникла проблема:
Есть например процедура

CREATE DEFINER = 'root'@'localhost' PROCEDURE `authorizationUser`(
        INOUT usr VARCHAR(100),
        INOUT pwd VARCHAR(100),
        OUT usrid INTEGER(11)
    )
    NOT DETERMINISTIC
    READS SQL DATA
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
SELECT @usrid := id FROM `users` WHERE nikname=@usr AND password=@pwd;
END;

,которая возвращает id при проверке имени пользователя и пароля. Тут важна часть запроса между begin и end.
Например, если мы выполняем запрос в таком виде:

SELECT @usrid := id FROM `users` WHERE nikname='name' AND password='pass';

то все в порядке, и запрос возвращает один id, а если в таком:

SELECT @usrid := id FROM `users` WHERE nikname=@usr AND password=@pwd;

или в таком:

SELECT @usrid := id FROM `users` WHERE nikname=usr AND password=pwd;

то результат оказывается пустым, причем возвращенные параметры @usr='name' и @pwd='pass', а @usrid=NULL.
В чем может быть проблема?
Ввод данных происходит через поля ввода в SQL Manager 2010, которые появляются при тесте процедуры. Кодировка по умолчанию для базы данных utf-8. Может проблема в кодировках? Как можно исправить ошибку?

Неактивен

 

#2 08.04.2011 22:16:44

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Обработка входных данных в хранимой процедуре

Вы запутались в обозначениях. Например, переменную Вы назвали usr, а
в тексте процедуры используете @usr. Это совсем не одно и то же smile

Да, перечитал Ваш вопрос — кажется, что последний вариант должен вы-
давать правильное число, но там @usrid ≠ usrid smile

Неактивен

 

#3 08.04.2011 22:28:41

saralexy
Участник
Зарегистрирован: 08.04.2011
Сообщений: 3

Re: Обработка входных данных в хранимой процедуре

paulus написал:

Да, перечитал Ваш вопрос — кажется, что последний вариант должен вы-
давать правильное число, но там @usrid ≠ usrid smile

Дело в том, что запрос:

SELECT @usrid := id FROM `users` WHERE nikname='name' AND password='pass';

выполняется правильно, я написал об этом в своем сообщении, значит дело не в @usrid, .. да и вообще если @ убрать, то ошибку выдаст.
Как в большинстве статей пишут, тоже пробывал:

SELECT id INTO usrid FROM `users` WHERE nikname=usr AND password=pwd;

не работает!

Отредактированно saralexy (08.04.2011 22:30:56)

Неактивен

 

#4 08.04.2011 22:34:10

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Обработка входных данных в хранимой процедуре

Код:

[silentia] root test > create table users (id int, nickname varchar(10), password varchar(10));
Query OK, 0 rows affected (0.00 sec)

[silentia] root test > insert users values (1, 'foo', 'bar');
Query OK, 1 row affected (0.00 sec)

[silentia] root test > create procedure authme (usr varchar(10), pwd varchar(10), out usrid int) select id into usrid from users where nickname = usr and password = pwd;
Query OK, 0 rows affected (0.00 sec)

[silentia] root test > call authme('foo', 'bar', @a);
Query OK, 1 row affected (0.00 sec)

[silentia] root test > select @a;
+------+
| @a   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

Неактивен

 

#5 08.04.2011 23:44:04

saralexy
Участник
Зарегистрирован: 08.04.2011
Сообщений: 3

Re: Обработка входных данных в хранимой процедуре

Проблема оказалась в этом блоке

CREATE DEFINER = 'root'@'localhost' PROCEDURE `authorizationUser`(
        INOUT usr VARCHAR(100),
        INOUT pwd VARCHAR(100),
        OUT usrid INTEGER(11)
    )
    NOT DETERMINISTIC
    READS SQL DATA
    SQL SECURITY DEFINER
    COMMENT ''

В указанном выше виде не работает, а в следующем:

CREATE PROCEDURE `authorizationUser`(
        INOUT usr VARCHAR(100),
        INOUT pwd VARCHAR(100),
        OUT usrid INTEGER(11)
    )

запрос успешно возвращает id. Дело в том, что редактор EMS SQL Manager вставляет этот нерабочий блок по умолчанию, а редактированию подлежит лишь блок begin-end... Проблема в доступе к данным для текущего пользователя, в результате чего вместо правильного ответа, получаем только NULL

Отредактированно saralexy (08.04.2011 23:46:09)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson