2013-07-02 2 views
1
delimiter // 

drop procedure if exists usp_validateUserLogin; 

create procedure usp_validateUserLogin(in t varchar(255), 
in username varchar(255), 
in password varchar(255),out count int) 
BEGIN 
    set @r=0; 
    set @tbl=concat('select count(*) into @r from ',t); 
    set @tbl2=concat(@tbl,' where @tbl.username=username and @tbl.password=password'); 
    prepare pstmt from @tbl2; 
    execute pstmt; 
    set [email protected]; 
END// 

delimiter ; 

код выше написан в файле, и я выполняю его из командной строки sql и компилируется без ошибок. когда я вызываю эту хранимую процедуру, она возвращает каждый раз нуль, хотя есть только одна запись, которая соответствует входному параметру. , если я выполняю те же инструкции из командной строки sql, что и сам работает правильно.этот динамический sql отлично работает из командной строки sql, но если он выполняется из sql-файла, он всегда возвращает 0, почему?

+0

вам нужно сказать, что схема вы должны использовать ядро ​​базы данных не допускается угадать это правильно для вас ... "use database_name;" –

+0

Я выполняю файл сценария сразу после выбора целевой базы данных, также добавил первую строку как «использовать mydatabase_name», но получая такой же вывод. вызовите usp_validateUserLogin ('users', 'z', '123', @ count), а затем выполнив команду select @count prints 0 как вывод. –

+0

добавьте эту строку в хранимую процедуру перед подготовкой инструкции (она должна позволить вам увидеть, какой запрос выполняется): выберите 'sql_query:', @ tbl2; –

ответ

0
set @tbl=concat('select count(*) into @r from ',t, ' t '); 
    set @tbl2=concat(@tbl,' where t.username=', username, ' and t.password=', password'); 

и этот вопрос можно было бы избежать, если вы напечатали заявление SQL, прежде чем попытаться выполнить его ...

+0

спасибо много .. Теперь его работа .. –