Cast OracleResultSet

Olá pessoal,

Estou usando oracle9i e java para Web com Servlet e jsp e estou tentando fazer o upload de um arquivo em um campo Blob, porém quando tento fazer o cast do OracleResultSet ele não permite.

Código utilizado:

Conexao con = new Conexao();

    OracleResultSet rs = null;
    PreparedStatement stm = null;
    InputStream is = null;
OutputStream os = null;
             
    try {
        StringBuffer sb = new StringBuffer();
    
         
        sb.append("select email FROM FIN_OBSERVACAO_TITULO where seq_obs_tit = ? for update");
        
        stm = conexao.prepareStatement(sb.toString());
        
        stm.setString(1, String.valueOf(dadosSaida.getSeqObsTitulo()));
        rs = (OracleResultSet)stm.executeQuery();
           
        if (rs.next()) {   
            BLOB blob = rs.getBLOB(1);   
            byte[] bbuf = new byte[1024*5];   
            InputStream bin = new FileInputStream(arquivo.getName());   
            OutputStream bout = blob.getBinaryOutputStream(); // específico driver oracle 
            int bytesRead = 0;   
            while ((bytesRead = bin.read(bbuf)) != -1) {   
                bout.write(bbuf, 0, bytesRead);   
            }   
            bin.close();   
            bout.close();   

       }   

Erro exibido:

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

Se alguém pude me ajudar eu agradeço, pois não estou conseguindo visualizar o que posso estar fazendo de errado.

Obrigada,

getInnermostDelegate

A idéia é a seguinte: pegue o tal ResultSet, efetue o cast para um DelegatingResultSet, e então chame getInnermostDelegate(). Isso talvez seja um OracleResultSet; se for, então você pode fazer o que precisa fazer.

Se você acha tudo isso muito porco mas está usando o Spring, então pode usar uma classe chamada CommonsDbcpNativeJdbcExtractor que faz esse trabalho sujo para você.

Na realidade o getInnermostDelegate() retorna um ResultSet também, e nesse caso preciso de um OracleResultSet.

E infelizmente não estou usando um spring.

O que estou dizendo mais ou menos é que você viu que o getInnermostDelegate lhe retorna um objeto cuja classe implementa ResultSet; pode ser que essa classe seja “castable” para OracleResultSet. Por favor, pelo menos imprima o nome da classe que getInnermostDelegate lhe retorna.

Vamos ver se entendi direito…

Fiz a seguinte alteração:

       stm.setString(1, String.valueOf(dadosSaida.getSeqObsTitulo()));
                   
       DelegatingResultSet rsl = (DelegatingResultSet)stm.executeQuery();
       rs = rsl.getInnermostDelegate();
                    
       if (rs.next()) {   
            BLOB blob =((OracleResultSet)rs).getBLOB(1);   
            byte[] bbuf = new byte[1024*5];  
      .
      .
      .

Porém agora aparece o seuinte erro:

java.lang.ClassCastException: oracle.jdbc.driver.OracleResultSetImpl cannot be cast to oracle.jdbc.driver.OracleResultSet

Será que não entendi direito o que vc explicou?

Você entendeu direitinho.

Então ele lhe retorna um oracle.jdbc.driver.OracleResultSetImpl (eu não tinha como saber, já que não tenho um Oracle aqui para testar); veja se pelo menos essa classe contém os métodos que você precisa.

Senão, você pode pegar um org.apache.tomcat.dbcp.dbcp.DelegatingConnection (ou coisa parecida), e pegar a conexão nativa do Oracle em vez de pegar o resultset nativo do Oracle.

Como você deve ter percebido, trabalhar diretamente com as classes do Oracle quando você usa um pool é um pouco chato.