PreparedStatement.execute () возвращает false, даже если в SQL-сервере есть набор результатов? - PullRequest
0 голосов
/ 02 января 2019

Мой SQL-запрос состоит из 5 частей, которые тесно связаны друг с другом. Первая часть создает временную таблицу, вторая часть использует эту временную таблицу и создает другую временную таблицу, третья часть использует временную таблицу, созданную во второй части, и снова создает другую временную таблицу. А 4-я часть выбирает некоторые данные из 3-й временной таблицы, а 5-я часть выбирает счет 3-й временной таблицы.

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

Таким образом, первая 3-я часть создает временные таблицы, поэтому после установки параметров в readyStatement я запускаю preparedStatement.execute() 3 раза (я тоже пробовал 1 .... x раз), а затем я запускаю prepareStatement.execute (), но он возвращает false, что означает, что нет никакого набора результатов. Это почему?

PreparedStatement preparedStatement = conn.prepareStatement("select * into #tmp from tablex where ...\n" +
                "    select * into #tmp2 from #tmp where ...\n" +
                "    select * into #tmp3 from #tmp2 where ...\n" +
                "    select * from #tmp3\n" +
                "    select count(*) from #tmp3");

Выше я добавил простую иллюстрацию. Здесь мне нужно получить результат 4-го и 5-го запроса с подготовленным оператором. Как я могу это сделать?

1 Ответ

0 голосов
/ 02 января 2019

Операторы, которые вы выполняете, дают следующие результаты:

  1. Количество обновлений
  2. Количество обновлений
  3. Количество обновлений
  4. Набор результатов
  5. Набор результатов

Значение логического значения false, возвращаемого execute(String), равно:

true, если первый результат - ResultSet объект; false если это счетчик обновлений или нет результатов

Это означает, что вам нужно использовать getUpdateCount() для получения (первого) счетчика обновлений и getMoreResults() для получения следующего результата (опять же, это возвращает логическое значение с тем же значением). Только если execute() или getMoreResults() вернет false и getUpdateCount() вернет -1, результатов больше не будет.

Вам нужно сделать что-то вроде:

boolean nextResultSet = statement.execute(...);
int resultSetCount = 0;
while (true) {
  if (nextResultSet) {
    resultSetCount++;
    try (ResultSet rs = statement.getResultSet()) {
      // Do something with result set
    }
  } else {
    int updateCount = statement.getUpdateCount();
    if (updateCount == -1) {
      // no more results
      break;
    }
    // do something with update count
  }
  nextResultSet = statement.getMoreResults();
}

Вероятно, вы можете пропустить часть этой сложности, добавив SET NOCOUNT ON в качестве первого выполняемого вами оператора; тогда вы не получите счетчик обновлений, и вам нужно будет обработать только два набора результатов.

...