Olá pessoal,
depois de ter uma otima ajuda do grupo de como resolver o problema de como consultar o campo tipo Clob do Oracle para visualizar o texto com quebra de paragrafo em uma pagina HTML. Agora estou tendo o mesmo tipo de problema para gravar no campo Clob, ou seja, a gravação perde a quebra de paragrafo, amuntuando o texto.
Gostaria de pedir ajuda dos colegas em mais essa pendega.
packagebr.com.conpro.negocios;importjava.io.*;importjava.sql.*;importjavax.servlet.*;importjavax.servlet.http.*;importbr.com.conpro.negocios.ConexaoOra;publicclassGravaAndamentoextendsHttpServlet{protectedvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.setContentType("text/html;");response.setCharacterEncoding("iso-8859-1");StringdataAnd=request.getParameter("data");Stringandamento=request.getParameter("andamento");StringidRegistro=request.getParameter("idreg");Stringnprocesso=request.getParameter("nprocesso");// -------------------------------------------------------------------- Connectionconn=ConexaoOra.obterConexao();if(ConexaoOra.conn==null){response.getWriter().write("A conexão com Oracle falhou");return;}StringSQL="update andamentos set andamento = '"+andamento+"', and_html = '"+andamento+"', data = '"+dataAnd+"' where id_reg = '"+idRegistro+"' ";StatementstmAnd=ConexaoOra.stm;try{ResultSetand=stmAnd.executeQuery(SQL);}catch(SQLExceptione){response.getWriter().write("Mensagem do sistema: "+e.getMessage()+" SQL:"+SQL);}//-------------------------------------------------------------------- response.getWriter().write("Gravado com sucesso...");}}
Para gravar é um campo CLOB é o mesmo procedimento para gravar um Blob , como CLOB é um Character Large vc precisa transformar em um array de Char
Stringstr=suastring;java.sql.Clobclob=newSerialClob(str.toCharArray());PreparedStatementstmt=conexao.prepareStatement("insert into tabela(campo_blob) values(?)");stmt.setClob(1,clob);stmt.executeUpdate();
Aconselho a usar PrepareStatement alem de ser mais rapido que Statement evite esses SQLInjection
C
carlosgeiser
Olá ramilani12,
valeu a dica sobre o PrepareStatement, andei fazendo umas pesquisadas sobre o mesmo fiz uns testes gosei, muito bom.
Mas infelizmente não consegui fazer funcionar a dica de como trabalhar com a linha: "java.sql.Clob clob = new SerialClob(str.toCharArray());"
deu problema, será que tem algo que deixei escapar ?
O codigo de teste segue abaixo para uma possivel analise.
Grato.
packagebr.com.conpro.web;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.SQLException;importjavax.sql.rowset.serial.SerialClob;importbr.com.conpro.negocios.ConexaoOra;publicclassTestePrepareStatement{publicstaticvoidmain(String[]args){Connectionconn=ConexaoOra.obterConexao();Stringstr="andamento do processo";try{java.sql.Clobclob=newSerialClob(str.toCharArray());PreparedStatementstmt=conn.prepareStatement("insert into tabela1(campo1, campo2) values(?,?)");stmt.setString(1,"valor");stmt.setClob(2,clob);stmt.executeUpdate();}catch(SQLExceptione){System.out.print("Mensagem do sistema: "+e.getMessage());return;}System.out.print("Gravado com sucesso...");}}
Olá NBLUIS,
com todo respeito, mas achei muito confuso é complicado a pagina sugerida. Andei tentado fazer uns tentativa seguindo a pagina mas sem sucesso.
N
nbluis
Cara, a ultima vez que eu fiz isso(faz algum tempo), peguei uma documentação da oracle que indicava o seguinte.
Primeiro faz a inserção e no campo da foto coloca o empty_blob, depois faz um select e obtem um objeto blob para só então carrega-lo.
Abaixo um exemplo do meu codigo que achei aqui, ele salvava uma foto no banco oracle…
Statementstm;ResultSetrs;Connectionconn=getConnection();Blobblob;stm=conn.createStatement();stm.executeUpdate("insert into fotos(foto) VALUES(empty_blob())");conn.setAutoCommit(false);rs=stm.executeQuery("select foto from fotos for update");if(rs.next()){blob=rs.getBlob(1);}else{thrownewException("Erro ao carregar manipulador de imagens");}byte[]buf=newbyte[10*1024];InputStreamin=newFileInputStream(newFile(arquivo));OutputStreamout=((oracle.sql.BLOB)blob).getBinaryOutputStream();intread=0;while((read=in.read(buf))!=-1){out.write(buf,0,read);}in.close();out.close();rs.close();conn.commit();conn.setAutoCommit(true);
Até mais…
N
nbluis
AAA, esse objeto oracle.sql.BLOB é da api JDBC da oracle…
Até…
R
ramilani12
carlosgeiser:
ramilani12:
Olá Carlos
que exception foi lançada?
Olá Ramilani, Desculpe ai o meu fraco Java, ainda não estou familiarizado com toda logica da programação Java. O que é extamente “exception lançada” ?
Olá Carlos em qual IDE vc está trabalhando?
Exception é algum tipo erro que aconteceu em fluxo ou seja são situações excepcionais e geralmente indesejáveis que podem ocorrer durante a execução de um programa
try{// exceutou o processo perfeito}catch(SQLException){// aconteceu algum erro de SQL ex.printStatckTrace();}
Veja no console da IDE se houve alguma exceção
C
carlosgeiser
Beleza Ramilani,
agora saquei o que é exception, e estou sim usando exception:
Connectionconn=ConexaoOra.obterConexao();Stringstr="andamento do processo";try{java.sql.Clobclob=newSerialClob(str.toCharArray());PreparedStatementstmt=conn.prepareStatement("insert into tabela1(campo1, campo2) values(?,?)");stmt.setString(1,"valor");stmt.setClob(2,clob);stmt.executeUpdate();}catch(SQLExceptione){System.out.print("Mensagem do sistema: "+e.getMessage());return;}System.out.print("Gravado com sucesso");}}
Estou usando Eclipse.
Quando eu executo no Eclipse para testar a classe aparece no console:
Vc está fazendo um cast de javax.sql.rowset.serial.SerialClob para oracle.sql.CLOB
E não pode e vc deve usar java.sql.Clob essa classe é uma interface e SerialClob fornece implementação para java.sql.Clob
C
carlosgeiser
Caro Ramilani,
o que compreendi na sua explicação é que está errado. Já estava mesmo disconfido que estava “misturando as bolas”
Já estou com esse problema a três dias e já estou ficando descorçoado, o que já andei pesquisando no Google não é brincadeira. Então se não for pedir muito, você ou alguns outro colega poderia informar um exemplo da sintaxe de como gravar em um campo CLOB onde a quebra de paragrafo não se perca.