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存储过程的主要内容,如果未能解决你的问题,请参考以下文章