繁体   English   中英

MySQL存储过程与hsqldb存储过程

[英]mysql storedprocedure vs hsqldb storedprocedure

我在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行数据填充它。 因此该表应具有数据。

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

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

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

虽然下面的代码仅对所列出的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是软件包名称。 因此,如果您的存储过程是例如account.get_all_expired_accounts,则商品目录=“ accounts”&query =“ get_all_expired_accounts”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM