是在创建FAST刷新的物化视图的时候报的错,好像是查询语句里面不能用Group by

解决方案 »

  1.   


    是在创建FAST刷新的物化视图的时候报的错,好像是查询语句里面不能用Group by贴出来表结构和物化视图的定义吧,这样也好方便帮你找问题
      

  2.   

    表结构和创建过程如下:
    -- Create table
    create table TBL_CALL_REC
    (
      seqnum   NUMBER(10) not null,
      row_date DATE,
      row_time NUMBER(10),
      acwtime  NUMBER(10)
    );
    -- Create/Recreate primary, unique and foreign key constraints 
    alter table TBL_CALL_REC
      add constraint PK_SEQNUM primary key (SEQNUM)
      using index 
      tablespace BOUSER
      pctfree 10
      initrans 2
      maxtrans 255
      storage
      (
        initial 64K
        next 1M
        minextents 1
        maxextents unlimited
      );
    数据如下:--创建视图日志
    create materialized view log on tbl_call_rec with rowid;--创建物化视图,在需要时fast刷新
    create materialized view mv_call_rec refresh fast on demand 
    as 
    select period_time,sum(acwtime) from 
    (
      SELECT DECODE(LENGTH(row_time),3,lpad(SUBSTR(row_time,1,1),2,'0')||':00--'||lpad(SUBSTR(row_time,1,1),2,'0')||':59',4,SUBSTR(row_time,1,2)||':00--'||SUBSTR(row_time,1,2)||':59') AS 
      period_time,acwtime  FROM cms_call_rec 
    )a group by period_time报错 ORA-32401:"BOUSER"."TBL_CALL_REC"上的实体化视图日志没有新值
      

  3.   


    你的物理表是TBL_CALL_REC
    物化视图并没有从这个物理表里面取数据,而是从cms_call_rec取的数据。
    这里我假设你贴错代码了,是想从TBL_CALL_REC里面取数据的。你报这个错误的原因是在创建日志标的时候指定的选项不对
    在最后加上  INCLUDING NEW VALUES  试试看
    意思是在物理表更新的时候,把更新前和更新后的数据保存到物化视图日志表里面
    目的是为了只针对这一条数据做物化视图的更新,以达到快速更新接着说,加上上面的选项后,还是会报错的,错误信息:ORA-12033
    意思是你在定义物化视图日志的时候还没有指定需要保存的字段
    这个需要(字段1,字段2,字段3)这种形式定义具体代码如下
    create materialized view log on tbl_call_rec 
    with rowid ,SEQUENCE
    (seqnum,row_date,row_time,acwtime ) 
    INCLUDING NEW VALUES;
    这样改过后,你的物化视图应该就可以编译成功了
      

  4.   

    按照u012806870的方法,可以创建
    在这里我想请教一下create materialized view log on tbl_call_rec 
    with rowid ,SEQUENCE
    (seqnum,row_date,row_time,acwtime ) 
    INCLUDING NEW VALUES;括号里的seqnum,row_date,row_time,acwtime几个字段是需要在日志中保存的字段,可不可以这样理解,括号里的几个字段是分组的字段、汇总的字段;或者说日志里必须要出现分组、汇总用到的字段另外,创建日志的时候,with rowid ,SEQUENCE是什么意思?
      

  5.   

    可以这样理解我只知道是为了记录更新行的ROWID和更新顺序。
    而且在物化视图里面如果使用了SUM等函数的时候是必须指定的。还有一种情况就是物化视图定义成功以后,元表更新后不能反映到物化视图里面。
    那就需要在物化视图的定义上面加count(*)和count(汇总字段)就可以了