2 Stimmen

HSQLDB Trigger-Anweisung ERROR bei Verwendung von SimpleJdbcTestUtils.executeSqlScript()

Ich versuche gerade, ein Sql-Skript zu laden, um eine HSQL-Datenbank zu erstellen. Dies geschieht mit Hilfe des folgenden Codes:

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

Das Skript enthält die Anweisung zum Erstellen eines Triggers:

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;

Wenn die Tests mit diesem Code ausgeführt werden, tritt folgender Fehler auf:

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)

Ich verwende Spring 3.0.5 und HSQLDB (Treiber,...) Version ist 1.8.0.10.

Hatte jemand schon einmal dieses Problem oder weiß, wie es zu lösen ist?

(Ich habe auch versucht, alles in eine Zeile zu packen, die Sql in eine separate Datei zu packen, Semikolons zu entfernen, ...)

Jede Hilfe wird sehr geschätzt. Vielen Dank im Voraus!

Wendy.

3voto

JavaLady Punkte 51

Die Definition des Auslösers war nicht ganz korrekt. Die Lösung war eine Mischung aus den gegebenen Antworten:

Aktualisieren Sie die Version von HSQLDB auf 2.2.8, wie von @fredt vorgeschlagen. Ich habe das Erstellungsskript ein wenig geändert:

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

Jetzt gibt es keine Beschwerden mehr über das Semikolon usw.

Vielen Dank für die Hilfe @Adi und @fredt!

Wendy

0voto

Adisesha Punkte 5110

Ändern Sie

SET newrow.VERSION = oldrow.VERSION + 1;

ENDE;

zu

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

SimpleJdbcTestUtils nimmt ';' als Begrenzungszeichen an, wenn es im Skript vorhanden ist. Wenn Sie also eine einzelne Anweisung mit mehreren ';' haben, müssen Sie sicherstellen, dass es keine Zeilenumbruchzeichen gibt( \n ) nach ";".

Ich schlage vor, dass Sie aufgeben SimpleJdbcTestUtils wenn Ihre Anweisungen mehrere ';' enthalten oder wenn Ihr Skript SQL-Kommentare enthält (probieren Sie es einfach aus). Als Alternative prüfen Sie este und ich bevorzuge este Ansatz, wenn es Ihnen nichts ausmacht, eine Ameisenbibliothek hinzuzufügen.

0voto

fredt Punkte 23206

Sie müssen die neueste Version von HSQLDB verwenden (derzeit 2.2.8). Die älteren Versionen unterstützen diese Form von CREATE TRIGGER nicht.

Wenn Sie das HSQLDB jar geändert haben, folgen Sie Adis Empfehlung für die Ausgabe mit ';'.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X