Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Usenet -> c.d.o.tools -> Re: ArrayIndexOutOfBounds in Oracle8i 8.1.7 JDBC Drivers and Ref Cursor

Re: ArrayIndexOutOfBounds in Oracle8i 8.1.7 JDBC Drivers and Ref Cursor

From: The Nomad <nobody_at_nowhere.com>
Date: Tue, 10 Apr 2001 00:14:32 GMT
Message-ID: <IfsA6.12122$nD5.1916151@typhoon.tampabay.rr.com>

The problem seems to be in the drivers' handling of LONG RAW fields.

Duplication Information


Here is a simple duplication path:

  1. Paste in the following to SQL-Plus

DROP TABLE BUGSAMPLE
/

CREATE TABLE BUGSAMPLE (
  TESTINT INT NOT NULL,
  TESTSTRING VARCHAR(20),
  TESTBIN LONG RAW,
  CONSTRAINT PK_BUGSAMPLE PRIMARY KEY(TESTINT) )
/

CREATE OR REPLACE VIEW BUGVIEW AS
  SELECT TESTINT, TESTSTRING FROM BUGSAMPLE; CREATE OR REPLACE PACKAGE CURTYPES
AS
  TYPE BUGSAMPCURTYPE IS REF CURSOR RETURN BUGSAMPLE%ROWTYPE;   TYPE BUGSAMPVIEWCURTYPE IS REF CURSOR RETURN BUGVIEW%ROWTYPE; END;
/

CREATE OR REPLACE FUNCTION Q_BUGSAMPLE RETURN CURTYPES.BUGSAMPCURTYPE AS   c1 CURTYPES.BUGSAMPCURTYPE;
BEGIN
  OPEN c1 FOR SELECT * FROM BUGSAMPLE;
  RETURN c1;
END;
/

CREATE OR REPLACE FUNCTION Q2_BUGSAMPLE RETURN CURTYPES.BUGSAMPVIEWCURTYPE AS
  c1 CURTYPES.BUGSAMPVIEWCURTYPE;
BEGIN
  OPEN c1 FOR SELECT * FROM BUGVIEW;
  RETURN c1;
END;
/

INSERT INTO BUGSAMPLE(TESTINT, TESTSTRING) VALUES(1, 'TEST1')
/

INSERT INTO BUGSAMPLE(TESTINT, TESTSTRING) VALUES(2, 'TEST2')
/

INSERT INTO BUGSAMPLE(TESTINT, TESTSTRING) VALUES(3, 'TEST3')
/

INSERT INTO BUGSAMPLE(TESTINT, TESTSTRING, TESTBIN) VALUES(4, 'TEST4', '1123412341')
/

2) Here is a sample java class to run:

package bugsample;

import java.sql.*;
import oracle.jdbc.driver.*;

public class bugTest
{

  public static void main( String args[] ) {     String url = "jdbc:oracle:thin:@nomadlap:1521:NomadDb";     String className = "oracle.jdbc.driver.OracleDriver";     try {

      Class.forName(className).newInstance();
      Connection con = DriverManager.getConnection(url, "nomad",
"password");
      try {
        CallableStatement stmt = con.prepareCall("{? = call
Q_BUGSAMPLE()}");
        try {
          stmt.registerOutParameter(1, OracleTypes.CURSOR);
          stmt.execute();
          ResultSet rs = (ResultSet)stmt.getObject(1);
          while (rs.next()) {
            System.out.println(rs.getInt(1) + "-" + rs.getString(2));
          }
        } finally {
          stmt.close();
        }
      } finally {
        con.close();
      }

    } catch (Exception e) {
   e.printStackTrace();
    }
  }  

}

Running it results in:

1-TEST1 java.lang.ArrayIndexOutOfBoundsException: 1  at oracle.jdbc.ttc7.NonPlsqlTTCColumn.unmarshal(NonPlsqlTTCColumn.java)  at
oracle.jdbc.ttc7.NonPlsqlTTCDataSet.unmarshalRow(NonPlsqlTTCDataSet.java)  at oracle.jdbc.ttc7.TTIrxd.unmarshal(TTIrxd.java)  at oracle.jdbc.ttc7.TTC7Protocol.fetch(TTC7Protocol.java)  at
oracle.jdbc.driver.OracleStatement.fetchNextColumns(OracleStatement.java)  at oracle.jdbc.driver.OracleInputStream.needBytes(OracleInputStream.java)  at oracle.jdbc.driver.OracleInputStream.close(OracleInputStream.java)  at
oracle.jdbc.driver.OracleResultSetImpl.prepare_for_new_row(OracleResultSetIm pl.java)
 at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java)  at bugsample.bugTest.main(bugTest.java:33)

Notes



In the DDL, if the 4th row isn't added (the one that adds a non-null entry in the LONG RAW field), then the result set never has any data. If you change the Q_BUGSAMPLE to Q2_BUGSAMPLE, you will note that all the rows are returned.

This is a serious bug - does Oracle monitor this site? Help! Received on Mon Apr 09 2001 - 19:14:32 CDT

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US