2016-02-23 4 views
0

У меня есть следующие хранимые процедуры в MySQLMySQL StoredProcedure против HSQLDB StoredProcedure

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 Framework код, который выполняет хранимую процедуру

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, отлично работает, однако, когда я выполняю sa me code from hsqldb Я получаю пустой набор результатов (rs.next() возвращает false).

Примечание. Файл createdata.sql, который я использую для тестирования, создает таблицу jobs_table и заполняет ее также шестью строками данных. Таким образом, таблица должна иметь данные.

ответ

0

Хотя ниже код не работал только для хранимой процедуры 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, тогда каталог = "учетные записи" & query = "get_all_expired_accounts".

0

Код Spring не подходит для процедур HSQLDB. Это, вероятно, будет работать для функции, которая возвращает таблицу.

Измените процедуру на FUNCTION и верните таблицу, содержащую данные.

В качестве альтернативы используйте эту процедуру, но после ее вызова выполните getMoreResults() перед вызовом процесса (ResultSet rs).

Смежные вопросы