首先 物化视图是可以被更新的
假设 表test_alex; 有1条数据 col_a =1 物化视图建立方式
CREATE MATERIALIZED VIEW LOG ON test_alex WITH PRIMARY KEY;
CREATE MATERIALIZED VIEW test_alex_mv REFRESH FAST WITH PRIMARY KEY for update AS SELECT * FROM test_alex;
当col_a被更新的时候 假设 a=2 那么 flush 一下物化视图 那么 物化视图 也会变成2
那么好 接下来 先把物化视图更新成3. 把表中数据更新为4
再次刷新 居然两者的a都等于4
再实验 把物化视图更新成5 表中数据不动。
再次刷新数据 物化视图中的数据又回到了4.
物化视图有快速刷新和完全刷新两种模式 默认是 如果不能快速 则完全刷新
CALL dbms_mview.refresh('TEST_ALEX_MV’[,’F’|’C’]);
第一次物化视图已经建立成功,下面建立嵌套物化视图:
SQL> CREATE MATERIALIZED VIEW LOG ON MV_ABC WITH ROWID (BNAME, CNAME, NUM) INCLUDING NEW VALUES;
实体化视图日志已创建。
SQL> CREATE MATERIALIZED VIEW MV_MV_ABC REFRESH FAST ON COMMIT ENABLE QUERY REWRITE AS
2 SELECT CNAME, BNAME, COUNT(*) COUNT, SUM(NUM) SUM_NUM FROM MV_ABC
3 GROUP BY CNAME, BNAME;
SELECT CNAME, BNAME, COUNT(*) COUNT, SUM(NUM) SUM_NUM FROM MV_ABC
*
ERROR 位于第 2 行:
ORA-12053: 这不是一个有效的嵌套实体化视图
错误出现了,不过错误的描述包含的信息量并不大。我们看看Oracle的文档上是如何描述这个错误的。
ORA-12053 this is not a valid nested materialized view
Cause: The list of objects in the FROM clause of the definition of this materialized view had some dependencies upon each other.
Action: Refer to the documentation to see which types of nesting are valid.
文档上的描述也是十分笼统的,并没有指出具体问题所在。
接下来,我们通过使用DBMS_MVIEW.EXPLAIN_MVIEW过程来定位错误。
使用EXPLAIN_MVIEW 过程首先要建立MV_CAPABILITIES_TABLE表,建表的脚步是$ORACLE_HOME/rdbms/admin /utlxmv.sql。(EXPLAIN_MVIEW过程是两个过程的重载,一个输出到MV_CAPABILITIES_TABLE表,另一个以PL /SQL的VARRAY格式输出,为了简单起见,我们建立MV_CAPABILITIES_TABLE表)。
SQL> @?rdbmsadminutlxmv.sql
表已创建。
下面简单研究一下EXPLAIN_MVIEW过程。
DBMS_MVIEW.EXPLAIN_MVIEW(mv IN VARCHAR2, Statement_id IN VARCHAR2:= NULL);
该过程可以输入已经存在的物化视图名称(或USER_NAME.MV_NAME),也可输入建立物化视图的查询语句。另外一个参数STATEMENT_ID输入一个语句ID,为了标识出表中对应的记录。
SQL> BEGIN
2 DBMS_MVIEW.EXPLAIN_MVIEW('SELECT CNAME, BNAME, COUNT(*) COUNT, SUM(NUM) SUM_NUM FROM MV_ABC
3 GROUP BY CNAME, BNAME', 'MV_MV_ABC');
4 END;
5 /
PL/SQL 过程已成功完成。
SQL> SELECT CAPABILITY_NAME, RELATED_TEXT, MSGTXT FROM MV_CAPABILITIES_TABLE
2 WHERE STATEMENT_ID = 'MV_MV_ABC' AND POSSIBLE = 'N' AND CAPABILITY_NAME NOT LIKE '%PCT%';
------------------------------ --------------- --------------------------------------------------
REFRESH_FAST_AFTER_ONETAB_DML SUM_NUM 使用 SUM(expr) 时, 未提供 COUNT(expr)
REFRESH_FAST_AFTER_ANY_DML YANGTK.MV_ABC mv 日志没有序列号
REFRESH_FAST_AFTER_ANY_DML 查看禁用 REFRESH_FAST_AFTER_ONETAB_DML 的原因
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21818314/viewspace-693201/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/21818314/viewspace-693201/