2011-07-13 117 views
2

請問大家請告訴我如何使用jdbc插入clob數據。 Iam使用oracle10g數據庫。如何在oracle 10g中使用jdbc插入大clob數據(> 4K字符)

我能夠使用下面2種方法

1.

tempClob.length()<4000){ 
    pstmnt.setClob(colNumber, tempClob); 
} 

2.

tempClob.length()<4000){ 
    Reader reader =tempClob.getCharacterStream(); 
    pstmnt.setClob(colNumber, tempClob); 
    pstmnt.setCharacterStream(colNumber, reader, new Long(tempClob.length()).intValue()); 
} 

當CLOB數據的長度是插入具有長度< 4000 CLOB數據大的例如abt 29k,這兩種方法都失敗了。

+0

他們爲什麼會失敗?你有例外嗎? – Kal

+0

請參閱:http://stackoverflow.com/a/8164127/330315 –

回答

-2

你試圖檢查該字段的最大尺寸... SELECT LENGTH(clobfield) FROM table

看場可容納的大小..

0

這裏是SOM的代碼,我發現躺在身邊,我覺得做什麼你想:

我有這樣一個靜態方法:

public class DBUtil { 
public static CLOB getCLOB(String innStr, Connection conn) throws SQLException, 
                IOException { 
    CLOB tempClob = null; 
    // If the temporary CLOB has not yet been created, create new 
    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(innStr); 

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

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

然後你就可以使用它像日是:

CLOB tempClob = DBUtil.getCLOB(longString, connection); 
pstmt.setCLOB(colnumber, tempClob); 

這需要整個CLOB內容是在一個字符串,所以這一切都加載到內存中,也許不適合你,但它已經工作了我的簡單的需求。

編輯:我應該注意到,我用這個代碼與plsql過程調用。有沒有直接與SQL

+0

我有數據要添加到數據庫已經作爲Clob。我相信上面的代碼是創建一個clob並插入它。我面臨的問題是,當數據長度大於4k時,它的失敗。非常感謝您的回答。 – aquero

+0

不需要那麼複雜。見Denis的答案或這裏:http://stackoverflow.com/a/8164127/330315 –

1

這部作品的Oracle11g測試它JDK5

tempClob.length()<4000){ 
    byte[] bytes = tempClob.getBytes(); 
    pstmnt.setCharacterStream(2, new StringReader(new String(bytes )), bytes.length); 
} 
相關問題