表结构和创建过程如下: -- 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"上的实体化视图日志没有新值
你的物理表是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; 这样改过后,你的物化视图应该就可以编译成功了
按照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是什么意思?
是在创建FAST刷新的物化视图的时候报的错,好像是查询语句里面不能用Group by贴出来表结构和物化视图的定义吧,这样也好方便帮你找问题
-- 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"上的实体化视图日志没有新值
你的物理表是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;
这样改过后,你的物化视图应该就可以编译成功了
在这里我想请教一下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是什么意思?
而且在物化视图里面如果使用了SUM等函数的时候是必须指定的。还有一种情况就是物化视图定义成功以后,元表更新后不能反映到物化视图里面。
那就需要在物化视图的定义上面加count(*)和count(汇总字段)就可以了