Синтаксис процедуры создания HSQL не соответствует документации - PullRequest
4 голосов
/ 06 февраля 2012

Я использую HSQL в качестве базы данных для тестирования в памяти для выполнения интеграционных тестов.В производстве у меня есть база данных Oracle 10g.Идея состоит в том, чтобы запустить сценарии создания базы данных, которые я использовал для создания базы данных в oracle для создания той же базы данных в hsql для интеграционных тестов.

Я сталкиваюсь с препятствиями в отношении различий в синтаксисе, которые, несмотря на указаниеВ HSQL синтаксис oracle, я продолжаю зацикливаться на создании хранимых процедур.

Мой тестовый компонент db определен следующим образом:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
    <property name="url" value="jdbc:hsqldb:mem:test;sql.syntax_ora=true"/>
    <property name="username" value="sa"/>
    <property name="password" value=""/>
</bean>
<jdbc:initialize-database data-source="dataSource" ignore-failures="DROPS">
    <jdbc:script location="file:Artifacts/sql/install.sql"/>
    <jdbc:script location="file:Artifacts/sql/patchset/1.0.0.02.create_survey_tables.sql"/>
    <jdbc:script location="file:Artifacts/sql/patchset/1.00.01.update.sql"/>
    <jdbc:script location="file:Artifacts/sql/patchset/1.00.03.insert_surveyQA2.sql"/>
    <jdbc:script location="file:Artifacts/sql/patchset/1.00.05.insert_surveyQA4.sql"/>
</jdbc:initialize-database>

SQL-скрипт, который я запускаю, имеетследующий оператор процедуры создания:

CREATE PROCEDURE reg_create(
    OUT vregID              NUMBER,
    vsessionID              VARCHAR2(254),
    vextrnID                VARCHAR2(100),
    vindivID                VARCHAR2(100),
    vfirstName              VARCHAR2(100),
    vlastName               VARCHAR2(100),
    vemail                  VARCHAR2(320),
    vaddrLine1              VARCHAR2(254),
    vaddrLine2              VARCHAR2(254),
    vcity                   VARCHAR2(100),
    vstate                  VARCHAR2(2),
    vzipCode                VARCHAR2(5),
    vdiagnosed              NUMBER,
    vrelationship           NUMBER,
    vpatientFirstName       VARCHAR2(100),
    vpatientLastName        VARCHAR2(100),
    vbirthdate              DATE,
    vtreatment              NUMBER,
    vcfCenter               NUMBER,
    vofflineMaterial        NUMBER,
    vmoc                    VARCHAR2(100),
    voptIn                  NUMBER,
    vcreateDate             DATE,
    vpendingSend            NUMBER)
MODIFIES SQL DATA
BEGIN  ATOMIC
DECLARE vregID NUMBER;
SET vregID = (SELECT NVL(MAX(REG_ID), 0)+1 FROM CFLIVING_REG);
INSERT INTO REG( REG_ID, SESSION_ID, EXTRN_ID, INDIV_ID, FIRST_NAME, LAST_NAME, EMAIL, ADDR_LINE1, ADDR_LINE2,  CITY,
    STATE, ZIP_CODE, DIAGNOSED, RELATIONSHIP, PATIENT_FIRST_NAME, PATIENT_LAST_NAME, BIRTHDATE, 
    TREATMENT, CF_CENTER, OFFLINE_MATERIAL, MOC, OPT_IN, CREATE_DATE, PENDING_SEND )
    VALUES (vregID, vsessionID, vextrnID, vindivID, vfirstName, vlastName, vemail, vaddrLine1, vaddrLine2, vcity, vstate,
    vzipCode, vdiagnosed, vrelationship, vpatientFirstName, vpatientLastName, vbirthdate,
    vtreatment, vcfCenter, vofflineMaterial, vmoc, voptIn, vcreateDate, vpendingSend);
END

И когда я запускаю тест, HSQL дает сбой из-за следующего:

Caused by: org.springframework.jdbc.datasource.init.ScriptStatementFailedException:   Failed to execute SQL script statement at line 18 of resource URL [file:Artifacts/sql/install.sql]:  CREATE PROCEDURE cfliving_reg_create(         OUT vregID       NUMBER,   vsessionID    VARCHAR2(254),   vextrnID    VARCHAR2(100),   vindivID    VARCHAR2(100),   vfirstName    VARCHAR2(100),   vlastName    VARCHAR2(100),   vemail     VARCHAR2(320),   vaddrLine1    VARCHAR2(254),   vaddrLine2    VARCHAR2(254),   vcity     VARCHAR2(100),   vstate     VARCHAR2(2),   vzipCode    VARCHAR2(5),   vdiagnosed    NUMBER,   vrelationship   NUMBER,   vpatientFirstName  VARCHAR2(100),   vpatientLastName  VARCHAR2(100),   vbirthdate    DATE,   vtreatment    NUMBER,   vcfCenter    NUMBER,   vofflineMaterial  NUMBER,   vmoc     VARCHAR2(100),   voptIn     NUMBER,   vcreateDate    DATE,   vpendingSend   NUMBER) MODIFIES SQL DATA BEGIN  ATOMIC     DECLARE vregID NUMBER

Caused by: java.sql.SQLSyntaxErrorException: unexpected end of statement:  required: ;

Документация на сайте HSQL: http://hsqldb.org/doc/2.0/guide/sqlroutines-chapt.html указываетчто мой синтаксис правильный, поэтому я не совсем понимаю, в чем заключается настоящая проблема.

есть идеи?

Ответы [ 2 ]

2 голосов
/ 13 февраля 2012

Я решил это следующим образом:

    <jdbc:initialize-database data-source="dataSource" ignore-failures="DROPS">
    <jdbc:script location="file:Artifacts/Hsql Version Scripts/install/droptables.sql" separator=";"/>
    <jdbc:script location="file:Artifacts/Hsql Version Scripts/install/install.sql" separator="/;"/>
    <jdbc:script location="file:Artifacts/Hsql Version Scripts/patchset/1.0.0.02.create_survey_tables.sql"
                 separator="/;"/>
    <jdbc:script location="file:Artifacts/Hsql Version Scripts/patchset/1.00.01.update.sql" separator=";"/>
    <jdbc:script location="file:Artifacts/Hsql Version Scripts/patchset/1.00.03.insert_surveyQA2.sql"
                 separator=";"/>
    <jdbc:script location="file:Artifacts/Hsql Version Scripts/patchset/1.00.05.insert_surveyQA4.sql"
                 separator=";"/>
</jdbc:initialize-database>

Я могу указать разделитель в файлах скриптов.Поэтому я использовал другой разделитель /;в файлах сценариев, в которых были созданы операторы процедур;разделенные команды.

0 голосов
/ 18 сентября 2018
1. Terminate each of the SQL statements (insert, create, select etc)
    within the script (some_script.sql) with /;

2. Whilst configuring in Spring - add the following:

   return new EmbeddedDatabaseBuilder()
    .setType("HSQL")
    .setName("DBNAME")
    .addScript("some_script.sql")
    .setSeparator("/;")
    .build();
...