使用 SimpleJdbcTestUtils.executeSqlScript() 时 HSQLDB 触发语句错误

Posted

技术标签:

【中文标题】使用 SimpleJdbcTestUtils.executeSqlScript() 时 HSQLDB 触发语句错误【英文标题】:HSQLDB Trigger Statement ERROR when using SimpleJdbcTestUtils.executeSqlScript() 【发布时间】:2012-03-02 15:59:39 【问题描述】:

我目前正在尝试加载 sql 脚本来创建 HSQL 数据库。 这是通过使用以下代码完成的:

Resource resource = new ClassPathResource("/create-table.sql");        
SimpleJdbcTestUtils.executeSqlScript(template, resource, Boolean.FALSE);

脚本包含触发器的创建语句:

CREATE TRIGGER t BEFORE UPDATE ON SUBJECTS 
REFERENCING NEW AS newrow OLD AS oldrow
FOR EACH ROW
BEGIN ATOMIC
    SET newrow.VERSION = oldrow.VERSION + 1;
END;

使用此代码运行测试时,出现以下错误:

Caused by: java.sql.SQLException: Unexpected end of command: REFERENCING in statement   
[CREATE TRIGGER t BEFORE UPDATE ON SUBJECTS REFERENCING]
at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
at org.hsqldb.jdbc.jdbcStatement.fetchResult(Unknown Source)
at org.hsqldb.jdbc.jdbcStatement.executeUpdate(Unknown Source)
at org.apache.commons.dbcp.DelegatingStatement.executeUpdate(DelegatingStatement.java:228)
at org.apache.commons.dbcp.DelegatingStatement.executeUpdate(DelegatingStatement.java:228)
at org.springframework.jdbc.core.JdbcTemplate$1UpdateStatementCallback.doInStatement(JdbcTemplate.java:508)
at org.springframework.jdbc.core.JdbcTemplate$1UpdateStatementCallback.doInStatement(JdbcTemplate.java:1)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:395)

我使用的是 Spring 3.0.5,而 HSQLDB(驱动程序,...)版本是 1.8.0.10。

有没有人遇到过这个问题或知道如何解决这个问题?

(我也尝试将所有内容放在一行,将 sql 放在单独的文件中,删除分号,...)

任何帮助将不胜感激。提前谢谢!

温迪。

【问题讨论】:

【参考方案1】:

触发器的定义并不完全正确。 解决方案变成了给定答案的混合体:

按照@fredt 的建议将 HSQLDB 版本更新到 2.2.8。 我稍微更改了创建脚本:

CREATE TRIGGER t BEFORE UPDATE ON SUBJECTS 
REFERENCING NEW AS newrow OLD AS oldrow
FOR EACH ROW
    SET newrow.VERSION = oldrow.VERSION + 1;

现在没有关于分号等的投诉。

感谢@Adi 和@fredt 的帮助!

温迪

【讨论】:

是的,“引用新的”在 HSQL 1.8 和“2.0 的早期版本”中不起作用——只是偶然发现了这个!当心!【参考方案2】:

改变

SET newrow.VERSION = oldrow.VERSION + 1;

结束;

SET newrow.VERSION = oldrow.VERSION + 1;END;

SimpleJdbcTestUtils 假定为 ';'如果它存在于脚本中,则作为分隔符。因此,如果您有多个';' 的单个语句,则需要确保';' 之后没有换行符(\n)。

如果你的语句有多个';',我建议你放弃SimpleJdbcTestUtils或者如果您的脚本包含 sql cmets(试试看是否好玩)。对于替代检查this,如果您不介意添加 ant 库,我更喜欢this 方法。

【讨论】:

【参考方案3】:

您需要使用最新版本的 HSQLDB(目前为 2.2.8)。旧版本不支持这种形式的 CREATE TRIGGER。

当您更改 HSQLDB jar 后,请按照 Adi 对“;”问题的建议。

【讨论】:

以上是关于使用 SimpleJdbcTestUtils.executeSqlScript() 时 HSQLDB 触发语句错误的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)