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只读数据不做修改)

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

 

posted @ 2017-04-06 15:39  結城リト  阅读(505)  评论(0编辑  收藏  举报