2014-01-14 4 views
1

Мне нужно вызвать хранимую процедуру несколько раз и использовать для этого executeBatch(). Каждый вызов должен возвращать таблицу с результатами, но я не смог получить доступ к этим результатам. Следующий код работает отлично:Извлечь ResultSet с помощью CallableStatement после executeBatch()

callableStatement.setString(1, "foo"); 
callableStatement.setString(2, "bar"); 
callableStatement.execute(); 
resultSet = callableStatement.getResultSet(); 

Но следующий код не работает, как ожидалось:

for (String str : strings) { 
    callableStatement.setString(1, str); 
    callableStatement.setString(2, "bar"); 
    callableStatement.addBatch(); 
} 
callableStatement.executeBatch(); 
resultSet = callableStatement.getResultSet(); // returns null 

Я уже пытался позвонить callableStatement.getUpdateCount() и callableStatement.getMoreResults() перед извлечением ResultSet, но безуспешно.

+0

Если ваш var является 'callableStatement' или' cs'? Я предполагаю, что ваш фактический код выглядит не так? Если да, это твоя проблема! – wmorrison365

+0

@ wmorrison365, конечно, это была опечатка. Это не фактический код, но достаточно выяснить разницу между двумя подходами, которые я использую. – bsiamionau

ответ

4

Это не правильное использование #executeBatch. Пакетные методы предназначены для обработки данных, а для получения данных результата. То есть вы можете выполнять пакетные вставки/обновления/удаления, но не читать. Результатом #executeBatch является подсчет обновлений, указывающий, сколько изменений было внесено за каждую операцию с пакетом.

Целью является то, что вы можете повысить производительность за счет сокращения сетевых накладных расходов и базы данных в обоих направлениях для подобных операций манипулирования данными.

Обычно вы не выполняете запросы в пакетном режиме, потому что разные запросы приведут к различной форме ResultSet (если они не все для одной таблицы с одинаковыми столбцами, но с другим запросом [но тогда почему бы просто не изменить ваш запрос]).

+0

Благодарим вас за ответ. Какие обходные пути вы видите в такой ситуации? Делать отдельные вызовы и читать результаты после каждого? – bsiamionau

+0

@zvdh Это не обходной путь, это единственное реальное решение. –

+0

Да, используйте отдельные вызовы и читайте результаты после каждого ... или, если все запросы находятся в одной и той же таблице/столбцах, вы можете изменить предложение where, чтобы добавить больше результатов в результат (в вашем proc) или параметризовать вашу proc взять массив или ассоциативный массив, чтобы позволить ему принимать несколько возможных значений? Подумайте, может ли это повлиять на производительность, если мы говорим о больших ResultSet или вам нужно будет изменить ваши индексы. – wmorrison365

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