2015-02-24 1 views
4

Я пытаюсь настроить хранимую процедуру в своей базе данных Hsqldb в памяти для целей тестирования. Сохраненный proc, с которого я работаю, разработан в 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 IF и END. Сообщение об ошибке немного вводит в заблуждение.

EDIT Вам также может понадобиться, чтобы удвоить запятую в вашем CREATE PROCEDURE... тексте, так как сама весна рассматривает точку с запятой быть разделитель операторов, а также.

+0

, к сожалению, с этим изменением, она по-прежнему дает ту же ошибку – Damien

+1

Привет, пожалуйста, проверьте, если решение дано здесь http://ahexamples.blogspot.com/ 2014/05/example-of-junit-hsqldb-sproc-call.html помогает. Возможно, вам понадобится удвоить точки с запятой в инструкции CREATE PROCEDURE. – mazaneicha

+2

Проблема с Spring, которая сокращает текст процедуры в первой точке с запятой. Существует механизм эвакуации для выхода из точки с запятой при использовании Spring. Сделайте поиск по этому вопросу. – fredt

2

я, наконец, получил ответ благодаря следующему StackOverflow ссылке HSQL Create Procedure Syntax doesn't seem to match the documentation

Для полноты вот что я сделал

  1. Я отделил мой HSQLDB код SQL в 2 файлах. 1 с просто создать таблицу и синтаксис данных, а другой с хранимыми процедурами

  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

Мне нужно сделать шаг 2 в Java-коде. 2 EmbeddedDatabaseBuilder с разными разделителями необходимо объединить в один источник данных. может помочь? –

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