【发布时间】:2012-02-27 17:54:06
【问题描述】:
我使用 HSQL 作为我的内存测试数据库来运行集成测试。 在生产中,我有一个 oracle 10g 数据库。这个想法是运行我用来在 oracle 中创建数据库的 db create 脚本,以便在 hsql 中为集成测试创建相同的数据库。
我在语法差异方面遇到了障碍,尽管向 HSQL 表明语法是 oracle,但我仍然在创建存储过程时陷入困境。
我的测试 db bean 是这样定义的:
<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 表明我的语法是正确的,所以我对实际问题是什么感到困惑。
有什么想法吗?
【问题讨论】:
-
我不知道 Spring,但如果您需要判断是否忽略
;语句分隔符,我不会感到惊讶。我怀疑 Spring 只会将所有内容发送到第一个;,这会导致语法无效。您是否尝试使用“普通”SQL 工具运行此创建语句? -
我认为你是对的。春天好像有问题。 spring bug 8817spring bug 8884
标签: sql spring-mvc hsqldb