Слияние констант в одной таблице с CLOB с использованием JDBC - PullRequest
0 голосов
/ 03 ноября 2008

В качестве продолжения этого вопроса мне нужна помощь по следующему сценарию:

В Oracle дана простая таблица данных:

create table data (
    id       VARCHAR2(255),
    key      VARCHAR2(255),
    value    CLOB);

Я использую следующую команду слияния:

merge into data
using (
    select
        ? id,
        ? key,
        ? value
    from
        dual
) val on (
    data.id=val.id
    and data.key=val.key
)
when matched then 
    update set data.value = val.value 
when not matched then 
    insert (id, key, value) values (val.id, val.key, val.value);

Я вызываю запрос через JDBC из приложения Java.

Когда строка "value" велика, приведенный выше запрос приводит к следующей ошибке Oracle:

ORA-01461: cannot bind a LONG value for insert into a long column

Я даже установил свойство "SetBigStringTryClob", как описано здесь с тем же результатом.

Можно ли добиться желаемого поведения, учитывая, что "value" - это CLOB?

РЕДАКТИРОВАТЬ: клиентская среда Java

1 Ответ

2 голосов
/ 04 ноября 2008

Вы не упомянули конкретно в своем посте, но, судя по тэгам для вопроса, я предполагаю, что вы делаете это с Java.

У меня был успех с таким кодом в проекте, который я только что закончил. В этом приложении используется Unicode, поэтому могут быть более простые решения, если ваша проблемная область ограничена стандартным набором символов ASCII.

Используете ли вы в настоящее время метод OracleStatement.setCLOB ()? Это ужасно неловкое дело, но мы не могли обойти это иначе. Вы должны фактически создать временный CLOB, а затем использовать этот временный CLOB в вызове метода setCLOB ().

Теперь я извлек это из работающей системы, и мне пришлось внести несколько специальных изменений, поэтому, если это не сработает в вашей ситуации, дайте мне знать, и я вернусь, чтобы увидеть если я могу получить меньший рабочий пример.

Это, конечно, предполагает, что вы используете драйверы JDBC Oracle Corp. (ojdbc14.jar или ojdbc5.jar), которые находятся в $ ORACLE_HOME / jdbc / lib

CLOB tempClob = CLOB.createTemporary(conn, true, CLOB.DURATION_SESSION);


// Open the temporary CLOB in readwrite mode to enable writing
tempClob.open(CLOB.MODE_READWRITE);

// Get the output stream to write
Writer tempClobWriter = tempClob.getCharacterOutputStream();

// Write the data into the temporary CLOB
tempClobWriter.write(stringData);

// Flush and close the stream
tempClobWriter.flush();
tempClobWriter.close();

// Close the temporary CLOB
tempClob.close();

myStatement.setCLOB(column.order, tempClob);

С уважением, Дуэйн Кинг

...