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

mysql存储过程与hsqldb存储过程
EN

Stack Overflow用户
提问于 2016-02-23 22:04:06
回答 2查看 251关注 0票数 0

我在mysql中有以下存储过程

代码语言:javascript
复制
DELIMITER $$
CREATE DEFINER=`user`@`%` PROCEDURE `sp_getJobs`()
BEGIN
SELECT * FROM jobs_table;
END$$
DELIMITER ;

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

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

代码语言:javascript
复制
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行数据填充它。所以表应该有数据。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-24 15:23:03

虽然下面的代码不适用于所列的hsqldb存储过程

代码语言:javascript
复制
getJdbcTemplate().query(query, rs -> {
        process(rs);
        return null;
      });

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

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

代码语言:javascript
复制
SimpleJdbcCall simpleJdbcCall =
      new SimpleJdbcCall(getJdbcTemplate().getDataSource())
        .withCatalogName(catalog)
        .withProcedureName(query);

其中目录是包名。因此,如果您的存储过程是accounts.get_all_expired_accounts,那么catalog="accounts“& query="get_all_expired_accounts”。

票数 0
EN

Stack Overflow用户

发布于 2016-02-23 22:38:09

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35589167

复制
相关文章

相似问题

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