【问题标题】:Is it possible to use CLOB with Materialized Views是否可以将 CLOB 与物化视图一起使用
【发布时间】:2015-09-20 22:19:04
【问题描述】:

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

【问题讨论】:

  • 如果 CLOB 对于 VARCHAR2 来说太大,我认为你不能 TO_CHAR() 一个 clob。
  • 在这里尝试一些类型转换。此外,您正在检查 CLOB 是否为空,没有转换,但您也有一个 CASE 将其与“ADTX”进行比较给出整个语句,我可以更好地解释。
  • 你想用这个查询来完成什么?您为什么要尝试将 MAXCLOB 列一起使用(正如 Jon-Tofte Hansen 在他们的回答中指出的那样)是不可能的)?

标签: oracle oracle11g clob materialized-views varchar2


【解决方案1】:

您不能在MAX() 中使用CLOB。您可以MATERIALIZED VIEW 中使用CLOB

【讨论】:

    【解决方案2】:

    正如已经指出的那样,您不能将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;
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-14
    • 2022-01-05
    • 1970-01-01
    • 2021-11-12
    • 2016-04-01
    • 2011-01-20
    • 2018-08-11
    • 2021-08-05
    相关资源
    最近更新 更多