我正在探索在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
我承认我是新手。我问谷歌并阅读了几篇关于如何编写函数的文章,但无法找到解决这个问题的方法。
欢迎任何想法。
答案 0 :(得分:1)
您已宣布自己的职能DETERMINISTIC
。 Which means that:
如果一个函数只能产生一个结果,那么它是确定性的 给出参数列表。如果结果可能受存储的影响 数据,服务器变量,随机数或任何不是的值 显式传递,然后函数不确定。
由于您要从表中查询,因此不应将您的函数声明为确定性函数。
答案 1 :(得分:0)
事实证明,在声明avrg时我必须添加(7,4):
DECLARE avrg DECIMAL(7,4);
现在一切都很好。
我还会在此处提出我之前向我指出的其他错误:
@Andomar注意到了这两个人。谢谢。