7

我有一个 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 的全部内容检索为文本输出吗?

彼得

4

3 回答 3

8

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

SELECT 
  XMLCAST (
    XMLPARSE (
      DOCUMENT CAST (
        MY_CLOB_DATA AS BLOB
      ) 
      PRESERVE WHITESPACE
    ) as XML
  ) 
FROM 
MY_TABLE
WHERE ID = 1
于 2014-07-11T07:59:12.450 回答
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 中做到这一点,但最新版本我必须使用演员表

于 2013-01-14T22:22:17.160 回答
1

据我所知,如果您像描述的那样在 SQL 选择中使用它,则无法绕过 32k 限制。

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

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

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

于 2013-05-25T18:29:32.193 回答