存储过程函数不能正常工作?

Posted

技术标签:

【中文标题】存储过程函数不能正常工作?【英文标题】:stored procedure functions not working properly? 【发布时间】:2014-01-26 09:35:17 【问题描述】:

我正在 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....)。提前谢谢

【问题讨论】:

查看您的问题历史记录,我强烈建议您熟悉 upvoting/accepting 答案的概念。否则 SO 成员将停止帮助你,因为你没有对他们帮助你的时间和精力表示感谢。 【参考方案1】:

这个问题很可能是由于你使用同名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
);

【讨论】:

有帮助吗?您的问题需要更多帮助吗?

以上是关于存储过程函数不能正常工作?的主要内容,如果未能解决你的问题,请参考以下文章

面试问题 - SQL 中存储过程与函数的区别

我的 SQL 存储过程中的 HTML 格式化语法无法正常工作

不能在存储过程中调用函数

存储过程与函数的区别(转)

存储过程与函数的区别(转)

存储过程与函数的区别(转)