1, 老菜鸟露怯
公司最近有个比较大的项目需要支援, 左顾右盼生光辉, 我就去了. 被安排搞数据库接口这块, 这就是坑的背景.
有天需要把数据插入 Oracle 中间库的一个表里, 插入时一直提示: ora-01732: 此视图的数据操纵操作非法.
通过 PLSQL Developer 看了半天, 也没看出来有啥异常, 路径也确认在 Tables 目录下; 真是应验了一句话: 无知害死人.
2, 度娘带来的惊喜
物化视图也是种视图. Oracle 的物化视图是包括一个查询结果的数据库对像, 它是远程数据的的本地副本, 或者用来生成基于数据表求和的汇总表. 物化视图存储基于远程表的数据, 也可以称为快照. 物化视图可以查询表, 视图和其它的物化视图.
2.1 创建物化视图语句如下
CREATE MATERIALIZED VIEW VW_Table
BUILD IMMEDIATE -- 创建时立即刷新
REFRESH FORCE -- 如果可以快速刷新则进行快速刷新, 否则完全刷新
ON DEMAND -- 刷新方式
START WITH SYSDATE -- 第一次刷新时间
NEXT SYSDATE+1/(24) -- 刷新时间间隔
AS SELECT 1 id,'A'name FROM dual;
踩过的坑: 创建视图时去掉注释; 否则会有错误提示.
2.2 查询实例化视图的信息
select * from DBA_MVIEWS where MVIEW_NAME='VW_TABLE';
踩过的坑: MVIEW_NAME 需区分大小写.
2.3 修改刷新的频率
- ALTER MATERIALIZED VIEW VW_Table
- REFRESH FORCE
- ON DEMAND
- START WITH SYSDATE
- NEXT SYSDATE+1/144;
2.4 查询物化视图上次刷新时间
- SELECT last_refresh_date FROM user_mviews
- WHERE mview_name = 'VW_TABLE';
2.5 手动刷新物化视图
- BEGIN
- dbms_mview.refresh('VW_TABLE');
- END;
2.6 删除物化视图
DROP MATERIALIZED VIEW VW_TABLE;
3, 干巴巴的说明
3.1 创建时生成数据:
分为两种: build immediate 和 build deferred,
build immediate: 是在创建物化视图的时候就生成数据.
build deferred: 则在创建时不生成数据, 以后根据需要在生成数据.
如果不指定, 则默认为 build immediate.
3.2 刷新模式:
物化视图有二种刷新模式:
在创建时 refresh mode 是 on demand 还是 on commit.
on demand 顾名思义, 仅在该物化视图 "需要" 被刷新了, 才进行刷新 (REFRESH), 即更新物化视图, 以保证和基表数据的一致性;
on commit 提交触发, 一旦基表有了 commit, 即事务提交, 则立刻刷新, 立刻更新物化视图, 使得数据和基表一致. 一般用这种方法在操作基表时速度会比较慢.
创建物化视图时未作指定, 则 Oracle 按 on demand 模式来创建.
来源: http://www.bubuko.com/infodetail-2872764.html