mysql存储过程与hsqldb存储过程

Posted

技术标签:

【中文标题】mysql存储过程与hsqldb存储过程【英文标题】:mysql storedprocedure vs hsqldb storedprocedure 【发布时间】:2016-02-23 22:04:06 【问题描述】:

我在mysql中有如下存储过程

DELIMITER $$
CREATE DEFINER=`user`@`%` PROCEDURE `sp_getJobs`()
BEGIN
SELECT * FROM jobs_table;
END$$
DELIMITER ;

以及在 hsqldb 中定义的以下内容(用于单元测试)

CREATE PROCEDURE sp_getJobs() READS SQL DATA
    DYNAMIC RESULT SETS 1
    BEGIN ATOMIC
       DECLARE result CURSOR WITH RETURN FOR SELECT * FROM jobs_table FOR READ ONLY;
       OPEN result;
     END

执行存储过程的Spring框架代码

query = "Call sp_getJobs"; //This is used when MySql is database
query = "Call sp_getJobs()"; //This is used when HsqlDb is used in testing
getJdbcTemplate().query(query, rs -> 
        process(rs);
        return null;
      );

private void process(ResultSet rs) 
    while (rs.next()) 
        //do something
    

执行 mysql 的 spring 代码工作正常,但是,当我对 hsqldb 执行相同的代码时,我得到一个空结果集(rs.next() 返回 false)。

注意 - 我用于测试的 createdata.sql 文件创建了 jobs_table 并使用 6 行数据填充它。所以表应该有数据。

【问题讨论】:

【参考方案1】:

Spring 代码看起来不适合 HSQLDB 过程。它可能适用于返回表的函数。

将过程更改为 FUNCTION 并返回包含数据的表。

或者,使用该过程,但在调用它之后,在 process(ResultSet rs) 调用之前执行 getMoreResults()。

【讨论】:

【参考方案2】:

虽然下面的代码仅适用于问题中列出的 hsqldb 存储过程

getJdbcTemplate().query(query, rs -> 
        process(rs);
        return null;
      );

private void process(ResultSet rs) 
    while (rs.next()) 
        //do something
    

下面的代码适用于所有这些 - mysql、sqlserver、informix 和 hsqldb

SimpleJdbcCall simpleJdbcCall =
      new SimpleJdbcCall(getJdbcTemplate().getDataSource())
        .withCatalogName(catalog)
        .withProcedureName(query);

其中 catalog 是包名。所以,如果你的存储过程是accounts.get_all_expired_accounts 那么catalog="accounts" & query="get_all_expired_accounts"。

【讨论】:

以上是关于mysql存储过程与hsqldb存储过程的主要内容,如果未能解决你的问题,请参考以下文章

通过 SQL 工具运行的 HSQLDB 存储过程抛出扫描仪错误

MySQL数据库之存储过程与存储函数

mysql 存储过程与存储函数

mysql存储过程与事务

争议?MySQL存储过程与函数,封装,体,完整详细可收藏

mysql 与oracle中的存储过程及函数有啥区别,尽可能详细哦