Desenvolvimento - Java

Manipulando um Campo CLOB no Oracle via Java

Vamos mostrar neste artigo como escrever o conteúdo de um arquivo em um campo CLOB do Oracle via Java.

por Equipe Linha de Código



Por Fundão da Programação

Vamos mostrar neste artigo como escrever o conteúdo de um arquivo em um campo CLOB do Oracle via Java. Mas antes de mostrar o código Java, segue uma pequena introdução sobre tipos LOBs no Oracle.

Large Objects no Oracle

Large Objects, ou LOBs, no Oracle podem ser de dois tipos dependendo da sua localização com relação ao banco de dados - LOBs internos ou LOBs externos (BFiles). Os tipos de dados externos são mapeados internamente par tipos de dados do C++.

LOBs internos, como seu nome sugere, são armazenados dentro de tabelas do banco de dados de forma a otimizar espeço e prover acesso eficiente.

LOBs externos, também chamados de BFILES, são objetos de dados binários grandes armazenados nos arquivos do sistema operacional fora das tabelas do banco de dados. Esses arquivos usam semântica de referência. Eles podem estar localizados no disco rígido, CDROMs ou qualquer dispositivo de armazenagem.

CLOB

CLOB é um tipo de dado externo do Oracle. O tipo de dado externo CLOB armazena dados de tamanho fixo ou variável no formato de caracteres. Um CLOB pode armazenar até 4 gigabytes de dados de caracteres. CLOBs tem completo suporte transacional. Manipulações de valores de CLOBs podem sofrer commits ou rollbacks. Você não pode salvar um CLOB em uma variável em uma transação e então usá-lo em outra transação ou sessão.

Código Java

Como o código abaixo mostra, primeiro criamos um registro com um CLOB vazio na tabela e depois obtemos o handler do CLOB para escrever nele o arquivo que queremos.
try
{

   DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

   Connection conn = 
       (OracleConnection)
        DriverManager.getConnection("jdbc:oracle:thin:@nome-servidor:nu-porta:sid",
        			    "scott", "tiger");

   Statement stmt = conn.createStatement();

   int rows = stmt.executeUpdate(
		   "insert into minha_tabela (co_id, vl_parametro) " +
		   "values (1, empty_clob())");

   System.out.println("\n" + rows + " linha(s) inseridas");

   // Obtendo handler para o CLOB para inserir o conteúdo do arquivo
   ResultSet rs = 
	(OracleResultSet)stmt.executeQuery("select vl_parametro 
	 				    from minha tabela 
					    where co_parametro = 1");
   if( rs.next() )
      descricao = rs.getCLOB(1);
   else
      throw new RuntimeException("Não foi possível obter o manipulador do " +
	  	                 "CLOB do banco de dados");

   rs.close();
   rs = null;

   // Obtendo o handler do arquivo que desejamos colocar no CLOB
   File characterFile = new File( "c:\\arquivoteste.txt" );
   fin  = new FileReader(characterFile);
   char[] buffer = new char[descricao.getBufferSize( )];
   out = descricao.getCharacterOutputStream( );
   int length = 0;
   while ((length = fin.read(buffer)) != -1) {
      out.write(buffer, 0, length);
   }
   // Deve fechar o stream antes do commit,
   // senão perde-se as alterações
   out.close( );
   out = null;
   fin.close( );

   conn.commit();
}
catch(SQLException se)
{
   se.printStackTrace();
}
catch(IOException ioe)
{
   System.out.println("Erro de E/S");
}
finally
{
   if( stmt != null )
       try { stmt.close(); } catch(SQLException ignore) {}
   if( conn != null )
       try { conn.close(); } catch(SQLException ignore) {}
}

Equipe Linha de Código

Equipe Linha de Código