首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hsqldb存储过程

Hsqldb存储过程
EN

Stack Overflow用户
提问于 2015-02-24 18:50:36
回答 3查看 6.7K关注 0票数 4

为了测试目的,我试图在内存中的Hsqldb数据库中设置一个存储过程。我正在使用的存储的proc是用MySql开发的,所以我想用HSqlDb来设置它,以适应我的测试套件。

我试图创建一个简化版本的程序,但目前还没有joy。

程序是

代码语言:javascript
复制
     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;

运行测试时遇到的错误如下所示

代码语言:javascript
复制
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: ;
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-24 19:03:41

END IFEND之后不需要分号。错误信息有点误导。

编辑您还可能需要加倍分号在您的CREATE PROCEDURE...文本,因为Spring本身认为分号也是语句分隔符。

票数 0
EN

Stack Overflow用户

发布于 2015-02-25 12:06:50

由于下面的堆栈溢出链接HSQL Create Procedure Syntax doesn't seem to match the documentation,我终于得到了答案

为了完整起见,这就是我所做的

  1. 我将我的hsqldb sql代码分离成2个文件。1只使用create表和数据语法,另一种使用存储过程
  2. 在加载此文件时,我能够指定要使用的分隔符。 。如前所述,Spring将分号作为语句的结尾,因此我可以为存储的procs文件指定一个不同的分隔符。
  3. 更新了我的存储过程以使用新的分隔符,现在一切都按预期工作。 创建过程p_recordTaskExecution(IN userTaskId BIGINT,IN isSuccess BOOLEAN,IN statusMessage VARCHAR(2000),IN operationsPerformed BIGINT,INOUT procedureStatus BOOLEAN)如果userTaskId =1,则设置procedureStatus = true;否则设置procedureStatus = false;结束IF;END;/;
票数 3
EN

Stack Overflow用户

发布于 2016-07-27 08:15:57

它与指定的@达摩相同,但避免了XML配置。

代码语言:javascript
复制
ScriptUtils.executeSqlScript(ds.getConnection(),  new EncodedResource(
                new InputStreamResource(getClass().getClassLoader().getSystemResourceAsStream("procs.sql"))
                ), false, false, "--", "/;", "--", "--");

这是方法签名:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28703866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档