2012-04-30 86 views
6

我有一個DB2(9.5.1),它被定義爲表如下:DB2將大型CLOB(> 32KB)轉換爲文本?

CREATE TABLE MY_TABLE 
( 
    ID INTEGER DEFAULT 0 NOT NULL, 
    TEXT CLOB(104857600), 
    PRIMARY KEY (ID) 
); 

現在,如果我要查詢存儲在CLOB實際文本字符串我做這種方式:

select cast(t.TEXT as varchar(32000)) 
    from MY_TABLE t 
    where t.ID = 1; 

現在的問題是,我的文字被截斷,但對於一個VARCHAR的最大長度爲32KB,所以查詢失敗:

select cast(t.TEXT as varchar(33000)) 
    from MY_TABLE t 
where t.ID = 1; 

如何以文本輸出方式檢索CLOB的全部內容,是否還有另一種可能性?

彼得

回答

2

在類似的情況,在這裏我不得不檢索XML數據,這個工作對我來說

select my_id, cast(xmlserialize(my_column as clob(1m)) as varchar(20000)) from schema.my_table where my_id = 463 

早期我能夠做到這一點的松鼠SQL沒有CAST,但最新的版本我有使用鑄造

+2

但是你一路轉換到varchar(20000)。這是如何處理大小大於32k的varchars? – Beryllium

1

據我所知,沒有辦法解決32k的限制,如果你在SQL選擇中使用它,就像你所描述的那樣。

如果使用JDBC檢索數據,而不是在結果集上使用getString(),則會得到一個CLOB句柄,並從中獲得一個流。

另一方面,它真的是一個限制嗎?你真的在where子句中使用CLOB嗎? RDBMS針對較小的行大小進行了優化,可以有效處理事務。

一般來說,流數據。考慮重新設計你的數據模型,如果這個CLOB包含可以拆分成多列的數據,並且你的查詢中需要一些數據(其中...,order by ...等)。

7

我在網絡上的其他地方發現了這個,並認爲我會分享看到它在32k的限制範圍內工作。

SELECT 
    XMLCAST (
    XMLPARSE (
     DOCUMENT CAST (
     MY_CLOB_DATA AS BLOB 
    ) 
     PRESERVE WHITESPACE 
    ) as XML 
) 
FROM 
MY_TABLE 
WHERE ID = 1 
+0

我需要在XML中轉換BLOB,這很有用,非常感謝! – WannaGetHigh