当前位置: 首页 > 知识库问答 >
问题:

使用Spring嵌入式数据库API在HSQLDB中创建存储过程

潘衡
2023-03-14

我目前正在尝试使用使用Spring创建的内存中HSQLDB实例创建一个测试环境,这要归功于其嵌入式数据库支持:

>

  • 为我的单元测试创建“数据源”:

    db = new EmbeddedDatabaseBuilder()
             .addDefaultScripts()
             .addScript("stored_procedure.sql")
             .build();
    

    “stored_procedure.sql”的内容:

    -- Mock of a more complex stored procedure in production environment
    CREATE PROCEDURE GetFooById(IN fooId VARCHAR(12))
      READS SQL DATA DYNAMIC RESULT SETS 1
      BEGIN ATOMIC
          DECLARE resultSet CURSOR WITHOUT HOLD WITH RETURN FOR SELECT name, value FROM Foos WHERE id = fooId;
          OPEN resultSet; 
      END
    

    我能够初始化我的架构并从“默认脚本”插入我的测试数据,没有任何问题。

    但是,在创建过程时,我看到了如下错误,即使在上面SQL的不同版本之后,有/没有分隔符,并且分隔符在不同位置:

    java.sql.SQLSyntaxErrorException: unexpected end of statement:  required: ;
      at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
      at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
      at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
      at org.hsqldb.jdbc.JDBCStatement.executeUpdate(Unknown Source)
      at org.springframework.jdbc.datasource.init.ResourceDatabasePopulator.executeSqlScript(ResourceDatabasePopulator.java:169)
    

    我正在使用提供HSQLDB 2.2.4的Spring 3.1.1,根据文档,我认为我正在做正确的事情。

    然而,讨论如下:

    • 这一个
    • Spring的JIRA票SPR-8817

    让我觉得可能是HSQLDB和Spring不兼容/分隔符处理方式导致的错误。

    但是我是Spring和HSQLDB的初学者,因此我有下面的问题。

    >

  • 以前有人见过这个吗?并想出了解决方案?

    如果使用{call GetFooById?}调用最终存储过程,那么在HSQLDB中使用select from where查询返回结果集的方法是否等效?

    这可能是因为ResourceDatabase asePopulator而有效地发生的吗?ResourceDatabase asePopulator是否仍在Spring 3.1.1中造成麻烦?

    还有其他指针/提示吗?

    非常感谢你的帮助。

    M

    编辑:

    问题:

    >

  • ResourceDatabasePopulator处理分号作为查询分隔符,这不符合HSQLDB的语法。

    {调用GetFoById?}是赛贝斯(我的生产数据库)的有效语法,但不是HSQLDB的有效语法,后者需要{调用GetFoById(?)}。当然,HSQLDB语法也与赛贝斯的语法不兼容。此外,Spring的Jdbc模板并没有抽象出这些差异。

    解决方案:

    > 使用 Java 存储过程

  • 而不是 SQL 存储过程可能是一种解决方法,因为查询是在 Java 端编写的,不涉及分号分隔符。或者,我想ResourceDatabasePopulator的逻辑可以更改并用于设置嵌入式数据库,但到目前为止我还没有尝试过。

    Spring的Stored

    代码:在我的GitHub存储库中可用。

  • 共有1个答案

    夏兴生
    2023-03-14

    >

  • 对于存储过程和对象类型,您需要关注数据库的JDBC驱动程序。对于存储过程,也用于测试或其他,在数据库中创建一个包,并在未来的测试阶段调用它。

    我使用了存储过程和定制输入/输出对象,只使用了JavaSQL存储过程API,并在需要时进行定制。

    如果您想解释您的背景和案例,我们可以帮助您找到最佳解决方案:-)。

  •  类似资料:
    • 我试图写一个存储过程。通过SQL浏览器创建它很顺利,但是当我把它保存在SQL文件中并通过SQLTool加载它时,它失败了 我收到以下错误 调用SqlTool。objectMain(sqlToolParams); 在哪里 我需要帮助纠正语法。 我试图从他那里得到线索http://hsqldb.org/doc/2.0/util-guide/sqltool-chapt.html#sqltool_raw-

    • 我正在开发一个Rest API,用于从数据库中获取所有主题。我在Derby中使用Spring Boot,并使用JPA与derby进行交互。启动Spring Boot应用程序时,JPA无法在derby上创建表并抛出错误。 第一个类是实体类,第二个是回购类。

    • 问题内容: 因此,我最近才开始学习有关数据库如何工作,如何使用SQL ect的知识。并决定开始在我的Java应用程序(特别是H2数据库)中实现嵌入式数据库,并且在我编写代码的计算机上似乎运行良好。 当我移到另一台计算机上继续进行编码时,我注意到,即使我移植了嵌入式数据库文件(h2-*。jar),我在第一台计算机上创建的所有准备好的表也不在第二台计算机上存在。我以某种方式先入为主,即通过数据库引擎生

    • 问题内容: 我正在尝试调用从pyodbc创建数据库的存储过程 以下是代码的最小示例 理想情况下,该代码应在SQL Server实例中创建一个名为“ Test ”的数据库。这不会产生任何错误。但是没有创建数据库。 跑步 问题答案: Python DB API2.0指定默认情况下,应在禁用自动提交的情况下打开连接。但是,许多数据库要求DDL语句 不在 事务内执行。尝试在禁用自动提交的情况下执行DDL语

    • 我试图在我的内存Hsqldb数据库中设置一个存储过程,用于测试目的。我正在使用的存储过程是在MySql中开发的,所以我想用HSqlDb来设置它,以适应我的测试包 我试图创建一个简化版本的程序,但还没有乐趣。 程序是 我在运行测试时遇到的错误如下

    • 问题内容: 即使对于基于文件的存储,也不希望其他人打开进程中的HSQLDB数据库。 该文档提示这是可能的:服务器模式,高级主题,但是我还没有找到有关如何激活此行为的URL。 有没有人这样做,以便他们可以共享方法? 问题答案: 以下对我有用: 从您的代码启动服务器,该代码显示在HSQLDB源代码的org.hsqldb.test.TestBase代码中。就像是: 在同一个JVM中,以与普通(非服务器)