当预期十进制时,MariaDB用户定义的函数返回int或null

时间:2014-08-01 14:52:34

标签: mysql function mariadb

我正在探索在Slackware64 14.1上运行的MariaDB版本5.5.35中用户定义函数的深度。

功能如下:

DELIMITER $$
CREATE FUNCTION avg_month(st_id tinyint, pol_id tinyint, month_sel tinyint, year_sel smallint)
-> RETURNS DECIMAL(7.4)
-> DETERMINISTIC
-> BEGIN
-> DECLARE avrg decimal;
-> SELECT avg(value) into avrg FROM all_data_obs
-> WHERE month(start_time)=month_sel and year(start_time)=year_sel and station_id=st_id and polutant_id=pol_id;
-> RETURN avrg;
-> END $$

DB说

Query OK, 0 rows affected (0.03 sec)

但是当我尝试使用它时

select avg_month(2,5,5,2014);

返回null或1或0.不应该是1.0还是0.0?和 如果我尝试使用它

select avg_month(16,5,5,2014) from all_data_obs;

DB永远不会返回任何内容,我必须使用ctrl + c

停止查询

如果我只使用select语句,它可以正常工作。例如

 SELECT avg(value) as a FROM all_data_obs WHERE month(start_time)=5 and year(start_time)=2014 and station_id=16 and polutant_id=5;

返回0.122427,但

select avg_month(16,5,5,2014);

返回0

我承认我是新手。我问谷歌并阅读了几篇关于如何编写函数的文章,但无法找到解决这个问题的方法。

欢迎任何想法。

2 个答案:

答案 0 :(得分:1)

您已宣布自己的职能DETERMINISTICWhich means that:

  

如果一个函数只能产生一个结果,那么它是确定性的   给出参数列表。如果结果可能受存储的影响   数据,服务器变量,随机数或任何不是的值   显式传递,然后函数不确定。

由于您要从表中查询,因此不应将您的函数声明为确定性函数。

答案 1 :(得分:0)

事实证明,在声明avrg时我必须添加(7,4):

DECLARE avrg DECIMAL(7,4);

现在一切都很好。

我还会在此处提出我之前向我指出的其他错误:

  • 我写了RETURNS DECIMAL(7.4)而不是(7,4)
  • 该函数被错误地声明为DETERMINISTIC。

@Andomar注意到了这两个人。谢谢。