Tag: blob

Como recuperar e escrever campos CLOB

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.


Inserindo arquivos em campos BLOB de uma base de dados

Para inserir um arquivo, seja ele de qualquer formato, é necessário utilizar o método setBinaryStream implementado pelo PreparedStatement.

PreparedStatemente.setBinaryStream(int índice, Inputstream is, int tamanho);

Para o exemplo definimos uma tabela chamada arquivo que contém um campo BLOB chamado ARQ.

//Conexão normal, como qualquer JDBC
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@<IP>:<PORTA>:<SID>","<USUARIO>","<SENHA>");

//Acessando o arquivo a ser enviado e recuperando um InputStream
File arquivo = new File("<CAMINHO_COMPLETO_DO_ARQUIVO>");
FileInputStream fis = new FileInputStream(arquivo);

//Preparando a chamada normalmente
PreparedStatement ps = conn.prepareStatement("INSERT INTO ARQUIVO (arq) VALUES(?)");

//Informando o inputstream e o tamanho do arquivo a ser enviado
ps.setBinaryStream(1, fis, (int)arquivo.length());

ps.execute();

ps.close();
conn.close();

No meu teste utilizei a base de dados Oracle 8i. Como não tenho à disposição uma base MySQL/PostgreSQL/MS SQL Server, deixo vocês encarregados de testar e me enviar os resultados, OK? ;)

[]‘s e até a próxima!


  • AdSense

  • Copyright © 1996-2010 André L. S.. All rights reserved.
    iDream theme by Templates Next | Powered by WordPress