2009-04-10 14 views
0

Ich arbeite an einem Projekt in Orakel 9i. Ich hatte ein Problem mit toplink 10.1.3 Laden einer bestimmten Zeile in einer Tabelle. Es stellt sich heraus, dass der jdbc-Treiber, auf den sich toplink verlässt, sehr witzig ist. Vielleicht kann hier jemand helfen ...Wann sind zwei Spalten, die in Orakel nicht gleich aussehen?

Ich habe eine Tabelle namens: crazytable. Es hat eine Spalte: "ver_num number (19) not null default 0". Diese Spalte wurde vor einigen Jahren als Teil der ursprünglichen Einfügung in die Tabelle eingefügt. Wenn ich irgendeinen Datensatz (siehe unten für den jdbc-Verbindungscode) aus crazetable auswähle und versuche, einen rs.getLong (colIndex) zu machen, funktioniert alles gut. Wenn ich jedoch eine rs.getObject (colIndex) tun, ich Stacktrace erhalten:

java.lang.ArrayIndexOutOfBoundsException: 1 
    at oracle.sql.NUMBER.toBigDecimal(NUMBER.java:651) 
    at oracle.jdbc.dbaccess.DBConversion.NumberBytesToBigDecimal(DBConversion.java:2805) 
    at oracle.jdbc.driver.OracleStatement.getBigDecimalValue(OracleStatement.java:4539) 
    at oracle.jdbc.driver.OracleStatement.getObjectValue(OracleStatement.java:5666) 
    at oracle.jdbc.driver.OracleStatement.getObjectValue(OracleStatement.java:5622) 
    at oracle.jdbc.driver.OracleResultSetImpl.getObject(OracleResultSetImpl.java:739) 
    at oracle.jdbc.driver.OracleResultSet.getObject(OracleResultSet.java:1470) 
    stacktrace truncated to protect my poor code... 

ich einen anderen Tisch nehmen, nennen wir es: sanetable, und führen Sie diese gleiche Abfrage für eine Spalte mit dem gleichen Namen und Geben Sie "ver_num number (19) not null default 0" ein. Und rs.getLong (colIndex) und rs.getObject (colIndex) funktionieren gut.

Keine der beiden Spalten ist an einer Integritätsbedingung oder einem Index beteiligt. Ich habe oracle Treiber 9.2.0.8, 9.2.0.5, 9.2.0.1, sogar 10. * versucht (die nicht arbeiten).

Weiß jemand etwas über das, was ich hier tun kann?

Dies ist mein einfacher Verbindungscode. Der einzige Unterschied zwischen den erfolgreichen Anrufen ist die besondere Tabelle in Frage:

  Class.forName(oracle.jdbc.OracleDriver.class.getName()); 
    String url = "jdbc:oracle:thin:@IPADDRESS:PORT:INSTANCE"; 
     Connection conn = null; 
     ResultSet rs = null; 
     try { 
      conn = DriverManager.getConnection(url, "user","pass"); 
      PreparedStatement prepareStatement = conn.prepareStatement(
        "select distinct ver_num " + 

        "FROM [crazytable|sanetable] " 
        ); 
      rs = prepareStatement.executeQuery(); 
      assertNotNull(rs); 
      while (rs.next()) { 
       ResultSetMetaData md = rs.getMetaData(); 
       for (int i = 1; i <= md.getColumnCount(); i++) { 
        String key = md.getColumnLabel(i); 
        Object value = rs.getLong(key); 
        System.out.println(key+" : "+value 
          +" was null: "+rs.wasNull() 
          +" type: "+ rs.getType() 
          +" class: "+ md.getColumnClassName(i)); 
       } 
      } 
     } finally { 
      if (rs != null) { 
       rs.close(); 
      } 
      if (conn != null) { 
       conn.close(); 
      } 
     } 

edit: Der Fahrer kann auf dieser Seite zu finden: http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.html

+0

Könnten Sie bitte den Namen der Treiber-JAR-Datei angeben? –

Antwort

0

Okay, ich glaube, ich dies herausgefunden. Ich habe einige andere Fragen durchgesehen und festgestellt, dass es noch andere Orakeltreiber vom Typ 4 gibt. Einer davon ist DataDirect (http://datadirect.com). Ich habe eine Testversion ihres Treibers verwendet und konnte das rs.getObject (intIndex) zurückgeben.

Der Wert war: -1.6777120E-27.

Also rs.getLong() wurde auf Null abgerundet, aber das BigDecimal sah einen Dezimalteil und warf eine Ausnahme.

Vielleicht ist dies aufgrund Orakels Treiber mit jdbc1.4 vs kompiliert, etwas neuer für Datadirect.

Verwandte Themen