【问题标题】:DB2 cast a large CLOB (> 32KB) into text?DB2 将一个大的 CLOB (> 32KB) 转换为文本?
【发布时间】:2012-05-10 02:15:06
【问题描述】:

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

彼得

【问题讨论】:

    标签: db2 varchar clob


    【解决方案1】:

    我在网络上的其他地方找到了这个,我想我会分享一下,因为它在 32k 限制附近工作。

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

    【讨论】:

    • 我需要将 BLOB 转换为 XML 格式,非常感谢!
    【解决方案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 中执行此操作,但最新版本我必须使用 cast

    【讨论】:

    • 但是你一路转换为 varchar(20000) 。这如何处理大小大于 32k 的 varchars?
    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      • 2016-10-04
      • 2013-04-16
      • 2011-02-11
      • 1970-01-01
      • 2021-11-21
      • 1970-01-01
      相关资源
      最近更新 更多