在我的项目中,我们在物化视图中使用了一个CLOB列的表,方法是使用TO_CHAR转换它,以便生成的列是一个大小为4000个字符的VARCHAR2。
MAX(CASE WHEN BONG_NARR_TY = 'ADTX' AND TO_CHAR(BONG_NARR_TX) IS NOT NULL THEN BONG_NARR_TX END ) AS ADTX_OP_NARR,
是否可以在视图中包含超过4000个字符,因为当我跳过
时TO_CHAR
MAX(CASE WHEN BONG_NARR_TY = 'ADTX' AND BONG_NARR_TX IS NOT NULL THEN BONG_NARR_TX END ) AS ADTX_OP_NARR,
我收到以下错误。
SQL Error: ORA-00932: inconsistent datatypes: expected - got CLOB
00932. 00000 - "inconsistent datatypes: expected %s got %s"
CLOB的大小是8Gb,但由于View我被限制为4Kb:)
答案 0 :(得分:2)
您无法在CLOB
中使用MAX()
。您可以在CLOB
中使用MATERIALIZED VIEW
。
答案 1 :(得分:1)
正如已经指出的那样,您不能将MAX()
与CLOB
列一起使用。
如果您的CLOB值在前4000个字符中不同,则可以使用DBMS_LOB.SUBSTR()
将其作为字符串提取,按此值排序,然后返回CLOB。
示例(使用窗口函数ROW_NUMBER()
获取行的排名):
create table test(
pk number not null primary key,
bong_narr_ty varchar2(10) not null,
bong_narr_tx CLOB
);
insert into test(pk, bong_narr_ty, bong_narr_tx)
values(1, 'ADTX', 'A');
insert into test(pk, bong_narr_ty, bong_narr_tx)
values(2, 'ADTX', 'B');
create materialized view mv_test
build immediate
as
select bong_narr_tx as adtx_op_narr
from
(select t.*, row_number() over (
partition by 1 order by dbms_lob.substr(bong_narr_tx, 4000, 1) desc) as rn
from test t
)
where rn=1;