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()returns 错误)。
注意 - 我用于测试的 createdata.sql 文件创建 jobs_table 并用 6 行数据填充它。所以 table 应该有数据。
Spring 代码看起来不适合 HSQLDB 过程。它可能适用于 returns a table.
的函数
将过程更改为 FUNCTION 和 return 包含数据的 table。
或者,使用该过程,但在调用它之后,在调用 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);
其中目录是包名称。因此,如果您的存储过程是 accounts.get_all_expired_accounts,那么 catalog="accounts" & query="get_all_expired_accounts"。
我在 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()returns 错误)。
注意 - 我用于测试的 createdata.sql 文件创建 jobs_table 并用 6 行数据填充它。所以 table 应该有数据。
Spring 代码看起来不适合 HSQLDB 过程。它可能适用于 returns a table.
的函数将过程更改为 FUNCTION 和 return 包含数据的 table。
或者,使用该过程,但在调用它之后,在调用 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);
其中目录是包名称。因此,如果您的存储过程是 accounts.get_all_expired_accounts,那么 catalog="accounts" & query="get_all_expired_accounts"。