mysql - JDBC 插入语句不在 MySQL 上启动触发器和函数

标签 mysql jdbc triggers

我有一个触发器和一个函数,如下所示

触发器:

DELIMITER $$

USE `server`$$

DROP TRIGGER /*!50032 IF EXISTS */ `calcQumilative`$$

CREATE
    /*!50017 DEFINER = 'root'@'%' */
    TRIGGER `calcQumilative` BEFORE INSERT ON `cpdata` 
    FOR EACH ROW BEGIN
    DECLARE curr_distance DECIMAL(12,4) DEFAULT 0;
    DECLARE prev_id  INT;
    DECLARE prev_lat  DECIMAL(12,7);
    DECLARE prev_lon  DECIMAL(12,7);
    DECLARE prev_idling  INT;
    DECLARE prev_idlingcount  INT;
    DECLARE prev_ignition  INT;
    DECLARE prev_ignitioncount  INT;
    DECLARE prev_fuelconsumption  DECIMAL(12,4);
    DECLARE prev_dist  DECIMAL(12,4);
    DECLARE prev_infuel DECIMAL(12,4);
    DECLARE prev_outfuel DECIMAL(12,4);
    DECLARE prev_hw_infuel DECIMAL(12,4);
    DECLARE prev_hw_outfuel DECIMAL(12,4);
    DECLARE prev_tmp_idl_fuel DECIMAL(12,4) DEFAULT 0;
    DECLARE curr_idling  INT;
    DECLARE curr_idlingcount  INT DEFAULT 0;
    DECLARE curr_ignition  INT;
    DECLARE curr_ignitioncount  INT;    
    DECLARE curr_fuelconsumption  DECIMAL(12,4);
    DECLARE curr_idl_fuelconsumption  DECIMAL(12,4)DEFAULT 0;
    DECLARE curr_tmp_idl_fuel DECIMAL(12,4) DEFAULT 0;
    DECLARE curr_infuel  DECIMAL(12,4);
    DECLARE curr_outfuel  DECIMAL(12,4);
    DECLARE temprowcount INT  DEFAULT 1 ;

    SELECT id,latitude ,longitude,idling,idlingcount,ignition,ignitioncount,idlingfuelconsumption,distance,infuel_pulsecount,
        outfuel_pulsecount,hw_infuel_pulsecount,hw_outfuel_pulsecount,tmp_idlingfuelconsumption INTO 
        prev_id,prev_lat,prev_lon,prev_idling,prev_idlingcount,prev_ignition,prev_ignitioncount,prev_fuelconsumption,prev_dist,prev_infuel,
        prev_outfuel,prev_hw_infuel,prev_hw_outfuel,prev_tmp_idl_fuel FROM carbonpoddata AS prevrow
    WHERE prevrow.id < NEW.id AND NEW.vehicalnum = prevrow.vehicalnum AND DATE (NEW.podtimestamp) = DATE(prevrow.podtimestamp) ORDER BY podtimestamp DESC LIMIT 1;          
    IF prev_id IS NOT NULL THEN 

        IF NEW.hw_infuel_pulsecount > prev_hw_infuel THEN
            SET curr_infuel = prev_infuel + (NEW.hw_infuel_pulsecount - prev_hw_infuel) ;
        ELSE
            SET curr_infuel = prev_infuel + (100- prev_hw_infuel) + NEW.hw_infuel_pulsecount ;
        END IF;
        IF NEW.hw_outfuel_pulsecount > prev_hw_outfuel THEN
            SET curr_outfuel = prev_outfuel + (NEW.hw_outfuel_pulsecount - prev_hw_outfuel) ;
        ELSE
            SET curr_outfuel = prev_outfuel + (100- prev_hw_outfuel) + NEW.hw_outfuel_pulsecount ;
        END IF;
        IF prev_ignition = NEW.ignition THEN
            SET curr_ignitioncount = (prev_ignitioncount+1);
        ELSE
            SET curr_ignitioncount = 1;
        END IF;
        IF ( prev_lat = NEW.latitude AND prev_lon = NEW.longitude AND NEW.ignition = 1) THEN
            SET curr_idling = 1;
            IF prev_idling = curr_idling THEN
                SET curr_idlingcount  = prev_idlingcount+1 ;                
                SET curr_fuelconsumption  = prev_tmp_idl_fuel + (((curr_infuel - curr_outfuel)* 5) /1000 ) ;        
                IF curr_idlingcount = 10 THEN 
                     SET curr_idl_fuelconsumption = curr_fuelconsumption;
                ELSE 
                    IF curr_idlingcount > 10 THEN 
                        SET curr_idl_fuelconsumption = (((curr_infuel - curr_outfuel)* 5) /1000 ) ;
                    ELSE
                        SET curr_tmp_idl_fuel = curr_fuelconsumption;
                    END IF;
                END IF;

            ELSE                
                SET curr_idlingcount  = 1;

            END IF;         
        ELSE
            SET curr_idling = 0;
            IF prev_idling = curr_idling THEN
                SET curr_idlingcount  = prev_idlingcount+1 ;                

            ELSE                
                SET curr_idlingcount  = 1;

            END IF;                     
        END IF;     
        SELECT CALCULATE_DISTANCE(prev_lat,prev_lon,NEW.latitude,NEW.longitude) INTO curr_distance;
        IF curr_distance IS NULL THEN 
            SET curr_distance = 0;
        END IF;
        SET curr_distance = curr_distance + prev_dist;                  
        SET NEW.distance = curr_distance;
        SET NEW.ignitioncount =curr_ignitioncount ;
        SET NEW.idlingcount =curr_idlingcount;
        SET NEW.idling = curr_idling;   
        SET NEW.infuel_pulsecount = curr_infuel;
        SET NEW.outfuel_pulsecount = curr_outfuel;
        SET NEW.tmp_idlingfuelconsumption = curr_tmp_idl_fuel;
        SET NEW.idlingfuelconsumption = curr_idl_fuelconsumption;


    END IF;
    END;
