2012-07-16 27 views
6

Tôi sử dụng hsqldb cho các bài kiểm tra đơn vị của mình. Sản xuất của tôi sử dụng Oracle 11G Db. Khi tôi chạy kịch bản bắt đầu của tôi như trên:Cú pháp kích hoạt trên HsqlDB: dự kiến;

<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> 

Tôi thực sự khá ví dụ kích hoạt trong HSQL docs.

Tôi thấy this post: Nhưng giải pháp của anh ấy không hiệu quả đối với tôi hoặc tôi không hiểu.

Tôi có luôn lỗi này:

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) 

Dưới đây là kích hoạt của tôi:

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; 

tôi cố gắng mà không có thức ';' , nó tiếp tục thất bại.

Đây là dependancy của tôi trên HSQL:

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

bất kỳ ý tưởng?

Trả lời

10

Các giải pháp trong liên kết HSQL Create Procedure Syntax doesn't seem to match the documentation là phù hợp cấu hình này:

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

Theo mặc định, tách được sử dụng bởi các kịch bản Mùa xuân là dấu chấm phẩy. Điều này có nghĩa là khi dấu chấm phẩy đầu tiên bên trong định nghĩa kích hoạt đạt được, định nghĩa không đầy đủ được gửi đến HSQLDB (dẫn đến lỗi). Khi bạn sử dụng dòng cấu hình ở trên, nó sẽ thay đổi dấu phân cách mặc định thành hai ký tự "/;". Sử dụng cấu hình đặc biệt, bạn cần sửa đổi tập lệnh của mình để có dấu phân cách này ở cuối mỗi định nghĩa trình kích hoạt tạo. Để lại dấu chấm phẩy bên trong thân xác định kích hoạt như chúng.

+0

Nhờ giải thích, tốt hơn một chút, bài đăng này. – Duff

Các vấn đề liên quan