Можем ли мы выполнить некоторые запросы при обходе набора результатов в Java - PullRequest
6 голосов
/ 16 марта 2012

Я пытаюсь реализовать задачу в Java, используя JDBC, как хранимая процедура в SQL.В SQL, когда мы пишем курсор, сначала мы выполняем запрос выбора, а затем извлекаем записи и выполняем некоторые действия.

Вероятно, я запустил запрос выбора в Hive.

sql="SELECT a,c,b FROM tbl_name";
res=stmt.executeQuery();    -----------> CONTAINS 30 RECORDS
while(res.next())
{
     sql="INSERT INTO table .....";
     rs1=stmt.executeQuery();

     sql="SELECT d,e,f FROM table .....";
     rs1=stmt.executeQuery();
     like wise many queries are there.....
.
.
.
..
}

Как мойзапрос select содержит 30 записей, но когда я выполняю его, while (res.next ()) выполняется только один раз.

Но вместо запросов я просто пытаюсь отобразить поле, чтобы проверить, выбирает он или нет, тогда этоработает нормально .. (в то время как цикл содержит только операторы System.out.println)

sql="SELECT * FROM tbl_name";
res=stmt.executeQuery(sql);

while(res.next())
{
   S.O.P.("fields : "+res.getString(0));
}

(Я думаю, что когда происходит пересмотр набора результатов и если между запросами есть, то запросы получают выполненные, но натот же цикл времени также выполняет get и через некоторое время завершает выполнение запросов, в то время как цикл resultset также завершается, и, следовательно, он выполняется один раз. Я не уверен в этом.)

Почему это происходитЯ не получаю.Что-то я делаю не так?

Ответы [ 4 ]

11 голосов
/ 16 марта 2012

Каждый Statement может иметь только один открытый ResultSet одновременно.Из документации:

По умолчанию только один объект ResultSet на объект Statement может быть открыт одновременно.Следовательно, если чтение одного объекта ResultSet чередуется с чтением другого, каждый из них должен быть сгенерирован различными объектами Statement.Все методы выполнения в интерфейсе Statement неявно закрывают текущий объект ResultSet статута, если существует открытый.

Вызовы executeQuery внутри вашего цикла неявно закрывают внешний ResultSet, поэтомуВы видите только один ряд.

2 голосов
/ 16 марта 2012

Я бы реструктурировал ваш поток.Прежде всего, не пытайтесь повторно использовать один и тот же объект Statement для выполнения нового запроса.Когда я пытаюсь сделать это, например, с помощью драйвера PostgreSQL, я с готовностью получаю исключение: «Этот ResultSet закрыт.»

Вместо этого, перепишите его примерно так:Конечно, окружите try-catch-finally по мере необходимости.

0 голосов
/ 16 марта 2012

в идеале вы можете иметь только один оператор, выполняемый в один момент времени для одного соединения с базой данных, чтобы вы могли либо создать и выполнить второй оператор, либо выполнить итерацию по результирующему набору из первого оператора и сохранить данные в коллекции (например, в массиве of hashmap) затем закройте этот оператор и запустите второй, на этот раз извлекая идентификаторы из коллекции, в которой вы их сохранили.

0 голосов
/ 16 марта 2012

Так не бывает, вы можете попробовать, пока ваш запрос не будет выполнен, цикл будет ждать.

...