2012-03-02 2 views
2

현재 SQL 스크립트를로드하여 HSQL 데이터베이스를 생성하려고합니다.HSQLDB Trigger Statement SimpleJdbcTestUtils.executeSqlScript() 사용시 오류

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; 

이 코드를 사용하여 테스트를 실행, 다음과 같은 오류가 발생합니다 :

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

스크립트는 트리거의 생성 문을 포함 이는 다음 코드를 사용하여 수행됩니다

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) 

스프링 3.0.5를 사용하고 HSQLDB (드라이버, ...) 버전은 1.8.0.10입니다.

누구나이 문제를 겪었거나이를 해결하는 방법을 알고 있습니까?

는 (나는 또한, 한 줄에 모든 것을 배치하려고 별도의 파일에 SQL을 배치, ... 세미콜론을 제거)

이 어떤 도움이 많이 이해할 수있을 것이다. 고맙습니다!

웬디.

답변

3

방아쇠의 정의가 완전히 정확하지 않았습니다. 해결책은 주어진 답변의 혼합이되었습니다 :

@fredt가 제안한대로 2.2.8에 대한 HSQLDB 업데이트 버전. 내가 변경 스크립트를 조금 작성 :

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

지금

고맙습니다 @fredt과 도움 @Adi에 대한 세미콜론 등에 대한 불만이 없습니다를!HSQL 1.8에서 작동하지 않습니다 "2.0의 초기 버전", "새를 참조"

웬디

+0

예는, - 그냥이 너무에 발견! 조심해! – alexandroid

0

변경

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

끝;

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

SimpleJdbcTestUtils ';' 스크립트에 구분 기호로 사용됩니다. 따라서 ';'가 여러 개인 단일 명령문이있는 경우 ';'다음에 새로운 행 문자 (\ n)가 없는지 확인해야합니다.

진술에 ';'이 여러 개있는 경우 SimpleJdbcTestUtils을 포기할 것을 권합니다. 또는 스크립트에 SQL 주석이 포함되어있는 경우 (재미있게 시도하십시오). 대체 체크에 대해서는 this이고 나는 개미 라이브러리를 추가해도 괜찮 으면 this 접근법을 선호합니다.

0

최신 버전의 HSQLDB (현재 2.2.8)를 사용해야합니다. 이전 버전은 CREATE TRIGGER의이 형식을 지원하지 않습니다.

HSQLDB 항아리를 변경 한 경우 ';'과 관련된 Adi의 권장 사항을 따르십시오.