物化视图上创建了触发器,有问题

liuyyuns 2010-12-26 06:24:59
是这样的:
由于两张基表的字段比较多,这里就不创建基表了。

--创建物化视图日志
create materialized view log on WCMMETATABLEBOOK_BASEINFO with rowid;
create materialized view log on WCMMETATABLEBOOK_EXTINFO with rowid;

--创建物化视图
create materialized view MV_BOOKEXPINFO
refresh force on demand
start with sysdate next sysdate + 5 / (24 * 60)
as
select t1.rowid as baserowid,t2.rowid as exprowid,t1.metadataid,t1.RESOURCEUNIQUEID,t1.pubdate,t1.creator,t1.issets,t1.setsname,t1.setsorder,t1.title,t2.hasflip,t2.sellprice,t2.price,t2.isbn,t2.canprint from WCMMETATABLEBOOK_BASEINFO t1,WCMMETATABLEBOOK_EXTINFO t2 where t1.RESOURCEUNIQUEID = t2.RESOURCEUNIQUEID;

--创建触发器
create or replace trigger TRI_bookexpinfo
after insert or update or delete on mv_bookexpinfo
for each row
declare
bid int;
begin
if deleting then
dbms_output.put_line('删除');
update bookexpinfo set BOOK_ISDEL='1' where BOOK_TRSID=:old.RESOURCEUNIQUEID;
end if;
if inserting then
dbms_output.put_line('插入');
select bookid.nextval into bid from dual;
insert into bookexpinfo(book_id,BOOK_TRSID,BOOK_DATE,BOOK_AUTHOR,BOOK_ISSETS,BOOK_SETSNAME,BOOK_SETSORDER,BOOK_TYPE,BOOK_NAME,BOOK_SALEPRICE,BOOK_PRICE,BOOK_ISBN,canPrint)
values(bid,:new.RESOURCEUNIQUEID,:new.PUBDATE,:new.CREATOR,:new.ISSETS,:new.SETSNAME,:new.SETSORDER,:new.HASFLIP,:new.TITLE,:new.SELLPRICE,:new.PRICE,:new.ISBN,:new.CANPRINT);
end if;
if updating then
dbms_output.put_line('修改');
update bookexpinfo set BOOK_DATE=:new.PUBDATE,BOOK_AUTHOR=:new.CREATOR,BOOK_ISSETS=:new.ISSETS,BOOK_SETSNAME=:new.SETSNAME,BOOK_SETSORDER=:new.SETSORDER,BOOK_TYPE=:new.HASFLIP,BOOK_NAME=:new.TITLE,BOOK_SALEPRICE=:new.SELLPRICE,BOOK_PRICE=:new.PRICE,BOOK_ISBN=:new.ISBN,canPrint=:new.CANPRINT where book_trsid=:old.RESOURCEUNIQUEID;
end if;
end TRI_bookexpinfo;

上面的语句是没有问题的,都可以成功创建,但是当我测试的时候,我在基本表WCMMETATABLEBOOK_BASEINFO中修改了一条数据:

SQL> update wcmmetatablebook_baseinfo set creator='bbbb' where RESOURCEUNIQUEID='B_50602850_001';

1 row updated

SQL> commit;

Commit complete

然后执行物化视图:

SQL> EXEC DBMS_MVIEW.REFRESH('MV_bookexpinfo', 'f');

删除
插入

PL/SQL procedure successfully completed

输出的结果很是诧异,找了一个下午也不知道是什么原因,这种情况会是什么原因呢?
...全文
300 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuyyuns 2011-01-11
  • 打赏
  • 举报
回复
由于创建了物化视图日志,而物化视图中又使用的rowid作为主键,在更新的时候,实际上物化视图日志是当成先删除后插入,不过这样也能完成我的功能。多谢!
liuyyuns 2010-12-27
  • 打赏
  • 举报
回复
我在更新的时候就想让它update,不想让它先delete,后insert.
liuyyuns 2010-12-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 oraclefans_ 的回复:]
对于非主键的更新再物化视图中就是一条更新记录,而对于主键的更新,再物化视图日志中记录了两条,一条删除,一条插入。
[/Quote]
我并没有更新主键,为什么也是删除一条,再插入一条呢?
liuyyuns 2010-12-26
  • 打赏
  • 举报
回复
谢谢!
Oraclefans_ 2010-12-26
  • 打赏
  • 举报
回复
Oraclefans_ 2010-12-26
  • 打赏
  • 举报
回复

对于非主键的更新再物化视图中就是一条更新记录,而对于主键的更新,再物化视图日志中记录了两条,一条删除,一条插入。
liuyyuns 2010-12-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tangren 的回复:]
对于UPDATE的同步的方式就是先删除该条记录,然后从原表再插入该条记录到物化视图
并不是update物化视图
[/Quote]
我又测试了删除:

delete from wcmmetatablebook_baseinfo where RESOURCEUNIQUEID='B_50602850_001';

1 row deleted

SQL> commit;

Commit complete

SQL> EXEC DBMS_MVIEW.REFRESH('MV_bookexpinfo', 'f');

删除

PL/SQL procedure successfully completed
SQL>
删除竟然是对的,难道真是你所说,修改时先删除后添加。那要是这样的话,修改该如何处理呢?
liuyyuns 2010-12-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tangren 的回复:]
对于UPDATE的同步的方式就是先删除该条记录,然后从原表再插入该条记录到物化视图
并不是update物化视图
[/Quote]
如果只是基于一张表的物化视图,打印出来的就是“修改”,物化视图存在问题。
tangren 2010-12-26
  • 打赏
  • 举报
回复
对于UPDATE的同步的方式就是先删除该条记录,然后从原表再插入该条记录到物化视图
并不是update物化视图
liuyyuns 2010-12-26
  • 打赏
  • 举报
回复
是不是基于两张表创建物化视图的写法不正确?

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