简体   繁体   English

使用准备好的语句迭代sql resultSet时出现ArrayIndexOutOfBoundsException

[英]ArrayIndexOutOfBoundsException while iterating sql resultSet with prepared statement

I am getting the below error while fetching the result set. 获取结果集时出现以下错误。 I am using the jdbc thin driver( ojdbc6 ). 我正在使用jdbc瘦驱动程序( ojdbc6 )。 The interesting part is, it is giving the error after processing the 10 rows . 有趣的是,它在处理了10行之后给出了错误。 I checked in some forums and found that there is some problem with jdbc driver. 我在一些论坛中进行了检查,发现jdbc驱动程序存在问题。 I was wondering if I can do something with this driver(ojdbc6) itself!! 我想知道我是否可以使用此驱动程序(ojdbc6)本身来做些事情!

Would appreciate any help on this. 希望对此有所帮助。

Here is the table structure: 这是表的结构:

CREATE TABLE "TEST_SO_MANY_COLUMNS" 
   (    "COL1" VARCHAR2(4000 BYTE), 
    "COL2" VARCHAR2(4000), 
    "COL3" VARCHAR2(4000), 
    "COL4" VARCHAR2(4000), 
    "COL5" VARCHAR2(4000), 
    "COL6" VARCHAR2(4000), 
    "COL7" VARCHAR2(4000), 
    "COL8" VARCHAR2(4000), 
    "COL9" VARCHAR2(4000), 
    "COL10" VARCHAR2(4000), 
    "COL11" VARCHAR2(4000), 
    "COL12" VARCHAR2(4000), 
    "COL13" VARCHAR2(4000), 
    "COL14" VARCHAR2(4000), 
    "COL15" VARCHAR2(4000), 
    "COL16" VARCHAR2(4000), 
    "COL17" VARCHAR2(4000), 
    "COL18" VARCHAR2(4000), 
    "COL19" VARCHAR2(4000), 
    "COL20" VARCHAR2(4000), 
    "COL21" VARCHAR2(4000), 
    "COL22" VARCHAR2(4000), 
    "COL23" VARCHAR2(4000), 
    "COL24" VARCHAR2(4000), 
    "COL25" VARCHAR2(4000), 
    "COL26" VARCHAR2(4000), 
    "COL27" VARCHAR2(4000), 
    "COL28" VARCHAR2(4000), 
    "COL29" VARCHAR2(4000), 
    "COL30" VARCHAR2(4000), 
    "COL31" VARCHAR2(4000), 
    "COL32" VARCHAR2(4000), 
    "COL33" VARCHAR2(4000), 
    "COL34" VARCHAR2(4000), 
    "COL35" VARCHAR2(4000), 
    "COL36" VARCHAR2(4000), 
    "COL37" VARCHAR2(4000), 
    "COL38" VARCHAR2(4000), 
    "COL39" VARCHAR2(4000), 
    "COL40" VARCHAR2(4000), 
    "COL41" VARCHAR2(4000), 
    "COL42" VARCHAR2(4000), 
    "COL43" VARCHAR2(4000), 
    "COL44" VARCHAR2(4000), 
    "COL45" VARCHAR2(4000), 
    "COL46" VARCHAR2(4000), 
    "COL47" VARCHAR2(4000), 
    "COL48" VARCHAR2(4000), 
    "COL49" VARCHAR2(4000), 
    "COL50" VARCHAR2(4000), 
    "COL51" VARCHAR2(4000), 
    "COL52" VARCHAR2(4000), 
    "COL53" VARCHAR2(4000), 
    "COL54" VARCHAR2(4000), 
    "COL55" VARCHAR2(4000), 
    "COL56" VARCHAR2(4000), 
    "COL57" VARCHAR2(4000), 
    "COL58" VARCHAR2(4000), 
    "COL59" VARCHAR2(4000), 
    "COL60" VARCHAR2(4000), 
    "COL61" VARCHAR2(4000), 
    "COL62" VARCHAR2(4000), 
    "COL63" VARCHAR2(4000), 
    "COL64" VARCHAR2(4000), 
    "COL65" VARCHAR2(4000), 
    "COL66" VARCHAR2(4000), 
    "COL67" VARCHAR2(4000), 
    "COL68" VARCHAR2(4000), 
    "COL69" VARCHAR2(4000), 
    "COL70" VARCHAR2(4000), 
    "COL71" VARCHAR2(4000), 
    "COL72" VARCHAR2(4000), 
    "COL73" VARCHAR2(4000), 
    "COL74" VARCHAR2(4000), 
    "COL75" VARCHAR2(4000), 
    "COL76" VARCHAR2(4000), 
    "COL77" VARCHAR2(4000), 
    "COL78" VARCHAR2(4000), 
    "COL79" VARCHAR2(4000), 
    "COL80" VARCHAR2(4000), 
    "COL81" VARCHAR2(4000), 
    "COL82" VARCHAR2(4000), 
    "COL83" VARCHAR2(4000), 
    "COL84" VARCHAR2(4000), 
    "COL85" VARCHAR2(4000), 
    "COL86" VARCHAR2(4000), 
    "COL87" VARCHAR2(4000), 
    "COL88" VARCHAR2(4000), 
    "COL89" VARCHAR2(4000), 
    "COL90" VARCHAR2(4000), 
    "COL91" VARCHAR2(4000), 
    "COL92" VARCHAR2(4000), 
    "COL93" VARCHAR2(4000), 
    "COL94" VARCHAR2(4000), 
    "COL95" VARCHAR2(4000), 
    "COL96" VARCHAR2(4000), 
    "COL97" VARCHAR2(4000), 
    "COL98" VARCHAR2(4000), 
    "COL99" VARCHAR2(4000), 
    "COL100" VARCHAR2(4000), 
    "COL101" VARCHAR2(4000), 
    "COL102" VARCHAR2(4000), 
    "COL103" VARCHAR2(4000), 
    "COL104" VARCHAR2(4000), 
    "COL105" VARCHAR2(4000), 
    "COL106" VARCHAR2(4000), 
    "COL107" VARCHAR2(4000), 
    "COL108" VARCHAR2(4000), 
    "COL109" VARCHAR2(4000), 
    "COL110" VARCHAR2(4000), 
    "COL111" VARCHAR2(4000), 
    "COL112" VARCHAR2(4000), 
    "COL113" VARCHAR2(4000), 
    "COL114" VARCHAR2(4000), 
    "COL115" VARCHAR2(4000), 
    "COL116" VARCHAR2(4000), 
    "COL117" VARCHAR2(4000), 
    "COL118" VARCHAR2(4000), 
    "COL119" VARCHAR2(4000), 
    "COL120" VARCHAR2(4000)
   );

