Ошибка оператора триггера HSQLDB при использовании SimpleJdbcTestUtils.executeSqlScript () - PullRequest
2 голосов
/ 02 марта 2012

В настоящее время я пытаюсь загрузить сценарий 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 в отдельный файл, удалил точки с запятой, ...)

Любая помощь будет высоко ценится. Спасибо заранее!

Венди.

Ответы [ 3 ]

3 голосов
/ 07 марта 2012

Определение триггера не было полностью правильным.Решение представляло собой смесь данных ответов:

Обновите версию HSQLDB до 2.2.8, как предложено @fredt.Я немного изменил скрипт создания:

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!

Венди

0 голосов
/ 03 марта 2012

Вам необходимо использовать последнюю версию HSQLDB (в настоящее время 2.2.8).Более старые версии не поддерживают эту форму CREATE TRIGGER.

Когда вы изменили банку HSQLDB, следуйте рекомендациям Adi относительно проблемы с ';'.

0 голосов
/ 02 марта 2012

Изменить

SET newrow.VERSION = oldrow.VERSION + 1;

END;

на

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

SimpleJdbcTestUtils предполагает ';'в качестве разделителя, если он присутствует в сценарии.Поэтому, если у вас один оператор с несколькими символами «;», вам нужно убедиться, что после символа «;» нет символа новой строки (\ n).

Я предлагаю вам отказаться от SimpleJdbcTestUtils, если в ваших утверждениях есть несколько символов ';'или если ваш сценарий содержит комментарии sql (попробуйте для удовольствия).Для альтернативной проверки this , и я предпочитаю this подход, если вы не возражаете против добавления библиотеки ant.

...