2008-11-03 2 views
0

В качестве последующих мер по this question, мне нужна помощи по следующему сценарию:Oracle одной таблица постоянная слияние с CLOB использованием JDBC

В Oracle, учитывая простую таблицу:

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

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

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.

Когда «значение» строка является большим, приведенные выше результаты запроса в следующей ошибки Oracle:

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

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

Возможно ли достичь поведения, которое я хочу, учитывая, что «значение» является CLOB?

EDIT: среда Клиент Java

+0

Здравствуйте. Не могли бы вы сообщить мне, как вы решили этот вопрос? Я очень похож на описанный здесь: http://stackoverflow.com/questions/43349999/jdbctemplate-insert-or-update-oracle-blob-using-sql-merge – kpater87 2017-04-11 19:25:14

ответ

2

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

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

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

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

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

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); 

С уважением, Dwayne King

+0

Ahhh ... создайте временный CLOB. Интересно. Позвольте мне попробовать, и я дам вам знать, хорошо ли это работает с моим заявлением о слиянии. – 2008-11-04 16:58:08

Смежные вопросы