我有一个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的全部内容作为文本输出?
彼得
答案 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包含可以拆分成多列的数据,并且在查询中需要一些数据(其中......,按...等排序)。