来自mysql函数的奇怪结果

时间:2014-02-23 19:49:44

标签: mysql

我创建了一个函数,该函数返回一个在句点表中选择的值,如下所示:

 CREATE TABLE `periods` (
  `period` DATE NOT NULL,
  `threshold` DOUBLE NOT NULL,
   PRIMARY KEY (`period`)
 )
 COLLATE='latin1_swedish_ci'
 ENGINE=InnoDB;

+------------------------+
|        periods         |
+------------+-----------+
|   period   | threshold |
+------------+-----------+
| 2013-11-01 |     5     |
+------------+-----------+
| 2013-12-01 |     1     |
+------------+-----------+
| 2014-01-01 |     5     |
+------------+-----------+
| 2014-02-01 |     5     |
+------------+-----------+

功能创建:

DELIMITER $$
CREATE DEFINER=`root`@`localhost` FUNCTION `GET_THRESHOLD`(`PERIOD` VARCHAR(10))
 RETURNS double
 LANGUAGE SQL
 NOT DETERMINISTIC
 READS SQL DATA
 SQL SECURITY DEFINER
 COMMENT 'RETURN THRESHOLD'
 BEGIN
   DECLARE RESULT DOUBLE;
   SELECT threshold INTO RESULT FROM periods WHERE period = PERIOD LIMIT 1;
   RETURN RESULT;
 END
 $$
 DELIMITER ;

但该函数返回错误的值

mysql>SELECT GET_THRESHOLD('2013-12-01')
-> 5
有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:3)

您的参数与列的名称相同。这是禁忌。试试这个:

DELIMITER $$
CREATE DEFINER=`root`@`localhost` FUNCTION `GET_THRESHOLD`(`V_PERIOD` VARCHAR(10))
 RETURNS double
 LANGUAGE SQL
 NOT DETERMINISTIC
 READS SQL DATA
 SQL SECURITY DEFINER
 COMMENT 'RETURN THRESHOLD'
 BEGIN
   DECLARE RESULT DOUBLE;
   SELECT threshold INTO RESULT FROM periods WHERE period = V_PERIOD LIMIT 1;
   RETURN RESULT;
 END
 $$
 DELIMITER 

声明:

WHERE period = PERIOD

将列值与自身进行比较。因此,它选择具有非NULL列值的所有行。不是很有趣。

优良作法是始终将变量和参数加上前缀,以便将它们与表中的列区分开来。