Временные таблицы с использованием JDBC с нулевым ResultSet - PullRequest
5 голосов
/ 18 января 2011

Я выполняю хранимую процедуру через стандартное JDBC-соединение с использованием MS SQL Driver version 3.0 .

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

Код Java не будет генерировать исключение, но javax.sql.ResultSet будет null.

Точка сбоя в хранимой процедуре - когда я отменяю комментарий INSERT INTO #TBL CLM_NAME VALUES('VAL')

Когда я выполняю инструкцию, используя SQL Studio Manager , она выполняется без хлопот и данных, как и ожидалось.

Кто-нибудь сталкивался с этим или знает, почему это так?

Первоначально я думал, что это из-за драйвера SQL, и я все еще думаю, что это так? Спасибо.

Ответы [ 3 ]

13 голосов
/ 28 февраля 2011

Может быть это поможет :

Рекомендуется, чтобы, если вы хотите использовать временные таблицы, вы не должны вызывать «prepareStatement». Вы можете напрямую выполнить запрос из объекта оператора.

Например:

String sql = "select uuid, name from Component";

Statement stmt = dbCon.createStatement();
ResultSet rs = stmt.executeQuery(sql);

Если вам необходимо вызвать «prepareStatement», вам нужно будет создать реальную таблицу и, если необходимо, впоследствии удалить ее.

6 голосов
/ 24 июля 2013

executeQuery () предназначен для использования с запросами, которые возвращают ResultSet, обычно это операторы SELECT.

executeUpdate () предназначен для операторов INSERT, UPDATE, DELETE или DDL, которые возвращают количество обновлений.

Оба из вышеперечисленных (ResultSets и количество обновлений) рассматриваются JDBC как "результаты".Для запросов, которые возвращают несколько результатов, это требует, мы вызываем execute ().

Если хранимая процедура использует временные таблицы, вероятно, сначала она возвращает счетчик обновлений, а затем ResultSet.Вы должны использовать execute () для запуска запроса, вызвать getMoreResults (), чтобы пропустить счетчик обновлений, а затем вызвать getResultSet (), чтобы получить ResultSet, который вы хотите .Проблема здесь в том, что мы должны делать метод проб и ошибок, вызывая getMoreResults () несколько раз, чтобы получить нужный набор результатов, вызывая getResultSet ().

Вместо описанного выше метода проб и ошибок, вы можете подавить вседополнительные "результаты запроса", указав " SET NOCOUNT ON ".

Требуются изменения,

  1. Поместите свою логику в SP "SPCHILD".Эта хранимая процедура будет иметь логику вместе с созданием временной таблицы.

  2. Создайте SP "SPPARENT", как показано ниже,

     CREATE PROCEDURE [dbo].[SPPARENT]    @Id int = NULL
     AS
     BEGIN
     SET NOCOUNT ON;
     EXEC(' SPCHILD @Id = ' + @Id)
     END
    

    Из родительского SP "SPPARENT" у вас естьдля вызова вашего действующего SP, т.е. «SPCHILD».

  3. Из вашего кода JDBC выполните вызов SP для «SPPARENT».

2 голосов
/ 03 марта 2011

У меня тоже такая же проблема.Чтобы это исправить, я собираюсь настроить трассировку на моем сервере sql и увидеть все операторы, выполняемые драйвером MS JDBC, перед выполнением фактического вызова SP.Это должно помочь мне прояснить ситуацию.К сожалению, наша DBA сегодня отсутствует, поэтому мне придется сделать это завтра с ее помощью.Я дам вам знать, что происходит и что за починка.

...