2012-07-16 17 views
6

私は単体テストにhsqldbを使用します。私の生産はOracle 11G Dbを使用しています。 私は上記のように、私の起動スクリプトを実行すると:HsqlDBのトリガー構文:予期しない。

<jdbc:embedded-database id="dataSource" type="HSQL"> 
</jdbc:embedded-database> 

<jdbc:initialize-database data-source="dataSource" ignore-failures="DROPS"> 
    <jdbc:script location="classpath:/sql/init-cct-schema.sql" separator=";" /> 
    <jdbc:script location="classpath:/sql/init-cct-insert.sql" separator=";" /> 
</jdbc:initialize-database> 

を私は本当にHSQL docsでかなりのトリガの例です。

私はthis postを参照してください: しかし、彼のソリューションは私のためには機能しません、または私はそれを理解していません。

私はいつもこのエラーを持っている:ここでは

java.lang.IllegalStateException: Failed to load ApplicationContext 
    at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:157) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109) 
    at 
... 
    ... 38 more 
Caused by: org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement at line 9 of resource class path resource [sql/init-cct-schema.sql]: CREATE TRIGGER TI_TYPE_MVT BEFORE INSERT ON TYPE_MVT  REFERENCING NEW AS newrow FOR EACH ROW  BEGIN ATOMIC  IF newrow.TYPE_MVT_PK is null THEN   SET newrow.TYPE_MVT_PK = SQ_TYPE_MVT.nextval 
    at org.springframework.jdbc.datasource.init.ResourceDatabasePopulator.executeSqlScript(ResourceDatabasePopulator.java:199) 
    at org.springframework.jdbc.datasource.init.ResourceDatabasePopulator.populate(ResourceDatabasePopulator.java:132) 
    at org.springframework.jdbc.datasource.init.CompositeDatabasePopulator.populate(CompositeDatabasePopulator.java:55) 
    at org.springframework.jdbc.datasource.init.DatabasePopulatorUtils.execute(DatabasePopulatorUtils.java:45) 
    ... 41 more 
Caused by: java.sql.SQLSyntaxErrorException: unexpected end of statement: required: ; 
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source) 
    at org.hsqldb.jdbc.JDBCStatement.execute(Unknown Source) 
    at org.springframework.jdbc.datasource.init.ResourceDatabasePopulator.executeSqlScript(ResourceDatabasePopulator.java:184) 
    ... 44 more 
Caused by: org.hsqldb.HsqlException: unexpected end of statement: required: ; 
    at org.hsqldb.error.Error.parseError(Unknown Source) 

は私のトリガーです:

SET DATABASE SQL SYNTAX ORA TRUE;  
CREATE TRIGGER TI_TYPE_MVT BEFORE INSERT ON TYPE_MVT 
     REFERENCING NEW AS newrow FOR EACH ROW 
     BEGIN ATOMIC 
      IF newrow.TYPE_MVT_PK is null THEN 
      SET newrow.TYPE_MVT_PK = SQ_TYPE_MVT.nextval; 
      END IF; 
     END; 

私は最終せずにしてみてください ';'それは失敗し続けます。ここで

HSQLに私の依存性である:

<dependency> 
    <groupId>org.hsqldb</groupId> 
    <artifactId>hsqldb</artifactId> 
    <version>2.2.8</version> 
</dependency> 

任意のアイデアは?

答えて

10

リンクHSQL Create Procedure Syntax doesn't seem to match the documentation溶液は、構成のこの行である:デフォルト

<jdbc:script location="file:Artifacts/Hsql Version Scripts/install/install.sql" separator="/;"/> 

、スプリングスクリプトによって使用されるセパレータはセミコロンです。つまり、トリガ定義内の最初のセミコロンに達すると、不完全な定義がHSQLDBに送信されます(エラーが発生します)。上記の設定行を使用すると、デフォルトの区切り文字が2文字の "/;"に変更されます。特別な構成を使用する場合は、各トリガー定義の作成の最後にこの区切り文字を持つようにスクリプトを変更する必要があります。セミコロンはそのままトリガー定義本体の内部に置いてください。

+0

説明していただきありがとうございます。 – Duff

関連する問題