Charset do Oracle JDBC e limite de 4000 caracteres

Estamos tentando armazenar uma String codificada em UTF-16 em um banco de dados Oracle do AL32UTF8.

Nosso programa funciona perfeitamente em um banco de dados que usaWE8MSWIN1252 como charset. Quando tentamos executá-lo em um banco de dados que usaAL32UTF8 chega a umjava.sql.SQLException: ORA-01461: can bind a LONG value only for insert into a LONG column.

No testcase abaixo tudo funciona bem contanto que nossos dados de entrada não fiquem muito longos.

A string de entrada pode exceder 4000 caracteres. Queremos manter o máximo de informação possível, mesmo sabendo que a entrada terá que ser cortada.

Nossas tabelas de banco de dados são definidas usando oCHAR palavra-chave (veja abaixo). Esperávamos que isso nos permitisse armazenar até 4000 caracteres de qualquer conjunto de caracteres.Isso pode ser feito? Se sim, como?

Nós tentamos converter o String paraUTF8 usando umByteBuffer sem sucesso.OraclePreparedStatement.setFormOfUse(...) também não nos ajudou.

Mudar para umCLOB não é uma opção. Se a corda for muito longa, ela precisa ser cortada.

Este é o nosso código no momento:

public static void main(String[] args) throws Exception {
    String ip ="193.53.40.229";
    int port = 1521;
    String sid = "ora11";
    String username = "obasi";
    String password = "********";

    String driver = "oracle.jdbc.driver.OracleDriver";
    String url = "jdbc:oracle:thin:@" + ip + ":" + port + ":" + sid;
    Class.forName(driver);

    String shortData = "";
    String longData = "";
    String data;

    for (int i = 0; i < 5; i++)
        shortData += "é";

    for (int i = 0; i < 4000; i++)
        longData += "é";

    Connection conn = DriverManager.getConnection(url, username, password);

    PreparedStatement stat = null;
    try  {
        stat = conn.prepareStatement("insert into test_table_short values (?)");
        data = shortData.substring(0, Math.min(5, shortData.length()));
        stat.setString(1, data);
        stat.execute();

        stat = conn.prepareStatement("insert into test_table_long values (?)");
        data = longData.substring(0, Math.min(4000, longData.length()));
        stat.setString(1, data);
        stat.execute();
    } finally {
        try {
            stat.close();
        } catch (Exception ex){}
    }
}

Este é o script de criação da tabela simples:

CREATE TABLE test_table_short (
    DATA    VARCHAR2(5 CHAR);
);

CREATE TABLE test_table_long (
    DATA    VARCHAR2(4000 CHAR);
);

O caso de teste funciona perfeitamente nos dados curtos. Nos dados longos, no entanto, continua recebendo o erro. Mesmo quando o nossolongData tem apenas 3000 caracteres, ainda não executa com sucesso.

Desde já, obrigado!

questionAnswers(2)

yourAnswerToTheQuestion