大家新年好!问题如题所示,先不用纠结为什么要在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里把这个触发器创建成功。先谢过!!
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
http://my.oschina.net/u/1986061/blog/380334
要分开执行
第一次执行delimiter$$
第二次创建trigger
首先感谢@_Yud的回复,按照您的说法,我试了,单独执行delimiter$$通不过。
我准备尝试另一种方案:用bat来执行sql文件,这个已经验证通过,再用java来运行bat;
目前的主要难点,是每台机器上的数据库安装路径不清楚,bat文件要想连接到数据库,需要放在合适的文件夹路径下。
不执行delimiter,直接开始创建trigger,使用executeUpdate方法执行,网上是这么说的我使用jdbcTemplate试过,如果直接把trigger语句直接是可以的(从create开始,到$$结束,不包含$$)
jdbcTemplate.execute(triggerSQL)
谢谢@_Yud的回复,这种方案我也试过,没有delimiter,触发器脚本就不完整,不能执行成功,因为在begin和end中间,这条insert语句后需要添加一个分号,如果没有delimiter,到这里就算一条sql,这时的语法是错误的语法通过java执行bat,bat执行sql文件这种方式,已经成功,现在问题是,我在本地测试,知道数据的安装路径,所以没有问题;但是用户的数据库安装在哪里,我这边不知道,这就导致bat文件可能连接不上数据库。
这是一个CS结构的程序,每个用户都有自己独立的数据库。
首次发帖,不知道怎么结贴,我也没有什么积分,再次感谢<aclass='referer'target='_blank'>@_Yud
设个最佳答案就可以了.也省得后来人来回翻页了.