2016-04-25 5 views
0

Пожалуйста, помогите мне понять, Мне нужно создать хранимая процедура для создания нового пользователя в db.mysql select in returns NULL

delimiter //  
    CREATE PROCEDURE add_user (x VARCHAR(25)) 
    BEGIN 
     DECLARE x VARCHAR(25) DEFAULT 'mark'; 
     DECLARE newname VARCHAR(25); 
     DECLARE xid INT; 

     SELECT x, id INTO newname, xid 
     FROM users WHERE x = x; 
     SELECT newname; 
    END; 
    delimiter ; 

когда я call add_user('peter'); он показывает мне: newname/null куда я пойти не так?

+0

'WHERE xname = xname'? – axiac

+0

мой плохой, извините, изменил это 'xname на x' – 100vla

ответ

1
CREATE PROCEDURE add_user (x VARCHAR(25)) 
BEGIN 
    DECLARE x VARCHAR(25) DEFAULT 'mark'; 

Это фактически создает две переменные с именами x. Первый - это параметр функции, а второй - локальная переменная, которая находится внутри области BEGIN ... END. Согласно MySQL scoping rules, только одна из этих переменных может быть видимой, что означает, что параметр x скрыт и недоступен внутри блока BEGIN ... END.

Решение просто удалить строку

DECLARE x VARCHAR(25) DEFAULT 'mark'; 

и, если вам нужно присвоить значение по умолчанию, сделать это в IF блоке:

IF x IS NULL THEN 
    SET x = 'mark'; 
END IF; 

Полное определение функции должно быть

delimiter //  
CREATE PROCEDURE add_user (x VARCHAR(25)) 
BEGIN 
    DECLARE newname VARCHAR(25); 
    DECLARE xid INT; 

    IF x IS NULL THEN 
    SET x = 'mark'; 
    END IF; 

    SELECT x, id INTO newname, xid 
    FROM users WHERE x = x; 
    SELECT newname; 
END; 
delimiter ; 
+0

Спасибо @ Дарвин фон Коракс, действительно, спасибо! – 100vla