初步查询很少
create table tab1
(
fname varchar2(15),
lname varchar2(15)
);
create materialized view log on tab1 with rowid;
create materialized view mv1
refresh fast with rowid on commit
as
select * from tab1;
现在我已将fname的大小从varchar2(15)
增加到varchar2(20);
alter table tab1 modify fname varchar2(20);
现在,列大小的这种变化不会反映在mview中。
通过查询desc mlog$_tab1;
我发现它实际上只跟踪基于rowid.
那么我怎么能改变mview的列大小呢?
感谢。
答案 0 :(得分:1)
您可以删除/重新创建,或者只是更改mat视图的快照表以反映基础表中所做的更改:
SQL> set serveroutput on
SQL> set lines 500
SQL> drop table test_mv_tab
Table dropped.
SQL> create table test_mv_tab
(
my_col varchar2(10)
)
Table created.
SQL> insert into test_mv_tab values ('ABC')
1 row created.
SQL> commit
Commit complete.
SQL> drop MATERIALIZED VIEW TEST_MV
Materialized View dropped.
SQL> CREATE MATERIALIZED VIEW TEST_MV
NOCACHE
NOLOGGING
NOCOMPRESS
NOPARALLEL
BUILD IMMEDIATE
REFRESH COMPLETE ON DEMAND
AS
select * from test_mv_tab
Materialized View created.
SQL> -- show column
SQL> select column_name, data_length from user_tab_columns
where table_name = 'TEST_MV'
COLUMN_NAME DATA_LENGTH
------------------------------ -----------
MY_COL 10
1 row selected.
SQL> -- change underyling table
SQL> ALTER TABLE TEST_MV_TAB
MODIFY(MY_COL VARCHAR2(15 BYTE))
Table altered.
SQL> -- refresh mat view complete
SQL> exec dbms_mview.refresh('TEST_MV','C',atomic_refresh=>false)
PL/SQL procedure successfully completed.
SQL> -- show column
SQL> select column_name, data_length from user_tab_columns
where table_name = 'TEST_MV'
COLUMN_NAME DATA_LENGTH
------------------------------ -----------
MY_COL 10
1 row selected.
SQL> -- alter snapshot table of view
SQL> ALTER TABLE TEST_MV
MODIFY(MY_COL VARCHAR2(15 BYTE))
Table altered.
SQL> -- refresh mat view complete
SQL> exec dbms_mview.refresh('TEST_MV','C',atomic_refresh=>false)
PL/SQL procedure successfully completed.
SQL> -- show column
SQL> select column_name, data_length from user_tab_columns
where table_name = 'TEST_MV'
COLUMN_NAME DATA_LENGTH
------------------------------ -----------
MY_COL 15
1 row selected.