Table has around 200 rows and all columns are having values up to 4000 chars. 表格大约有200行,所有列的值最高为4000个字符。

Query Format: 查询格式:

select "COL1","COL2","COL3" ......."COL120" from SRC."TEST_SO_MANY_COLUMNS"

Code snippet: 程式码片段:

 Statement sel_stmt = connection.createStatement();
 ResultSet res = sel_stmt.executeQuery(query);
 res.setFetchSize(10000);
 ResultSetMetaData resultSetMetaData = resultSet.getMetaData();

Not getting any error while fetching the resultSet. 提取resultSet时未出现任何错误。 The problem occurs while iterating over the result set: 遍历结果集时发生问题:

int count = 0;
if (resultSet.next()) {
    count++ ;
    //Do Something i.e. resultSet.getObject() .. and so on.. 
}
// Do something 

The above iteration works fine for first 10 rows but gives the below exception after that. 上面的迭代对于前10行工作正常,但是之后给出了以下异常。 Stack trace of the error: 错误的堆栈跟踪:

java.lang.ArrayIndexOutOfBoundsException
    at java.lang.System.arraycopy(Native Method)
    at oracle.jdbc.driver.T4CVarcharAccessor.saveDataFromOldDefineBuffers(T4CVarcharAccessor.java:411)
    at oracle.jdbc.driver.T4CStatement.saveDefineBuffersIfRequired(T4CStatement.java:533)
    at oracle.jdbc.driver.OracleStatement.prepareAccessors(OracleStatement.java:1070)
    at oracle.jdbc.driver.OracleStatement.check_row_prefetch_changed(OracleStatement.java:3080)
    at oracle.jdbc.driver.OracleResultSetImpl.close_or_fetch_from_next(OracleResultSetImpl.java:321)
    at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:277)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

That's a pretty old bug (4751145). 那是一个相当老的错误(4751145)。 It was reported in 2005 in the 10.2 driver. 据报道在2005年的10.2驱动程序中。 The 10.2.0.3 driver has the fix. 10.2.0.3驱动程序已修复。 My guess is that you're running with either 10.2.0.1 or 10.2.0.2. 我的猜测是您正在使用10.2.0.1或10.2.0.2。

The Oracle download page is here: http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html Oracle下载页面在这里: http : //www.oracle.com/technetwork/database/features/jdbc/index-091264.html

If you want to stick to the 10.2 codeline then you should move to the latest patchset which is 10.2.0.5. 如果要坚持使用10.2代码行,则应使用最新的补丁集10.2.0.5。 Note that the driver is backward compatible so you can also use the 11.2 or even 12.1 driver to connect to a 10g database. 请注意,该驱动程序向后兼容,因此您也可以使用11.2甚至12.1驱动程序连接到10g数据库。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM