gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:57:56 25 4
gpt4 key购买 nike

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

当前设置

  1. 为我的单元测试创​​建“数据源”:

    db = new EmbeddedDatabaseBuilder()
    .addDefaultScripts()
    .addScript("stored_procedure.sql")
    .build();
  2. “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,根据文档,我认为我做的是正确的。

但是,像这样的讨论:

让我觉得这可能是 HSQLDB 和 Spring 之间的不兼容/由处理分隔符的方式引起的错误。

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

问题

  1. 以前有人见过吗?并提出了解决方案?

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

  3. 这会因为 ResourceDatabasePopulator 而有效地发生吗? ResourceDatabasePopulator 还在 Spring 3.1.1 中造成问题吗?

  4. 还有其他指针/提示吗?

非常感谢您的帮助。

M.


编辑:

结论与解决方案

问题:

  1. ResourceDatabasePopulator 将分号作为查询分隔符处理,不符合 HSQLDB 的语法。

  2. {call GetFooById ?} 是 Sybase(我的生产数据库)的有效语法,但不适用于 HSQLDB,它需要 {call GetFooById(?)} .当然,HSQLDB 语法也不兼容 Sybase 的语法。此外,Spring 的 JdbcTemplate 并没有抽象出这些差异。

解决方案:

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

  2. Spring 的 StoredProcedure 类似乎更便携,可以与 Sybase 和 HSQLDB 一起使用,即使它比 JdbcTemplate 更冗长。

源代码:可在 my GitHub repository 获得.

最佳答案

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

  2. 我使用存储过程和自定义输入/输出对象,仅使用 Java SQL 存储过程 API,并在需要时进行自定义。

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

关于database - 使用 Spring 嵌入式数据库 API 在 HSQLDB 中创建存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10338044/

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