2014-01-08 74 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