2008-11-03 74 views
0

作爲後續this question,我需要有以下情形幫助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); 

我從Java應用程序通過JDBC調用查詢。

當「值」串大,則上述查詢結果在以下Oracle錯誤:

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

我即使設置了「SetBigStringTryClob」屬性作爲具有相同的結果記錄here

是否有可能實現我想要的行爲,因爲「value」是CLOB?

編輯:客戶端環境的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,然後在setCLOB()方法調用中使用該臨時CLOB。

現在,我已經從一個工作系統中撕下了這個,並且必須做一些臨時調整,所以如果這在您的情況下不起作用,請告訴我,我會回到看看我能否得到一個更小的工作示例。

當然,這假設你正在使用的Oracle公司的JDBC驅動程序(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); 

問候, 德韋恩王

+0

Ahhh ...創建一個臨時CLOB。有趣。讓我試試看,如果它與我的「合併」聲明相一致,我會告訴你。 – 2008-11-04 16:58:08