ClassCastException - Blob -&gt BLOB (Oracle)

11 respostas
fabim

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:

11 Respostas

J

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.

ramilani12

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;
fabim

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:

fabim

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

O

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()));
fabim

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

O

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???

fabim

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)
fabim

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…

O

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?

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)

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.

lsouzabr

Eu tava estava com o mesmo problema!

resolvi criando o Blob da seguinte forma:

Blob blobOrdem = new javax.sql.rowset.serial.SerialBlob(campoBlob);
Criado 15 de março de 2007
Ultima resposta 14 de jun. de 2014
Respostas 11
Participantes 5