Upload - Blob no oracle

7 respostas
L

Olá pessoal,

Estou tentando inserir um arquivo em um campo blob no oracle9i. Segue parte do meu código:

rs = stm.executeQuery();
           
            if (rs.next()) {   
                Blob blob = rs.getBlob(1);
                byte[] bbuf = new byte[1024];   
                InputStream bin = arquivo.getInputStream();   
                OutputStream bout = ((BLOB) blob).getBinaryOutputStream(); // específico driver oracle  
                
                int bytesRead = 0;   
                while ((bytesRead = bin.read(bbuf)) != -1) {   
                    bout.write(bbuf, 0, bytesRead);   
                }   
                bin.close();   
                bout.close(); 
           }

Porém quando ele executa a linha do driver especifico ele dá o seguinte erro:

java.lang.ClassCastException: oracle.sql.BLOB cannot be cast to oracle.sql.BLOB

Alguém tem alguma idéia do que eu possa estar fazendo de errado?

Obrigada,

7 Respostas

F

Mas é a mesma classe, será que poderia ser a versão do driver?

L

Então, estou usando a versão do oracle9i, ojdb14_g.jar

E alterei o meu código para :

if (rs.next()) {   
                BLOB blob = ((OracleResultSet)rs).getBLOB("email");
                os = blob.getBinaryOutputStream();
                final File f = new File(arquivo.getName());
                is = new FileInputStream(f);
                final byte[] buffer = new byte[blob.getBufferSize()];
                int bytesRead = 0;
                while((bytesRead = is.read(buffer)) != -1) {
                        os.write(buffer, 0, bytesRead);
                }
                blob = null;
           }

Porém agora ele dá o seguinte erro:

java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.DelegatingResultSet cannot be cast to oracle.jdbc.OracleResultSet

Tentei colocar a versão do ojdbc14_g do oracle10, porém ele não permite usar o comando getBinaryOutputStream().

Se alguém puder me ajudar, pois estou tentando apenas inserir um arquivo em um campo BLOB do oracle9i.

Obrigada,

D

Acho que esses links podem te ajudar:

http://forums.sun.com/thread.jspa?threadID=736236&messageID=4249694

http://forums.sun.com/thread.jspa?messageID=2522456

Eu tenho utilizado dessa forma para salvar no banco:
OutputStream blobOutputStream = rs.getBinaryOutputStream();   
blobOutputStream.write(buffer, 0, tamanho);     
blobOutputStream.close();
e assim para ler:
while( rs.next() ) {   
    do {   
        qde++;   
        codigo = rs.getString(1);   
        arq = rs.getBlob(2);   
           
        try {   
            // tenta ler o blob   
            bin = arq.getBinaryStream();   
            bytesRead = bin.read(bbuf);   
            // se chegou aqui ta tudo certo...   
        } catch( Exception e ) {   
            // o blob deve estar corrompido   
            psIns.setString(1,codigo);   
            psIns.executeUpdate();   
            log.warning("Blob corrompido: "+codigo);   
        }   
    } while( rs.next() );

Versão atual do banco: 10g;

att

L

Olá,

Atualizei para o driver da versão 10g, porém ele não permite que eu utilize o comando :

OutputStream blobOutputStream = rs.getBinaryOutputStream();

Pois este comando não existe mais.

L

Atualizando o driver para o 10g, fiz uma alteração no código para:

Blob mapBlob = rs.getBlob(1); // Guarda ponteiro do campo blob 
    OutputStream blobOutputStream = mapBlob.setBinaryStream(0);   
    blobOutputStream.write(arquivo.get()); // Atualiza campo blob   
    blobOutputStream.close();

Porém quando ele executa a segunda linha ele dá um erro de “Recurso não suportado”

M

Voce usa algum framework para persistencia ? Geralmente eles possuem os proprios tipos. Estou tendo mt sucesso ao usar Blod do proprio Hibernate por exemplo. Mas com oracle.sql nao tive problemas.

L

Então, infelizmente neste projeto que estou atualmente é jsp e servlets puro, não estão utilizando nenhum framework e para o banco de dados tb é direto…

Criado 24 de setembro de 2008
Ultima resposta 26 de set. de 2008
Respostas 7
Participantes 4