JDBC向mysql添加自定义函数的错误与解决方法

注:方法体中涉及的表和function方体体都不是重点。

先贴出在数据中能执行的sql代码:

DELIMITER $$
DROP FUNCTION IF EXISTS `f_continuty_days`$$
CREATE
FUNCTION f_continuty_days(id INT)
RETURNS INT

DETERMINISTIC
READS SQL DATA

BEGIN
DECLARE days INT;
DECLARE flag INT;
DECLARE previous_day DATE;
SET days = 0;
SET flag = 1;
SET previous_day = DATE_SUB(CURDATE(),INTERVAL 1 DAY);

WHILE flag>0 DO
SELECT COUNT(DISTINCT(DATE(soidv.USE_DATE))) INTO flag FROM driver_in di LEFT JOIN SI si ON di.ID=si.DRIVER_IN_ID
WHERE di.ID=id
AND si.STATUS <> 9
AND DATE(si.USE_DATE) = previous_day ;
IF flag > 0 THEN
SET days = days + 1;
SET previous_day = DATE_SUB(previous_day,INTERVAL 1 DAY);
END IF;
END WHILE;
RETURN days;
END$$

这段sql复制到java执行却不行,然后将这段代码分成两部分 分别执行就可以。

第一部分:

DROP FUNCTION IF EXISTS `f_continuty_days`

第二部分:

CREATE 
FUNCTION f_continuty_days(id INT) 
RETURNS INTDETERMINISTIC
READS SQL DATA 
BEGIN 
DECLARE days INT; 
DECLARE flag INT; 
DECLARE previous_day DATE; 
SET days = 0; 
SET flag = 1; 
SET previous_day = DATE_SUB(CURDATE(),INTERVAL 1 DAY); 

WHILE flag>0 DO 
SELECT COUNT(DISTINCT(DATE(soidv.USE_DATE))) INTO flag FROM driver_in di LEFT JOIN SI si ON di.ID=si.DRIVER_IN_ID 
WHERE di.ID=id
AND si.STATUS <> 9
AND DATE(si.USE_DATE) = previous_day ; 
IF flag > 0 THEN 
SET days = days + 1; 
SET previous_day = DATE_SUB(previous_day,INTERVAL 1 DAY); 
END IF; 
END WHILE; 
RETURN days; 
END

(其中

DETERMINISTIC
READS SQL DATA 作用:如果数据库开启了bin-log,申明函数中sql只读数据不做修改)

虽然解决了,但是原因不明,可能会对其他东西有影响,谨慎使用。这里的方法可能也不是最好的解决方法。。。

 

转载于:https://www.cnblogs.com/shourai/p/6673764.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值