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
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) {}
}