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,
3.2 刷新模式:
物化視圖有二種刷新模式:
在創建時refresh mode是 on demand 還是 on commit。
on demand 顧名思義,僅在該物化視圖“需要”被刷新了,才進行刷新(REFRESH),即更新物化視圖,以保證和基表數據的一致性;
on commit 提交觸發,一旦基表有了commit,即事務提交,則立刻刷新,立刻更新物化視圖,使得數據和基表一致。一般用這種方法在操作基表時速度會比較慢。
創建物化視圖時未作指定,則Oracle按 on demand 模式來創建。
