问题描述
嗨,
我正在创建一个实体化视图,它需要连接多个表,其中一个 (只是一个表) 给我视图中的重复记录。当我使用 'distinct '关键字时,它会抛出错误,知道当SELECT script具有CLOB时,列我们不能使用 'distinct' 关键字。所以我用to_char方法把CLOB转换成char,直到昨天都很好。现在它抛出一个错误,因为对于某些记录,CLOB列有超过4k个字符。所以to_char () 抛出缓冲区大小太小。请帮助我如何解决这个问题?
注意: 我必须使用那个给我重复记录的特定表,并且不能解决这个问题,因为表已经这样设计了,所以只有选项是转换成字符或字符串,这样我就可以使用distinct关键字。
我正在创建一个实体化视图,它需要连接多个表,其中一个 (只是一个表) 给我视图中的重复记录。当我使用 'distinct '关键字时,它会抛出错误,知道当SELECT script具有CLOB时,列我们不能使用 'distinct' 关键字。所以我用to_char方法把CLOB转换成char,直到昨天都很好。现在它抛出一个错误,因为对于某些记录,CLOB列有超过4k个字符。所以to_char () 抛出缓冲区大小太小。请帮助我如何解决这个问题?
注意: 我必须使用那个给我重复记录的特定表,并且不能解决这个问题,因为表已经这样设计了,所以只有选项是转换成字符或字符串,这样我就可以使用distinct关键字。
专家解答
您可以使用dbms_lob.substr提取前4,000个字符。这将返回一个varchar2。所以你可以在SQL中做一个不同的:
create table t (
x clob
);
declare
tmp clob;
begin
dbms_lob.createtemporary(tmp, true);
for i in 0 .. 9 loop
dbms_lob.writeappend(tmp, 4000, lpad('x', 4000, 'x'));
end loop;
insert into t values (tmp);
end;
/
select dbms_lob.getlength(x) from t;
DBMS_LOB.GETLENGTH(X)
40,000
select count(distinct x) from t;
SQL Error: ORA-00932: inconsistent datatypes: expected - got CLOB
select count(distinct dbms_lob.substr(x, 4000, 1)) from t;
COUNT(DISTINCTDBMS_LOB.SUBSTR(X,4000,1))
1
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




