我正在探索在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
我承认我对函数不熟悉。我询问了谷歌,并阅读了几篇关于如何编写函数的文章,但没有找到解决这个问题的方法。
您已经声明了函数DETERMINISTIC
。这意味着:
如果一个函数只能为A产生一个结果,那么它就是确定性的给定的参数列表。如果结果可能受到存储的影响数据,服务器变量,随机数或任何不是的值显式传递,则函数不确定。
由于是从表中查询,所以不应该将函数声明为确定性的
在声明avrg:
时必须添加(7,4)DECLARE avrg DECIMAL(7,4);
现在一切看起来都很好。
我还将在这里列出我之前指出的其他错误:
- 我写了RETURNS DECIMAL(7.4)而不是(7,4)
- 函数被错误地声明为DETERMINISTIC。
这两个人被@Andomar注意到了。谢谢你。