我的表包含一個CLOB
字段,其長度可以超過32767個字節或字符。這意味着,如果我想從此CLOB
字段中提取所有字符,則必須將CLOB
分成塊,並將每個塊作爲SELECT
查詢語句中的不同列進行傳遞。如何在SELECT語句中動態添加列名(Oracle)
所以我有這個疑問:
SELECT dbms_lob.Substr(clob_field, dbms_lob.Getlength(clob_field), 1) AS data
FROM some_table
如果clob_field
太大這是行不通的。我的想法是製作長度爲2000的塊,並且對於每個塊,在SELECT
聲明中添加一列。
理念的概念:
var a = 1
var b = 2000
chunkAmountList = 1+(dbms_lob.Getlength(clob_field) mod 2000)
statement = "SELECT "
BEGIN
for chunk in chunkAmountList
statement = statement + "dbms_lob.Substr(clob_field, b, a) as data"
a = a + 2000
b = b + 2000
endloop
END
statement = statement + "FROM some_table"
statement.execute()
這將導致相同名稱不同的列(這是我想要的)。所以,如果clob_field具有5000的長度,我想這是一個結果:
data data data
---- ---- ----
"first 2000 chars" "second 2000 chars" "last 1000 chars"
我想這樣做在Oracle中,但不知道怎麼樣。任何幫助真的很感激。謝謝!
我會使用2048個字符而不是2000;它更適合於32767.對於每個「塊」的字符串都有一個新的行,這也是比較正常的。然後你可以用一個連接來代替動態SQL。 *(創建一個16行,其中的值爲1到16的表,加入這個行並選擇行的id和第n個2048個字符。)*然後,您也只需要返回具有值的行,而不是可能會返回16個字段,其中一些字段爲空。是否有一個原因,它必須分裂到多個*領域*? – MatBailie
你提取所有數據的目的是什麼?有人肯定會讀它嗎?他們用什麼方法訪問數據庫?一些描述的呈現網站,或者他們直接用SQL * Plus之類的東西來讀取它。 – Ben
您是否知道CLOB可能包含幾個TBytes?數字ob列不得超過1000,這不適合。 –