O Character Large Object (ou CLOB), como o próprio nome já diz, é um tipo de campo muito comum em Bancos de Dados usado para armazenar textos com uma quantidade enorme de caracteres.
No MySQL, por exemplo, o tipo CLOB está descrito como MEMO, mas a função é a mesma.
Estes dias precisei recuperar um valor de um campo CLOB que era retornado por um SELECT, como nunca tinha utilizado este campo no Java, resolvi escrever este pequeno tutorial como um memorando e, também, ajudar a quem precisar.
Escrevendo valores em campo CLOB
O método do PreparedStatement utilizado para a gravação de um CLOB é o setAsciiStream, passando a posição do campo CLOB, o InputStream dos dados e o ponto final de leitura do InputStream.
ps.setAsciiStream(posicaoClob, inputStream, tamanhoDoTexto);
Exemplo funcional:
String sql = "INSERT INTO TESTE (texto) VALUES(?)";
try{
String txt = leArquivoTxt();
ByteArrayInputStream bais = new ByteArrayInputStream(txt.getBytes());
PreparedStatement ps = conexao.prepareStatement(sql);
//Campo CLOB é a '?' que está na posição 1 do INSERT
ps.setAsciiStream(1, bais, txt.length());
ps.execute();
ps.close();
}catch (Exception e) {
e.printStackTrace();
}
Recuperando valor de um campo CLOB
Como executamos um SELECT, será necessário capturar o ResultSet , iterar as linhas e chamar o método para a recuperação de um CLOB é o getClob, passando a posição em que o campo se encontra na query ou, simplesmente, o nome da coluna.
rs.getClob("xml");
Exemplo funcional:
String sql = "SELECT xml FROM TESTE";
try{
PreparedStatement ps = conexao.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while(rs.next()){
Clob clob = rs.getClob("xml");
BufferedReader reader = new BufferedReader(clob.getCharacterStream());
StringBuffer strBuf = new StringBuffer();
String linha = null;
while((linha = reader.readLine()) != null){
strBuf.append(linha);
//Character.LINE_SEPARATOR insere a quebra de linha
strBuf.append((char)Character.LINE_SEPARATOR);
}
System.out.println("=========== CLOB ===========");
System.out.println(strBuf.toString());
}
rs.close();
ps.close();
}catch (Exception e) {
e.printStackTrace();
}
É isso aí. Simples, fácil e indolor.
Caso queiram, podem baixar a aplicação de exemplo aqui
Para recuperar um campo BLOB veja este tópico.