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.
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ê.
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.
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.