У меня есть программа, которая извлекает большой набор данных из Oracle 10g (10.2.0.3), используя довольно простой запрос. Вы могли бы почти назвать запрос / логику своего рода «экспортом», так как он выбирает столбцы из таблицы с минимальным предложением where (то есть возвращает большинство, если не все строки).
Код [Java] - это образец, который мы все видели:
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
con = getConnection(Person);
pstmt = con.prepareStatement(
"SELECT ID, FIRST_NAME, LAST_NAME, ... FROM PERSON WHERE ...");
rs = pstmt.executeQuery();
while (rs.next()) {
// write the data to a file
}
}
finally {
if (rs != null) try { rs.close(); } catch (Exception e) { }
if (pstmt != null) try {pstmt.close(); } catch (Exception e) { }
if (con != null) try { con.close() ; } catch (Exception e) { }
}
getConnection - это мой собственный метод, который возвращает объект Connection в базу данных Oracle, которая используется для таблицы «PERSON». Это похоже на обычный вопрос программирования, но я писал такой код много раз и никогда не сталкивался с такой проблемой.
Я получаю исключение java.sql.SQLException: ORA-01406: извлеченное значение столбца было усечено в строке while (rs.next ()). В документации Oracle, которую я прочитал, говорится, что «операция FETCH была вынуждена усечь строку символов». Он предлагает использовать больший буфер столбцов для хранения самого большого столбца. Но это не имеет смысла. В части приведенного выше кода, который комментируется как «записать данные в файл», я просто пишу каждый столбец как rs.getBigDecimal («ID»), rs.getString («FIRST_NAME» и т. Д.) Воспроизведите область с помощью пустого цикла while, который ничего не делает с ResultSet, то есть, просто перебирая ResultSet, выдается исключение SQLException.
Размер возвращаемого набора данных должен составлять приблизительно 1 миллион строк. Я получаю исключение после примерно 600 000 строк / итераций в цикле. Есть идеи?