ClassCastException cuando intento hacer el cast Clob obj = (CLOB)rs.getClob(1);

Rub?
26 de Enero del 2009
La aplicación lanza un java.lang.ClassCastException cuando intento hacer el cast Clob obj = (CLOB)rs.getClob(1);

Estoy usando Oracle 9i, Bea Weblogic 8.1 yjava 1.4.1_03-b02,

he probado los drivers:
jdbc:oracle:oci8:@localhost:1521:INTRANET
jdbc:oracle:thin:@localhost:1521:INTRANET

y varias interface CLOB de Oracle:

weblogic.jdbc.rmi.SerialClob
import oracle.sql.CLOB;

y todo revienta, si alguien se ha enfrentado a este hijo de puta y me dice su punto de debil, me hará salir victorioso de una lucha que dura ya 4 días!!
GRACIAS !!



PaneB
26 de Enero del 2009
Si usas pool de WebLogic (como debiera ser tu caso) Bea crea un tipo wrapper para los tipos Clob. La lectura y escritura de estos tipos, si bien parece que está soportada por java, es del todo mentira. Usando "java standar" no podrás nunca guardar o leer un CLOB de más de 4K!!!

Para realizar estas operaciones deberás usar las clases propias de oracle:

Así, el fragmento para escribir en un campo CLOB:

CallableStatement cs = null;
cs = dbConn.prepareCall("begin DBMS_LOB.CREATETEMPORARY(?, TRUE,DBMS_LOB.SESSION); end;");
cs.registerOutParameter(1, Types.CLOB);
cs.execute();
oracle.sql.CLOB clob = (oracle.sql.CLOB) ((weblogic.jdbc.wrapper.Clob)cs.getClob(1)).getVendorObj();
clob.putString(1, mensaje);

PreparedStatement ps = dbConn.prepareStatement("update mensaje SET mensaje=? where codigo = ?");

ps.setClob(1, clob);
ps.setClob(2, 34);
...
Y esta función para leer un campo clob. El objeto que
se pasa se obtiene usando el método getObject de
resulset (no uses getClob).

private String readClob (Object obj) {
if (obj==null) return null;
BufferedReader bf=null;
StringBuffer out = new StringBuffer(100);
try {
bf = new BufferedReader(new InputStreamReader( ( (Clob)
obj).getAsciiStream()));

String line;
while ( (line = bf.readLine()) != null) {
out.append(line);
out.append("\n");
}
bf.close();
}
catch (Exception ex) {
out.setLength(0);
}
finally {
try {
bf.close();
}
catch (IOException ioe){
}
}

return (out.toString());
}


Espero que te funcione.

Adriana
26 de Enero del 2009
Unicamente recibelo como Clob obj = rx.getClob(1); no requiere de cast el tipo de dato ya existe en Java.