Gravar campo Clob (Oracle) X Servlet

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.


package br.com.conpro.negocios;

import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
import br.com.conpro.negocios.ConexaoOra;


public class GravaAndamento extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

	response.setContentType("text/html;");
	response.setCharacterEncoding("iso-8859-1");

	
	String dataAnd = request.getParameter("data");
	String andamento = request.getParameter("andamento");
	String idRegistro = request.getParameter("idreg");
	String nprocesso = request.getParameter("nprocesso");

	
//	--------------------------------------------------------------------	
	Connection conn = ConexaoOra.obterConexao();
	if (ConexaoOra.conn == null){
		response.getWriter().write("A conexão com Oracle falhou");
		return;
	}

	String SQL = "update andamentos set andamento = '"+andamento+"', and_html = '"+andamento+"', data = '"+dataAnd+"'  where id_reg = '"+idRegistro+"' ";
	
	Statement stmAnd = ConexaoOra.stm;
	try{		
		ResultSet and = stmAnd.executeQuery(SQL); 
    	
		} catch (SQLException e) {	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

String str = sua string;
java.sql.Clob clob = new SerialClob(str.toCharArray());

PreparedStatement stmt = 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

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.



package br.com.conpro.web;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import javax.sql.rowset.serial.SerialClob;

import br.com.conpro.negocios.ConexaoOra;

public class TestePrepareStatement {

	public static void main(String[] args) {

	Connection conn = ConexaoOra.obterConexao();


String str = "andamento do processo";


try{		

java.sql.Clob clob = new SerialClob(str.toCharArray());	

PreparedStatement stmt =  conn.prepareStatement("insert into tabela1(campo1, campo2) values(?,?)");
stmt.setString(1, "valor");
stmt.setClob(2, clob);
stmt.executeUpdate();			
			
			
} 

catch (SQLException e) {	System.out.print("Mensagem do sistema: "+e.getMessage()   ) ; return;	}


System.out.print("Gravado com sucesso...");


}
}



Olá Carlos

que exception foi lançada?

Abaixo link com outro exemplo
http://www.oracle.com/technology/sample_code/tech/java/codesnippet/jdbc/clob10g/handlingclobsinoraclejdbc10g.html

[quote=ramilani12]Olá Carlos

que exception foi lançada?[/quote]

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” ?

[quote=nbluis]Abaixo link com outro exemplo
http://www.oracle.com/technology/sample_code/tech/java/codesnippet/jdbc/clob10g/handlingclobsinoraclejdbc10g.html[/quote]

Olá NBLUIS,
com todo respeito, mas achei muito confuso é complicado a pagina sugerida. Andei tentado fazer uns tentativa seguindo a pagina mas sem sucesso.

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…

Statement stm;
ResultSet rs;
Connection conn = getConnection();

Blob blob;
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 {
  throw new Exception("Erro ao carregar manipulador de imagens");
}

byte[] buf = new byte[10 * 1024];

InputStream in = new FileInputStream(new File(arquivo));
OutputStream out = ((oracle.sql.BLOB) blob).getBinaryOutputStream();

int read = 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…

AAA, esse objeto oracle.sql.BLOB é da api JDBC da oracle…

Até…

[quote=carlosgeiser][quote=ramilani12]Olá Carlos

que exception foi lançada?[/quote]

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” ?[/quote]

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

Dê uma lida aqui: http://blog.caelum.com.br/2006/10/07/lidando-com-exceptions/

como vc definiu


try
{
  // exceutou o processo perfeito
} catch(SQLException)
{
   // aconteceu algum erro de SQL   
   ex.printStatckTrace();
}

Veja no console da IDE se houve alguma exceção

Beleza Ramilani,

agora saquei o que é exception, e estou sim usando exception:

Connection conn = ConexaoOra.obterConexao();


String str = "andamento do processo";

try{		

java.sql.Clob clob = new SerialClob(str.toCharArray());

PreparedStatement stmt =  conn.prepareStatement("insert into tabela1(campo1, campo2) values(?,?)");
stmt.setString(1, "valor");
stmt.setClob(2, clob);
stmt.executeUpdate();			
			
			
} 

catch (SQLException e) {	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:

Exception in thread “main” java.lang.ClassCastException: javax.sql.rowset.serial.SerialClob cannot be cast to oracle.sql.CLOB
at oracle.jdbc.driver.OraclePreparedStatement.setClob(OraclePreparedStatement.java:2096)
at br.com.conpro.web.TestePrepareStatement.main(TestePrepareStatement.java:31)

Problema é o seguinte :

 Exception in thread "main" java.lang.ClassCastException: javax.sql.rowset.serial.SerialClob cannot be cast to oracle.sql.CLOB 

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

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.

[color][/color]