0

I am trying to query a table that has long-raw() type data which is having a text in it. I need to export this data to a flat file. For a given id, I see there are 14 rows in the table. I am fetching the data using JDBC connection and when fetching the data using ResultSet, I am getting ArrayIndexOutOfBoundsException at 13th row. Not sure why this issue occurs.

The data in the long raw column could be large. I am suspecting it is not able to fetch all the data that is present. I might be wrong too. I cant find much information when could a ArrayIndexOutOfBoundsException occur in this scenario. Complete code is below-

import java.io.*;
import java.sql.*;
import java.util.ArrayList;


public class TestMain {

    private static String URL = "jdbc:oracle:thin:@localhost:8080:xe";
    private static String USER_NAME = "scott";
    private static String PASSWORD = "tiger";

    public static void main(String[] args) throws SQLException, IOException {

        Connection newConnection = getNewConnection();
        BufferedWriter bw = new BufferedWriter(new FileWriter("./extractedFile/RawDataFile.txt"));
        PreparedStatement extractableRowCount = getExtractableRowCount(newConnection, (long)34212);
        ResultSet foundCountRs = extractableRowCount.executeQuery();
        foundCountRs.next();
        int foundCount = foundCountRs.getInt(1);
        //`here I get 14 as the count`
        System.out.println("Available rows for id:: 34212 are "+foundCount);
        foundCountRs.close();
        extractableRowCount.close();
        PreparedStatement fetchBinaryQueryStatement = getExtractableRow(newConnection, (long)34212);
        ResultSet fetchedRowsRs = fetchBinaryQueryStatement.executeQuery();

        int i=0;
        while (fetchedRowsRs.next()) {
            i++;
            //`I see outputs upto i=13, and then I get ArrayIndexOutOfBoundsException 
            System.out.println("i = " + i);
            String userName = fetchedRowsRs.getString("user_name");
            InputStream savedTextData = fetchedRowsRs.getBinaryStream("saved_text");

            bw.write(userName + ":: ");
            int len = 0;
            if (savedTextData != null) {
                while ((len = savedTextData.read()) != -1) {
                    bw.write((char) len);
                    bw.flush();
                }
            }
            fetchedRowsRs.close();
            fetchBinaryQueryStatement.close();

        }
        bw.close();

    }

    public static Connection getNewConnection() throws SQLException {

        DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
        return DriverManager.getConnection(URL, USER_NAME, PASSWORD);

    }

    public static PreparedStatement getExtractableRow(Connection connection, Long id) throws SQLException {
        PreparedStatement statement = connection.prepareStatement("SELECT user_name, saved_text FROM user_email_text_data where id = ?");
        statement.setLong(1, id);
        return statement;
    }

    public static PreparedStatement getExtractableRowCount(Connection connection, Long id) throws SQLException {
        PreparedStatement statement = connection.prepareStatement("SELECT count(1) FROM user_email_text_data where id = ?");
        statement.setLong(1, id);
        return statement;
    }

}

Full stack trace of error:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 8
    at oracle.jdbc.driver.T4CMAREngineNIO.buffer2Value(T4CMAREngineNIO.java:814)
    at oracle.jdbc.driver.T4CMAREngineNIO.unmarshalUB2(T4CMAREngineNIO.java:577)
    at oracle.jdbc.driver.T4CMAREngineNIO.unmarshalSB2(T4CMAREngineNIO.java:557)
    at oracle.jdbc.driver.T4CMAREngine.processIndicator(T4CMAREngine.java:1573)
    at oracle.jdbc.driver.T4CMarshaller$StreamMarshaller.unmarshalOneRow(T4CMarshaller.java:179)
    at oracle.jdbc.driver.T4CLongRawAccessor.unmarshalOneRow(T4CLongRawAccessor.java:159)
    at oracle.jdbc.driver.T4CTTIrxd.unmarshal(T4CTTIrxd.java:1526)
    at oracle.jdbc.driver.T4CTTIrxd.unmarshal(T4CTTIrxd.java:1289)
    at oracle.jdbc.driver.T4C8Oall.readRXD(T4C8Oall.java:850)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:543)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:226)
    at oracle.jdbc.driver.T4CPreparedStatement.fetch(T4CPreparedStatement.java:1023)
    at oracle.jdbc.driver.OracleStatement.fetchMoreRows(OracleStatement.java:3353)
    at oracle.jdbc.driver.InsensitiveScrollableResultSet.fetchMoreRows(InsensitiveScrollableResultSet.java:736)
    at oracle.jdbc.driver.InsensitiveScrollableResultSet.absoluteInternal(InsensitiveScrollableResultSet.java:692)
    at oracle.jdbc.driver.InsensitiveScrollableResultSet.next(InsensitiveScrollableResultSet.java:406)
kumarji.alluri
  • 197
  • 1
  • 3
  • 13
  • No part of that stack trace points to your code so it’s hard to know where the error occurred, is the stack trace posted the complete one? Could it have something to do with reading that InputStream? – Joakim Danielson May 11 '19 at 06:34
  • Sorry, I missed the line, it is occuring at fetchedRowsRs.next() – kumarji.alluri May 11 '19 at 13:12

3 Answers3

3

I was getting the exact same exception when calling ResultSet.next() using ojdbc8-12.2.0.1:

java.lang.ArrayIndexOutOfBoundsException: 8
at oracle.jdbc.driver.T4CMAREngineNIO.buffer2Value(T4CMAREngineNIO.java:814)
at oracle.jdbc.driver.T4CMAREngineNIO.unmarshalUB2(T4CMAREngineNIO.java:577)
at oracle.jdbc.driver.T4CMAREngineNIO.unmarshalSB2(T4CMAREngineNIO.java:557)
at oracle.jdbc.driver.T4CMAREngine.processIndicator(T4CMAREngine.java:1573)
at oracle.jdbc.driver.T4CMarshaller$StreamMarshaller.unmarshalOneRow(T4CMarshaller.java:179)
at oracle.jdbc.driver.T4CLongRawAccessor.unmarshalOneRow(T4CLongRawAccessor.java:159)
at oracle.jdbc.driver.T4CTTIrxd.unmarshal(T4CTTIrxd.java:1526)
at oracle.jdbc.driver.T4CTTIrxd.unmarshal(T4CTTIrxd.java:1289)
at oracle.jdbc.driver.T4C8Oall.readRXD(T4C8Oall.java:850)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:543)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:226)
at oracle.jdbc.driver.T4CPreparedStatement.fetch(T4CPreparedStatement.java:1023)
at oracle.jdbc.driver.OracleStatement.fetchMoreRows(OracleStatement.java:3353)

The exception disappeared when I upgraded driver version to ojdbc8-18.3.0.0.

Updating JDBC driver might be worth a try, if anyone should find themselves in the same situation.

0

The below lines are at the end of the outer while loop but they need to be executed after the loop since you can't close the result set object and then call next()

fetchedRowsRs.close();
fetchBinaryQueryStatement.close();
Joakim Danielson
  • 43,251
  • 5
  • 22
  • 52
-2

As your size of array is 14 therefore the last index is 13 as it starts from 0.So you are accessing value of index greater than size of array it gives ArrayOutOfBound exception.

Raj Saraogi
  • 1,780
  • 1
  • 13
  • 21