请问如何用java创建触发器

wanghu1983 发布于 2015/02/26 19:36
阅读 5K+
收藏 0

大家新年好!问题如题所示,先不用纠结为什么要在java中创建触发器,而不是在数据库里执行。

我的问题是这样,一段可以执行的触发器创建脚本,通过jdbc执行报错,错误的原因,就是这个分隔符关键字:

“delimiter  $$”,触发器脚本如下:DELIMITER $$
CREATE
    TRIGGER `oms_sql_jx`.`OMS_SYS_USER_INFO_INSERT` BEFORE INSERT
    ON `oms_sql_jx`.`OMS_SYS_USER_INFO`
    FOR EACH ROW BEGIN
    INSERT INTO  temp_triger(id,tablename,operation,sync_status,pks,countsql,exesql) VALUES(UUID(),'OMS_SYS_USER_INFO','I','0','INFO_ID',
CONCAT('select count(*) from OMS_SYS_USER_INFO  where INFO_ID=','\'',new.INFO_ID,'\'' ),
CONCAT(' insert into OMS_SYS_USER_INFO (INFO_ID,USER_ID,ORG_ID,ORG_SUBJECTION_ID,LAND_DATE,LEAVE_DATE,IP,NOTE,MODIFI_DATE,CREATE_DATE,CREATOR_ID,CREATOR,BSFLAG,STATE,LOGIN_SYS)  VALUES (','\'',CASE  WHEN ISNULL(new.INFO_ID) THEN 'null' ELSE REPLACE(new.INFO_ID,'\'','\\\'')  END,'\'',' , ','\'',CASE  WHEN ISNULL(new.USER_ID) THEN 'null' ELSE REPLACE(new.USER_ID,'\'','\\\'')  END,'\'',' , ','\'',CASE  WHEN ISNULL(new.ORG_ID) THEN 'null' ELSE REPLACE(new.ORG_ID,'\'','\\\'')  END,'\'',' , ','\'',CASE  WHEN ISNULL(new.ORG_SUBJECTION_ID) THEN 'null' ELSE REPLACE(new.ORG_SUBJECTION_ID,'\'','\\\'')  END,'\'',' , ','\'',CASE  WHEN ISNULL(new.LAND_DATE) THEN  'null' ELSE  CONCAT('to_date(\'',new.LAND_DATE,'\',\'yyyy-mm-dd hh24:mi:ss\'',' )')  END ,'\'',' , ','\'',CASE  WHEN ISNULL(new.LEAVE_DATE) THEN  'null' ELSE  CONCAT('to_date(\'',new.LEAVE_DATE,'\',\'yyyy-mm-dd hh24:mi:ss\'',' )')  END ,'\'',' , ','\'',CASE  WHEN ISNULL(new.IP) THEN 'null' ELSE REPLACE(new.IP,'\'','\\\'')  END,'\'',' , ','\'',CASE  WHEN ISNULL(new.NOTE) THEN 'null' ELSE REPLACE(new.NOTE,'\'','\\\'')  END,'\'',' , ','\'',CASE  WHEN ISNULL(new.MODIFI_DATE) THEN  'null' ELSE  CONCAT('to_date(\'',new.MODIFI_DATE,'\',\'yyyy-mm-dd hh24:mi:ss\'',' )')  END ,'\'',' , ','\'',CASE  WHEN ISNULL(new.CREATE_DATE) THEN  'null' ELSE  CONCAT('to_date(\'',new.CREATE_DATE,'\',\'yyyy-mm-dd hh24:mi:ss\'',' )')  END ,'\'',' , ','\'',CASE  WHEN ISNULL(new.CREATOR_ID) THEN 'null' ELSE REPLACE(new.CREATOR_ID,'\'','\\\'')  END,'\'',' , ','\'',CASE  WHEN ISNULL(new.CREATOR) THEN 'null' ELSE REPLACE(new.CREATOR,'\'','\\\'')  END,'\'',' , ',
'\'',CASE  WHEN ISNULL(new.BSFLAG) THEN 'null' ELSE REPLACE(new.BSFLAG,'\'','\\\'')  END,'\'',' , ',
'\'',CASE  WHEN ISNULL(new.STATE) THEN 'null' ELSE REPLACE(new.STATE,'\'','\\\'')  END,'\'',' , ',
'\'',CASE  WHEN ISNULL(new.LOGIN_SYS) THEN 'null' ELSE REPLACE(new.LOGIN_SYS,'\'','\\\'')  END,'\'',')' ));
     END$$
DELIMITER ;

执行后报错如下:


java.sql.BatchUpdateException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '`DELIMITER` $$
CREATE
    TRIGGER `oms_sql_jx`.`OMS_SYS_USER_INFO_INSERT` BEFO' at line 1
 at com.mysql.jdbc.Statement.executeBatch(Statement.java:949)

在此,请教大家如何能在java里把这个触发器创建成功。先谢过!!

 

加载中
0
_
_Yud
http://my.oschina.net/u/1986061/blog/380334
_
_Yud
参考:http://stackoverflow.com/questions/4107028/create-a-oracle-db-trigger-using-thin-jdbc-driver
_
_Yud
我的实现方法
0
_
_Yud

要分开执行

第一次执行delimiter $$

第二次创建trigger

0
wanghu1983
wanghu1983

首先感谢@_Yud的回复,按照您的说法,我试了,单独执行delimiter $$通不过。

我准备尝试另一种方案:用bat来执行sql文件,这个已经验证通过,再用java来运行bat;

目前的主要难点,是每台机器上的数据库安装路径不清楚,bat文件要想连接到数据库,需要放在合适的文件夹路径下。

0
_
_Yud
不执行delimiter ,直接开始创建trigger,使用executeUpdate方法执行, 网上是这么说的
0
_
_Yud

我使用jdbcTemplate试过,如果直接把trigger语句直接是可以的(从create开始,到$$结束,不包含$$)

jdbcTemplate.execute(triggerSQL)

0
wanghu1983
wanghu1983
谢谢@_Yud的回复,这种方案我也试过,没有delimiter,触发器脚本就不完整,不能执行成功,因为在begin和end中间,这条insert语句后需要添加一个分号,如果没有delimiter,到这里就算一条sql,这时的语法是错误的语法
0
wanghu1983
wanghu1983

通过java执行bat,bat执行sql文件这种方式,已经成功,现在问题是,我在本地测试,知道数据的安装路径,所以没有问题;但是用户的数据库安装在哪里,我这边不知道,这就导致bat文件可能连接不上数据库。

这是一个CS结构的程序,每个用户都有自己独立的数据库。

0
wanghu1983
wanghu1983

首次发帖,不知道怎么结贴,我也没有什么积分,再次感谢@_Yud

_
_Yud
设个最佳答案就可以了.也省得后来人来回翻页了.
返回顶部
顶部