Слияние констант в одной таблице с CLOB с использованием JDBC
В продолжение этого вопроса мне нужна помощь по следующему сценарию:
В 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 ответ
Вы не упомянули конкретно в своем посте, но, судя по тегам вопроса, я предполагаю, что вы делаете это с 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);
С уважением, Дуэйн Кинг