2009-08-04 2 views
2

Der Code:ResultSet.getBlob() Ausnahme

ResultSet rs = null; 

try { 
    conn = getConnection(); 
    stmt = conn.prepareStatement(sql); 
    rs = stmt.executeQuery(); 

    while (rs.next()) { 
     Blob blob = rs.getBlob("text"); 
     byte[] blobbytes = blob.getBytes(1, (int) blob.length()); 
    String text = new String(blobbytes); 

Das Ergebnis:

java.sql.SQLException: Invalid column type: getBLOB not implemented for class oracle.jdbc.driver.T4CClobAccessor 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:111) 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145) 
at oracle.jdbc.driver.Accessor.unimpl(Accessor.java:357) 
at oracle.jdbc.driver.Accessor.getBLOB(Accessor.java:1299) 
at oracle.jdbc.driver.OracleResultSetImpl.getBLOB(OracleResultSetImpl.java:1280) 
at oracle.jdbc.driver.OracleResultSetImpl.getBlob(OracleResultSetImpl.java:1466) 
at oracle.jdbc.driver.OracleResultSet.getBlob(OracleResultSet.java:1978) 

ich class12_10g.zip in meinem Klassenpfad haben. Ich habe gegoogelt und im Wesentlichen nur eine Seite zu diesem speziellen Problem gefunden, und es war nicht hilfreich bei.

Hat jemand irgendwelche Ideen dazu?


ein wenig Hintergrund: Wir waren eine unserer Datenbanken von MySQL zu Oracle konvertieren. Innerhalb der MySQL DB ist eines der Felder ein Langtext, der im Code als BLOB behandelt wird. Die SQL Developer Workbench konvertiert standardmäßig Longtext in CLOB (für mich sinnvoll), aber der Code erwartet Blob. Ich denke, der Fehler war nicht so gut: oracle.jdbc.driver.T4CClobAccessor (obwohl es Clob erwähnt).

Als ich versuchte, die folgenden:

rs = stmt.executeQuery(); 

while (rs.next()) { 
    byte[] blobbytes = rs.getBytes("text"); 
    String text = new String(blobbytes); 
} 

es eine nicht unterstützte Ausnahme ausgelöst hat - alles, was ich in erster Linie zu tun hatte, die Typen in der neu erstellten Oracle DB leider war der Vergleich mit dem, was der Code erwartet hat (Ich habe nur angenommen, dass sie übereinstimmen würden).

Sorry Jungs! Nicht, dass ich viel in sie Gedanken gemacht habe, jetzt muss ich herausfinden, warum die ursprünglichen Entwickler für BLOB-Typen verwendet long

Antwort

4

Nicht sicher machen die Blob-Objekt Arbeit - ich überspringen typischerweise den Blob Schritt:

rs = stmt.executeQuery(); 

while (rs.next()) { 
    byte[] blobbytes = rs.getBytes("text"); 
    String text = new String(blobbytes); 
} 
1

Try ...

PreparedStatement stmt = connection.prepareStatement(query); 
    ResultSet rs = stmt.executeQuery(); 
    rs.next(); 
    InputStream is = rs.getBlob(columnIndex).getBinaryStream(); 

... statt?

+1

Ich würde stattdessen rs.getBinaryStream() verwenden, es ist zuverlässiger –

2

versuchen Sie, die neueste Version der Treiber (10.2.0.4) zu verwenden. Versuchen Sie auch die Treiber für JDK 1.4/1.5, da classes12 für JDK 1.2/1.3 sind.

+0

Die einzelnen JAR-Dateien sind ojdbc5.jar (JDK 5) oder ojdbc6.jar (JDK 6). –

+0

Die letzte Version, die ojdbc6 unterstützt, ist Oracle Database 12c Version 1 (12.1.0.1): http://www.oracle.com/technetwork/database/features/jdbc/jdbc-drivers-12c-download-1958347.html – Vadzim

1

Ich habe ein Dienstprogramm-Methode in einem DAO geordneten Klasse aller meiner DAOs:

protected byte[] readBlob(oracle.sql.BLOB blob) throws SQLException { 

    if (blob != null) { 
     byte[] buffer = new byte[(int) blob.length()]; 
     int bufsz = blob.getBufferSize(); 
     InputStream is = blob.getBinaryStream(); 
     int len = -1, off = 0; 
     try { 
      while ((len = is.read(buffer, off, bufsz)) != -1) { 
       off += len; 
      } 
     } catch (IOException ioe) { 
      logger.debug("IOException when reading blob", ioe); 
     } 
     return buffer; 
    } else { 
     return null; 
    } 
} 

// to get the oracle BLOB object from the result set: 
oracle.sql.BLOB blob= (oracle.sql.BLOB) ((OracleResultSet) rs).getBlob("blobd"); 

Jemand wird jetzt sagen, „warum Sie nicht nur tun XYZ“, aber es gab einige Problem zu der Zeit, die gemacht das oben genannte zuverlässiger.

+0

Persönlich Ich habe festgestellt, dass XYZ immer besser ist, unabhängig von den Kosten. Ernsthaft, Alter. – DreadPirateShawn

0

Wenn JDBC ein ResultSet von einer Oracle-Datenbank zurückgibt, wird immer ein OracleResultSet zurückgegeben. Wenn Sie es als ResultSet eingeben, wird es von java in das Standard-SQL-ResultSet hochgestuft. OracleResultSet überschreibt die meisten Datentypmethoden, da Oracle-Datentypen keine Standard-SQL-Typen sind. Mit anderen Worten, das hat funktioniert, weil Sie die rs als OracleResultSet und die getBlob -Methode verwendet haben.