1

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

4

2 回答 2

2

你不能CLOBMAX(). 您可以CLOBMATERIALIZED VIEW. _

于 2015-07-03T07:37:39.120 回答
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;
于 2015-07-03T07:51:49.783 回答