gpt4 book ai didi

sql - HSQL Create Procedure Syntax 似乎与文档不匹配

转载 作者:行者123 更新时间:2023-12-03 18:18:05 28 4
gpt4 key购买 nike

我使用 HSQL 作为我的内存测试数据库来运行集成测试。
在生产中,我有一个 oracle 10g 数据库。这个想法是运行我用来在 oracle 中创建 db 的 db create 脚本,以在 hsql 中为集成测试创建相同的 db。

我遇到了关于语法差异的障碍,尽管向 HSQL 表明该语法是 oracle,但我仍然坚持创建存储过程。

我的测试数据库 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
表明我的语法是正确的,所以我对实际问题是什么感到困惑。

有任何想法吗?

最佳答案

我解决这个问题的方法如下:

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

我可以在脚本文件中指定分隔符。所以我使用了不同的分隔符/;在具有创建过程语句的脚本文件中;分开的命令。

关于sql - HSQL Create Procedure Syntax 似乎与文档不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9157027/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com