2014-01-08 8 views
1

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

Ниже приведен пример кода процедуры и функций без if.

DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `USP_GetEmployeeAttendanceReport`(IN selectedIndex int,IN searchText nvarchar(20),IN selectedDate datetime) 
BEGIN 
select FN_CheckEmpAttendanceStatus(selectedIndex,selectedDate); 
END 

Функция FN_CheckEmpAttendanceStatus

DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` FUNCTION `FN_CheckEmpAttendanceStatus`(cardid varchar(150),selectedDate datetime) RETURNS int(11) 
BEGIN 
DECLARE result INT; 
set result=(select count(*) from iotrans where CARDID=cardid and dt=selectedDate); 
return result; 
END 

но из функции я получаю значения для мусора (т.е. 80,0,81,82 ....). Спасибо заранее

+0

Глядя на истории ваших вопросов я ** ** сильно рекомендую вам ознакомиться с концепцией ** [upvoting/прием ] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) ** ответы. В противном случае члены SO перестанут вам помогать, так как вы не проявляете признательность за свое время и силы, помогающие вам. – peterm

ответ

0

проблема наиболее вероятно, вызвано тем, что вы используете с таким же именемcardid для параметра функции, как для столбца в iotrans, поэтому MySQL не может рассказать им обособленно и условие WHERE CARDID=cardidвсегда оценивается как TRUE.

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

Дополнительная информация: result Переменная - лишние накладные расходы в вашем случае как есть BEGIN...END блок.

Это сказанное ваша функция, возможно, уже выглядела как этот

CREATE DEFINER=`root`@`localhost` 
    FUNCTION FN_CheckEmpAttendanceStatus 
(
    _cardid varchar(150), 
    _selectedDate datetime 
) RETURNS INT(11) 
RETURN 
(
    SELECT COUNT(*) 
    FROM iotrans 
    WHERE cardid = _cardid 
    AND dt = _selectedDate 
); 
+0

Помогло ли это? Вам нужна дополнительная помощь по вашему вопросу? – peterm

Смежные вопросы