2014-06-11 39 views
0

我需要爲Oracle數據庫11g r2中的CLOB數據類型分配一個大約30,000行的非常大的xml數據。我在Oracle Sql Developer中使用這個命令。字符串文字太長 - 如何將長xml數據分配給oracle 11g中的clob數據類型r2

當我使用以下命令時,首先我得到7個提示entering quote value,然後當語句執行完成時,我得到 - '字符串字符太長'的錯誤。

update tablename set columnName = 'large xml data' where id=1; 

我在xml數據中使用了7個雙引號(單引號)來轉義單引號。

如何將此數據分配給CLOB列?

+0

30,000 *行*,不是字符?這是從哪裏來的?你最好從服務器端的文件中加載它,而不是在SQL Developer中複製它。如果它小於32k *字符* [那麼這是這個問題的重複](http://stackoverflow.com/q/8801814/266304)。否則,你需要以塊的形式附加數據。 –

+0

它是900K字符。我直接將其粘貼到SQL開發人員。我是.Net小夥,所以不瞭解oracle。我如何從文件複製到查詢中? – teenup

+0

如果文件位於數據庫服務器上,[像這樣](http://stackoverflow.com/a/17299257/266304)(但隨後將xmlClob放入您的表中,而不是在問題出現時將其循環)。否則[這可能是有用的](http://stackoverflow.com/a/6675650/266304),但附加大塊的實際數據,而不是星號... –

回答

2

一種方法是使用sqlldr。首先,創建一個小的保持表:

create table tstclob 
(
id number, 
doc clob 
); 

假設你的大文件是文件 「C:\ DATA \ test_doc.txt」,創建一個SQLLDR控制文件( 「test_doc.ctl」)來加載它:

load data 
infile * 
replace 
into table tstclob 
fields terminated by ',' 
(
ID char(1), 
lob_file FILLER char, 
    DOC LOBFILE(lob_file) TERMINATED BY EOF 
) 
begindata 
1,c:\data\test_doc.txt 

然後運行SQLLDR(在這種情況下,從C:\ data目錄):

sqlldr control=test_doc.ctl [email protected]/somepass 

然後,您可以更新任何表你想使用tstclob表。

+0

非常感謝,它的工作。但我完全不瞭解它。你能寫一個解釋嗎?爲什麼括號中有三個字段?只有兩個在begindata之後,什麼是infile關鍵字? – teenup

+0

沒問題。 sqlldr控制文件可能有點涉及,並有很多選項。請參閱[此處](http://docs.oracle.com/cd/B19306_01/server.102/b14215/ldr_control_file.htm#i1006645)以獲取更多詳細信息 – tbone

+0

還有一個鏈接[here](http://docs.oracle.com)。 com/cd/B19306_01/server.102/b14215/ldr_loading.htm#i1006993),其中給出了一些關於加載LOB的例子和細節 – tbone

相關問題