Upload - Blob no oracle

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,

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

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,

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:

[code]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() );  

[/code]

Versão atual do banco: 10g;

att

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.

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”

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.

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…