SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

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

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

Вы не зашли.

#1 21.12.2011 12:20:23

Symbiot
Участник
Зарегистрирован: 21.12.2011
Сообщений: 8

Хранимые процедуры. SELECT

Всем доброго.
Никак не получается разобраться в хранимых процедурах. Логика составления запросов отнюдь не логична. =/

Вот конструкция:


CREATE PROCEDURE `adminAuth` (IN email VARCHAR(50), IN password VARCHAR(50), OUT p_level TINYINT(1))
    BEGIN
        SELECT level INTO p_level FROM table WHERE email = email AND password = password LIMIT 1;
        SELECT @level;
    END
 


Но упрямо возвращается NULL. Перепробовал 100 способов. И самое удивительное, что такой же запрос в другой процедуре работает нормально.
Подскажите, в чем дело...

Неактивен

 

#2 21.12.2011 15:24:49

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Хранимые процедуры. SELECT

Вы выводите в процедуре значение пользовательской переменной (@level), которая нигде не определена. По умолчанию она имеет значение null.

Неактивен

 

#3 22.12.2011 11:00:32

Symbiot
Участник
Зарегистрирован: 21.12.2011
Сообщений: 8

Re: Хранимые процедуры. SELECT

Я также пробовал выводить:


SELECT @p_level;
SELECT p_level;
SELECT level;
 


Но положительного результата это не дало. =/

Неактивен

 

#4 22.12.2011 11:31:51

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Хранимые процедуры. SELECT

А зачем вам вообще второй select в процедуре, если у вас OUT p_level?

В доке есть хороший иллюстрирующий пример того, что вам нужно
http://dev.mysql.com/doc/refman/5.5/en/ … edure.html

Неактивен

 

#5 22.12.2011 13:39:30

Symbiot
Участник
Зарегистрирован: 21.12.2011
Сообщений: 8

Re: Хранимые процедуры. SELECT

Да я уже и так пробовал:


CREATE PROCEDURE `adminAuth` (IN email VARCHAR(50), IN password VARCHAR(50), OUT level TINYINT(1))
    BEGIN
        SELECT level FROM table WHERE email = email AND password = password LIMIT 1;
    END
 


... и так:

CREATE PROCEDURE `adminAuth` (IN email VARCHAR(50), IN password VARCHAR(50), OUT level TINYINT(1))
    BEGIN
        SELECT level INTO level FROM table WHERE email = email AND password = password LIMIT 1;
    END
 


... так:

CREATE PROCEDURE `adminAuth` (IN email VARCHAR(50), IN password VARCHAR(50), OUT p_level TINYINT(1))
    BEGIN
        SELECT level INTO p_level FROM table WHERE email = email AND password = password LIMIT 1;
    END
 


Ну никак не хочет. =/

Неактивен

 

#6 22.12.2011 13:53:55

Symbiot
Участник
Зарегистрирован: 21.12.2011
Сообщений: 8

Re: Хранимые процедуры. SELECT

Вот такая конструкция хотя бы заработала, но возвращает только первую запись из таблицы:


CREATE PROCEDURE `adminAuth` (IN email VARCHAR(50), IN password VARCHAR(50), OUT p_level TINYINT(1))
    BEGIN
        SELECT level FROM table WHERE email = email AND password = password LIMIT 1;
    END
 

Неактивен

 

#7 22.12.2011 14:00:19

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Хранимые процедуры. SELECT

Имеет ли поле level null значение в таблице?

И что по вашему мнению в запросе
WHERE email = email
означает email - это имя поля или параметра хранимой процедуры? И как это должен трактовать сервер?

Неактивен

 

#8 22.12.2011 14:04:35

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Хранимые процедуры. SELECT

Symbiot написал:

Вот такая конструкция хотя бы заработала, но возвращает только первую запись из таблицы:


CREATE PROCEDURE `adminAuth` (IN email VARCHAR(50), IN password VARCHAR(50), OUT p_level TINYINT(1))
    BEGIN
        SELECT level FROM table WHERE email = email AND password = password LIMIT 1;
    END
 

