2015-12-26 3 views
4

Я работаю над приложением, в котором я использую JDBC и Oracle11.ORACLE JDBC Пакетное исполнение не возвращает фактическое количество затронутых строк

У меня есть сотни тысяч записей в моем столе tbltest, которые я обновляю через JDBC пакетное исполнение. Так что считайте это одним id = одним запросом.

Мои требования: Я хочу отслеживать, какие id s успешно обновлены и которые не существуют в db.

Ниже мой код:

String sql = "UPDATE TBLTEST SET STATUS = 'CANCEL' WHERE ID = ?"; 
PreparedStatement preparedStatement = null; 
Connection connection = getConnection(); // I'm getting this connection properly 
preparedStatement = connection.prepareStatement(sql); 

for (String id : idList) { // idList is a List of String being passed to my method 
    preparedStatement.setString(1, id); 
    preparedStatement.addBatch(); 
} 
int[] affectedRecords = preparedStatement.executeBatch(); 

System.out.println("Records affected:"+Arrays.toString(affectedRecords)); 
int success = preparedStatement.getUpdateCount(); 
System.out.println(success + " Total updated"); 

Мои записи успешно обновляются в соответствии с idList условием. Согласно this Javadoc, в affectedRecords, я должен получить фактический номер. записей, обновляемых каждым обновлением, потому что я не получаю никаких исключений. Вместо этого я получаю массив affectedRecords, заполненный -2. Так что, если idList содержит 5 элементов:

Фактический выход:

Records affected: [-2, -2, -2, -2, -2] 
5 Total updated 

Ожидаемый результат:

Records affected: [1, 1, 1, 1, 1] 
5 Total updated 

Я искал этот вопрос в интернете и наткнулся на некоторые должности, подобные этим: https://community.oracle.com/thread/3691652?start=0&tstart=0 https://community.oracle.com/thread/1046798?tstart=0

Но решения, предоставленные в этих сообщениях, также не помогают мне, поскольку я уже использую только ojdbc6.jar.

Итак, есть ли решение или альтернатива этой проблеме?

ответ

4

Я наконец нашел его. Проблема была связана с PreparedStatement.

Согласно Javadoc от Oracle here, я не могу получить количество записей, на которые влияет каждый запрос, когда я использую PreparedStatement. Поэтому, когда я преобразовал свой код в Statement, он работал отлично.

Ссылка Примечание:

Update Графа в реализации Oracle Стандарта дозирования Если заявления партия успешно обработана, то массив целых чисел, или обновления отсчитывает массив, возвращенный оператор executeBatch вызова будет всегда есть один элемент для каждой операции в партии. В реализации Oracle стандартного обновление пакетирования, значение массива элементов заключаются в следующем:

Для подготовленной партии заявления, не представляется возможным узнать количество строк, затронутых в базе данных по каждому отдельному заявлению в партии . Следовательно, все элементы массива имеют значение -2. Согласно спецификации JDBC 2.0, значение -2 указывает, что операция прошла успешно, но количество затронутых строк неизвестно.

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

Для команды вызываемого оператора сервер всегда возвращает значение 1 в качестве количества обновлений, независимо от количества строк, на которые влияет каждая операция .

0

В качестве threads you link to describe это НЕ ПРОБЛЕМА ojdbc6.jar против ojdbc5.jar, но по сравнению с нынешними версиями этих и предыдущих версий.

Поэтому убедитесь, что вы получите очень последнюю версию драйвера:

забрать ojdbc5.jar, если вы запустите программу с Java 5

ojdbc6.jar, если вы запустите программу с Java 6

затем добавить/заменить orai18n.jar

Также убедитесь, что Java подбирает правильную версию, возможно, с помощью -verbose переключатель для java.

+0

Спасибо за ответ Йенс. Но у меня нет другой версии ojdbc jar. Я уже упоминал в своем вопросе, что я использую ojdbc6.jar. Я использую только Java 6. У меня нет Java 5. – RAS

+0

Да, и это не имеет значения, как указано в моем ответе и в теме, связанной с моим вопросом и вашим ответом. Там есть много разных ojdbc6.jars. И вам нужен последний. Нет, где вы статировали, что вы получили новую версию драйвера из oracle и проверили, что она действительно используется. –

+0

Это тоже не помогает. – RAS

1

-2 является SUCCESS_NO_INFO так это не говорит, сколько строк, где обновляется для этого элемента в пакете. Однако начиная с 11.2.0.3, тонкий драйвер JDBC скажет вам точное количество обновленных строк для каждого элемента пакета. Это была одна из ключевых новых функций этой версии. Он работает с PreparedStatement.

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