$$

DELIMITER ;

上面的触发器调用了函数 CALCULATE_DISTANCE:

DELIMITER $$

USE `server`$$

DROP FUNCTION IF EXISTS `CALCULATE_DISTANCE`$$

CREATE DEFINER=`root`@`%` FUNCTION `CALCULATE_DISTANCE`(`@oLat` DECIMAL(10,7), `@oLon` DECIMAL(10,7), `@dLat` DECIMAL(10,7), `@dLon` DECIMAL(10,7)) RETURNS DECIMAL(10,7)
    NO SQL
BEGIN
    RETURN (
        (
            ACOS(
                SIN(`@dLat` * PI() / 180) *
                SIN(`@oLat` * PI() / 180) +
                COS(`@dLat` * PI() / 180) *
                COS(`@oLat` * PI() / 180) *
                COS((`@dLon` - `@oLon`) * PI() / 180)
            ) *
            180 / PI()
        ) *
        60 *
        1.1515 *
        1.609344
    );
    END$$

DELIMITER ;

当我向 cpdata 表中插入一条记录时,它应该在插入之前启动触发器,但当我同时使用 Hibernate 和 JDBC 插入一条记录时,MySQL 似乎无法识别相同的记录。

但是如果我使用 SQLYog 插入多条记录,触发器会正常工作。可能是什么原因,我该如何解决?

最佳答案

我也有同样的问题。我找到了它的原因,但没有找到治疗方法。

当最终从 DriverManager.getConnection() 获取连接时,MySQL JDBC 连接会自动执行以下操作:

SET sql_mode='STRICT_TRANS_TABLES'

我还没有找到禁用它的方法。一种解决方案是在执行任何 SQL 之前执行它

SET sql_mode=''

但这在 Hibernate 这样的 ORM 框架中可能并不容易。

关于mysql - JDBC 插入语句不在 MySQL 上启动触发器和函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8195017/

相关文章:

mysql - 在Cloudera Quickstart VM中使用sqoop从主机导入数据

mysql - 删除和更新命令不起作用......asp.net2010、SQLYOG DATABASE 5.0 中的程序

java - 如何使用 JDBC 更新 MySQL-PreparedStatement 中未知数量的列?

oracle - 在插入时初始化子序列列值。 (甲骨文)

mysql - 除了使用子查询执行检查约束之外,还有其他选择吗?

iphone - 如何在单个查询中插入1条记录后检索自动增量值(sql server)

php - 如何使用 PHP 对 Mysql 的输出进行分类并避免重复值?

mysql - MySQL 中何时使用单引号、双引号和反引号

java.sql.SQLException : No suitable driver on tomcat 8. 5

java - JDBC + SQLite : DriveManager does not load needed driver