下划线表中列长度的变化不会反映在mview中

时间:2014-11-07 12:14:52

标签: sql oracle

初步查询很少

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的列大小呢?

感谢。

1 个答案:

答案 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.
相关问题