ClassCastException - Blob -&gt BLOB (Oracle)

Olá guj…

Eu sei que o assunto é rodado… entretanto após 2 horas de Google, e Busca no guj, ainda nao encontrei unma solução…

simples: alguem ai sabe como transformar um Blob (java.sql.Blob) pra um BLOB (Oracle)??? tentei de tudo qto e jeito, mas peguei ClassCastException em toda as tentativas…

abraço :wink:

Mas você precisa realmente fazer esse cast? Não tem como não usar a classe da Oracle?

Coloca o exemplo do código que você está tentando executar.

Vc necessita mesmo do cast? e se mudar o banco de dados?
mas a solução é essa


oracle.sql.Blob oracleBlob =  (oracle.sql.Blob ) blobJDBC;

eu nao necessito do cast…

mas, tentando fazê-lo, da ClassCastException

–> no DAO : Banco Local Firebird

decadatilar.setPD( rs.getBlob(“IM_POLEGAR_DIREITO”);

Depois, em outra classe, preciso passar esse java.sql.Blob pra uma OracleCallableStatement…

—> cstmt.setBlob( 1, decadatilar.getPD() ) // da pau
—> cstmt.setBLOB( 1, (oracle.sql.BLOB) decadatilar.getPD() ) // da pau

ja tentei algumas coisas q vi no google

–> no DAO : Banco Local Firebird

— decadatilar.setPD( ((OracleResultSet)rs).getBLOB(“IM_POLEGAR_DIREITO”);

resumindo: Ja fiz cast de tudo q imaginava, e deu pau…
e sem cast, tb

:frowning:

tudo isso pq no Oracle, eu tenho uma SP que recebe varios BLOB’s e os grava em disco.

Não dá para usar CallableStatement ao invés de OracleCallableStatement?

Se não der, acho que você vai ter que fazer mais ou menos isto (não testei):

java.sql.Blob blob;
oracle.sql.BLOB oracleBLOB = new oracle.sql.BLOB();

oracleBLOB.putBytes(0, blob.getBytes(0, blob.length()));

nao funciona pois nao existe esse constructor sem argumentos de BLOB()…

pro constructor dele eu teria q passar uma OracleConnection e um array de byte, mas so tenho em maos o java.sql.Blob mesmo

Desculpe, mas nem tinha visto os construtores desta classe.

Connection você tem que ter, se não você não consegue conectar no Oracle. Veja no javadoc a relação entre Connection e OracleConnection. O byte[] é o retorno do método getBytes.

Mas, de novo, não dá para usar CallableStatement ao invés de OracleCallableStatement???

Tentei com CallableStatement tb e nao funfou =(

bom, xo explicar melhor… tenho a seguinte missão: passar uns Blobs de um banco local Firebird, prum servidor Oracle…
em um dado momento eu faço

objeto.setPolegarDireito( rs.getBlob("IM_POLEGAR_DIREITO") );

ok, meu objeto tem um Blob, do tipo java.sql.Blob… qdo tento fazer

callableStatement.setBlob( 1, objeto.getPolegarDireito );

java.lang.ClassCastException: org.firebirdsql.jdbc.FBBlob
	at oracle.jdbc.driver.OraclePreparedStatement.setBlobInternal(OraclePreparedStatement.java:6840)
	at oracle.jdbc.driver.OracleCallableStatement.setBlob(OracleCallableStatement.java:4612)
	at adm.sincronizador.Sincronizador.executeOracleStoredProcedure(Sincronizador.java:501)
	at adm.sincronizador.Sincronizador.access$3(Sincronizador.java:208)
	at adm.sincronizador.Sincronizador$1.run(Sincronizador.java:156)
	at java.util.TimerThread.mainLoop(Unknown Source)
	at java.util.TimerThread.run(Unknown Source)

Blobs sux, pouta merda

inves de tentar converter de java.sql.Blob pra oracle.sql.BLOB, peguei os bytes do ResultSet e estou tentando colocalos dentro do BLOB.

qdo eu faço:

BLOB blob = BLOB.getEmptyBLOB();
blob.setBytes(decadatilar.bytes);

isso gera uma ArrayIndexOutOfBounds exception.

qdo tento

BLOB blob = BLOB.getEmptyBLOB();
blob.setBytes(0, decadatilar.bytes);

isso gera uma java.sql.Exception - Operação de lob vazio inválida

ta osso…

Por que não funcionou? Será que é por que você usou OracleConnection? Precisa usar OracleConnection? Se usar Connection e CallbleStatement não dá certo? Qual o erro?

[quote=fabiocsi]
bom, xo explicar melhor… tenho a seguinte missão: passar uns Blobs de um banco local Firebird, prum servidor Oracle…
em um dado momento eu faço

objeto.setPolegarDireito( rs.getBlob("IM_POLEGAR_DIREITO") );

ok, meu objeto tem um Blob, do tipo java.sql.Blob… qdo tento fazer

callableStatement.setBlob( 1, objeto.getPolegarDireito );

java.lang.ClassCastException: org.firebirdsql.jdbc.FBBlob at oracle.jdbc.driver.OraclePreparedStatement.setBlobInternal(OraclePreparedStatement.java:6840) at oracle.jdbc.driver.OracleCallableStatement.setBlob(OracleCallableStatement.java:4612) at adm.sincronizador.Sincronizador.executeOracleStoredProcedure(Sincronizador.java:501) at adm.sincronizador.Sincronizador.access$3(Sincronizador.java:208) at adm.sincronizador.Sincronizador$1.run(Sincronizador.java:156) at java.util.TimerThread.mainLoop(Unknown Source) at java.util.TimerThread.run(Unknown Source) [/quote]

Você entendeu por que está dando este tipo de erro?
O problema é: oracle.sql.BLOB NÃO implementa java.sql.Blob. Então não adianta tentar fazer cast (implicito ou explicito) que não vai dar certo de jeito nenhum. Teria que achar um método que transforme de um para o outro. Não sei qual é este método, mas achei que transformando em byte[] talvez desse certo. Precisa ver os manuais da Oracle.

Eu tava estava com o mesmo problema!

resolvi criando o Blob da seguinte forma:

Blob blobOrdem = new javax.sql.rowset.serial.SerialBlob(campoBlob);