Конструкция не очень хорошая, так как OUT p_level TINYINT(1) в ней совершенно лишний.
Покажите полностью как вы вызывали процедуру и получали null значение.
Относительно первой записи, см предыдущий мой ответ.

Неактивен

 

#9 22.12.2011 14:43:22

Symbiot
Участник
Зарегистрирован: 21.12.2011
Сообщений: 8

Re: Хранимые процедуры. SELECT

vasya написал:

Имеет ли поле level null значение в таблице?

И что по вашему мнению в запросе
WHERE email = email
означает email - это имя поля или параметра хранимой процедуры? И как это должен трактовать сервер?

Дефолтные значения поля `level` имеют NULL, но в них сейчас хранятся числовые значения.
По поводу email = email, я предполагаю, что mysql должен сам понимать, что email, который до знака "=" это поле, а после это значение. Возможно я ошибаюсь...

vasya написал:

Конструкция не очень хорошая, так как OUT p_level TINYINT(1) в ней совершенно лишний.
Покажите полностью как вы вызывали процедуру и получали null значение.

Структура процедуры:


CREATE PROCEDURE `adminAuth` (IN email VARCHAR(50), IN password VARCHAR(50), OUT p_level TINYINT(1))
    BEGIN
        SELECT level FROM table WHERE email = email AND password = password LIMIT 1;
    END
 


Вызываю:

$this->db->query("SET @email = '".$email."';
               SET @password = '"
.$passwd."'");

$res = $this->db->fetchAll("CALL adminAuth(@email, @password, @level)");


А почему лишний, разве не нужно указывать возвращаемые данные? Или вы имеете в виду, что имя этого параметра не совпадает с названием поля?

Отредактированно Symbiot (22.12.2011 15:26:53)

Неактивен

 

#10 22.12.2011 14:48:04

Symbiot
Участник
Зарегистрирован: 21.12.2011
Сообщений: 8

Re: Хранимые процедуры. SELECT

Пожалуй, вы были правы, по поводу записей вида email = email. Видимо поэтому он и возвращал только первое поле таблицы.

Сейчас переписал процедуру таким образом:


CREATE PROCEDURE `adminAuth` (IN p_email VARCHAR(50), IN p_password VARCHAR(50), OUT p_level TINYINT(1))
    BEGIN
        SELECT level FROM table WHERE email = p_email AND password = p_password LIMIT 1;
    END
 


И теперь нормально отрабатывает.
Благодарю, что наставили на путь истинный. wink

Остался единственный вопрос, как быть с параметром OUT p_level TINYINT(1), нужен ли он вообще?

Неактивен

 

#11 22.12.2011 15:33:44

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Хранимые процедуры. SELECT

Symbiot написал:

По поводу email = email, я предполагаю, что mysql должен сам понимать, что email, который до знака "=" это поле, а после это значение. Возможно я ошибаюсь...

Ошибаетесь. Вот хорошая иллюстрация на эту тему http://sqlinfo.ru/forum/viewtopic.php?pid=2513#p2513

Symbiot написал:

Структура процедуры:


CREATE PROCEDURE `adminAuth` (IN email VARCHAR(50), IN password VARCHAR(50), OUT p_level TINYINT(1))
    BEGIN
        SELECT level FROM table WHERE email = email AND password = password LIMIT 1;
    END
 


Вызываю:
CALL adminAuth(@email, @password, @level)

У вас в теле процедуры не происходит присвоение параметру p_level, а сразу идет вывод полученного значения.

Вот если бы написали
        SELECT level into  p_level FROM table WHERE ...;

Неактивен

 

#12 22.12.2011 15:51:03

Symbiot
Участник
Зарегистрирован: 21.12.2011
Сообщений: 8

Re: Хранимые процедуры. SELECT

Понял.
Спасибо еще раз. wink

Неактивен

 

Board footer

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