Pessoal, preciso inserir uma quantidade grande de caracteres no Oracle. Vi que se faz isso através de campos CLOB. Estou tentando ler escrever dados nesse campo, mas li alguma coisa que o campo CLOB do Oracle não aceita via PreparedStatement e Driver Thin inserção de dados maiores que 4k. Alguém já viu alguma coisa sobre isso? Alguém tem algum exemplo pra me fornecer de como então ler e gravar dados, via java, nesse tipo de campo?
Oi,
Realmente o driver thin não aceita CLOBs acima de 4K (pelo menos no Oracle 8 ). Descobri isso quando tentava salvar strings grandes via Hibernate. Acabei até tendo que implementar um hibernate type pra CLOB e outro BLOB.
Depois de muito pesquisar, descobri que tem como fazer ele gravar acima você usar outro driver e outra string de conexão (jdbc:oracle:oci8:@sei.la.aonde).
E só funciona se você pegar o dado como stream (vide código abaixo).
Reader clobReader = null;
clobReader = ResultSet.getCharacterStream(columnName);
A gravação funciona normal (vide código abaixo):
String clob = “string_muito_grande”;
PreparedStatement.setString(columnIndex, clob);
Tulius
//MÉTODO UTILIZADO PARA TRANSFORMAR O STRING EM UM CLOB
private static CLOB getCLOB( String clobData ){
CLOB tempClob = null;
try {
tempClob = new CLOB((oracle.jdbc.OracleConnection)conn,clobData.getBytes());
} catch (Exception exp) {
System.out.println(“erro”+exp);
}
return tempClob;
}
Mas dessa forma estaria usando classe de conexão proprietária da Oracle não? Tinha que ser algo “puro” do JDK SUN mesmo. Eu utilizo Oracle 9i. Então não tem jeito mesmo de manipular clobs com driver thin? Preciso usar OCI?
eae galera! tô no mesmo dilema …
uso o hibernate com o oracle usando um driver thin. Mas os campos CLOBs mapeados para String em Java, são setados como null quando salvo.
Qual seria o driver a ser utilizado nesse caso?
[quote=Gustavo.foa]eae galera! tô no mesmo dilema …
uso o hibernate com o oracle usando um driver thin. Mas os campos CLOBs mapeados para String em Java, são setados como null quando salvo.
Qual seria o driver a ser utilizado nesse caso?[/quote]
Use este método para converter para string antes de setar o valor:
public String getValueStringCLOB(oracle.sql.CLOB clob){
String s = “”;
int y = 0;
try {
y = (int) clob.length();
s = y > 0 ? clob.getSubString(1, y) : “”;
} catch (Exception ex) {
System.out.println("Erro ler CLOB: " + y);
} finally{
return s;
}
}