是否可以将CLOB与物化视图一起使用

时间:2015-07-03 07:04:47

标签: oracle oracle11g clob materialized-views varchar2

在我的项目中,我们在物化视图中使用了一个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:)

2 个答案:

答案 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;