2015-02-24 66 views
4

我想在我的內存Hsqldb數據庫中設置一個存儲過程用於測試目的。我正在使用的存儲過程是在MySql中開發的,因此我想使用HSqlDb進行設置以適應我的測試套件。Hsqldb存儲過程

我正在嘗試創建過程的簡化版本,但至今尚無樂趣。

的過程

 CREATE PROCEDURE p_recordTaskExecution(IN userTaskId INT, IN isSuccess BOOLEAN, IN statusMessage VARCHAR(2000), IN operationsPerformed INT, INOUT procedureStatus BOOLEAN) 
    BEGIN ATOMIC 
    IF userTaskId = 1 Then 
     set procedureStatus = true; 

    ELSE 
    set procedureStatus = false; 

    END IF; 

    END; 

運行我的測試時,我得到的錯誤如下

Caused by: org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement at line 3 of resource class path resource [databaseTesting/inMemory/createInMemoryDatabase.sql]: CREATE PROCEDURE p_recordTaskExecution(IN userTaskId INT, IN isSuccess BOOLEAN, IN statusMessage VARCHAR(2000), IN operationsPerformed INT, INOUT procedureStatus BOOLEAN) BEGIN ATOMIC if userTaskId = 1 Then set procedureStatus = true; nested exception is java.sql.SQLSyntaxErrorException: unexpected end of statement: required: ; 
    at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:475) 
    at org.springframework.jdbc.datasource.init.ResourceDatabasePopulator.populate(ResourceDatabasePopulator.java:229) 
    at org.springframework.jdbc.datasource.init.CompositeDatabasePopulator.populate(CompositeDatabasePopulator.java:60) 
    at org.springframework.jdbc.datasource.init.DatabasePopulatorUtils.execute(DatabasePopulatorUtils.java:48) 
    at org.springframework.jdbc.datasource.init.DataSourceInitializer.execute(DataSourceInitializer.java:108) 
    at org.springframework.jdbc.datasource.init.DataSourceInitializer.afterPropertiesSet(DataSourceInitializer.java:93) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1625) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1562) 
    ... 40 more 
Caused by: java.sql.SQLSyntaxErrorException: unexpected end of statement: required: ; 
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source) 
    at org.hsqldb.jdbc.JDBCStatement.execute(Unknown Source) 
    at com.jolbox.bonecp.StatementHandle.execute(StatementHandle.java:254) 
    at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:460) 
    ... 47 more 
Caused by: org.hsqldb.HsqlException: unexpected end of statement: required: ; 

回答

0

你不需要END IFEND後一個分號。錯誤信息有點誤導。

編輯 您可能還需要從Spring本身認爲分號是語句分隔符,以及以分號在CREATE PROCEDURE...文字一倍。

+0

不幸的是,它仍然給出了同樣的錯誤 – Damien 2015-02-24 21:13:58

+1

你好,請檢查是否在這裏http://ahexamples.blogspot.com/給出的解決方案2014/05/example-of-junit-hsqldb-sproc-call.html幫助。您可能需要在CREATE PROCEDURE語句中將分號加倍。 – mazaneicha 2015-02-24 22:41:19

+2

問題在於Spring在第一個分號處裁剪程序文本。使用Spring時,有一種逃避機制可以逃脫分號。做一個這樣的搜索。 – fredt 2015-02-24 22:41:22

2

我終於得到了答案感謝以下鏈接計算器 HSQL Create Procedure Syntax doesn't seem to match the documentation

爲了完整這裏是我做過什麼

  1. 我分離出來我的HSQLDB的SQL代碼到2個文件。 1只create table和數據的語法和其他與存儲過程

  2. 當這個文件裝載我能夠指定分隔符使用

    <jdbc:initialize-database data-source="mctDBDataSource" ignore-failures="DROPS" > 
        <jdbc:script location="classpath:databaseTesting/inMemory/createInMemoryDatabase.sql" separator=";"/> 
        <jdbc:script location="classpath:databaseTesting/inMemory/createInMemoryDatabaseProcedures.sql" separator="/;"/> 
    </jdbc:initialize-database> 
    

    。正如前面指出的那樣,春季治療分半結腸;作爲語句的結束,所以我能夠指定一個不同的分隔符來使用我的存儲特效文件

  3. 更新我的存儲過程使用新的分隔符,現在一切都按預期

    CREATE PROCEDURE p_recordTaskExecution(IN userTaskId BIGINT, IN isSuccess BOOLEAN, IN statusMessage VARCHAR(2000), IN operationsPerformed BIGINT, INOUT procedureStatus BOOLEAN) 
    BEGIN ATOMIC 
        IF userTaskId = 1 Then 
         SET procedureStatus = true; 
        ELSE 
         SET procedureStatus = false; 
        END IF; 
    END; 
    /; 
    
+0

我需要在java代碼中執行第2步。 2具有不同分隔符的EmbeddedDatabaseBuilder需要組合成一個數據源。你能幫忙嗎? – 2017-07-05 15:22:39

0

這一個是相同的一個@Damo指定但避免XML配置。

ScriptUtils.executeSqlScript(ds.getConnection(), new EncodedResource(
       new InputStreamResource(getClass().getClassLoader().getSystemResourceAsStream("procs.sql")) 
       ), false, false, "--", "/;", "--", "--"); 

這是方法簽名:

void org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(Connection connection, EncodedResource resource, boolean continueOnError, boolean ignoreFailedDrops, String commentPrefix, String separator, String blockCommentStartDelimiter, String blockCommentEndDelimiter) throws ScriptException 
與變化