DB2将大型CLOB(> 32KB)转换为文本?

时间:2012-04-30 11:09:17

标签: db2 varchar clob

我有一个DB2(9.5.1)表,其定义如下:

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的全部内容作为文本输出?

彼得

3 个答案:

答案 0 :(得分:8)

我在网络上的其他地方发现了这一点,并且我认为我会分享看到它在32k限制附近工作。

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

答案 1 :(得分:2)

在类似情况下,我必须检索xml数据,这对我有用

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

之前我能够在没有CAST的情况下在squirrel sql中执行此操作但最新版本我必须使用强制转换

答案 2 :(得分:1)

据我所知,没有办法绕过32k限制,如果你在SQL选择中使用它就像你描述的那样。

如果您使用JDBC来检索数据,而不是在结果集上使用getString(),那么您将获得一个CLOB句柄,从中可以得到一个流。

另一方面,它真的是一个限制吗?你真的在where子句中使用CLOB等吗? RDBMS针对较小的行大小进行了优化,可以有效地处理事务。

一般来说,流式传输数据。考虑重新设计数据模型,如果这个CLOB包含可以拆分成多列的数据,并且在查询中需要一些数据(其中......,按...等排序)。