暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle Dbms_metaada.get_ddl给出了序列列的错误顺序

ASKTOM 2021-06-30
622

问题描述



我将创建一个表,然后在其顶部创建一个物化视图日志,在其中我将使用sequence关键字专门对某些列进行排序。

请注意,我用 “序列 (col3,col2,col1)” 创建mviewlog

SQL> create table raulkaubi.mvlog_test1(id number PRIMARY KEY, col1 date, col2 number, col3 number);
create materialized view log on raulkaubi.mvlog_test1 with rowid, sequence (col3, col2, col1) including new values;
复制


现在,当我检查这个对象的DDL,我得到这个:

set pagesize 0
set lines 200
set long 90000
set feedback off
set echo off
select dbms_metadata.get_ddl('MATERIALIZED_VIEW_LOG','MLOG$_MVLOG_TEST1','RAULKAUBI') from dual;

  CREATE MATERIALIZED VIEW LOG ON "RAULKAUBI"."MVLOG_TEST1"
 PCTFREE 10 PCTUSED 30 INITRANS 1 MAXTRANS 255 LOGGING
  TABLESPACE "USERS"
  WITH ROWID, SEQUENCE ( "COL1", "COL2", "COL3" ) INCLUDING NEW VALUES
复制


注意,排序是错误的 (似乎排序总是按字母顺序):

SEQUENCE ( "COL1", "COL2", "COL3" )
复制



除此之外,这些视图中不应该也有一些订购信息 (例如column_id等):
DBA_MVIEW_LOG_FILTER_COLS
ALL_MVIEW_LOG_FILTER_COLS
复制


问候
劳尔·考比

专家解答

你想在这里做什么?

sequence子句与列顺序无关。从文档中:

SEQUENCE

Specify SEQUENCE to indicate that a sequence value providing additional ordering information should be recorded in the materialized view log. Sequence numbers are necessary to support fast refresh after some update scenarios.


列列表说明要存储在实体化视图日志中的值。你可以独立使用这些。使用序列对过滤器列没有影响:

create table t (
  id int primary key, c1 int, c2 int
);

create materialized view log on t with
  rowid, sequence;
  
desc mlog$_t;

Name              Null?   Type            
M_ROW$$                     VARCHAR2(255)    
SEQUENCE$$                  NUMBER           
SNAPTIME$$                  DATE             
DMLTYPE$$                   VARCHAR2(1)      
OLD_NEW$$                   VARCHAR2(1)      
CHANGE_VECTOR$$             RAW(255 BYTE)    
XID$$                       NUMBER  

drop materialized view log on t;
  
create materialized view log on t with
  rowid, ( c2, c1 );
  
desc mlog$_t;

Name              Null?   Type            
ID                          NUMBER           
C2                          NUMBER           
C1                          NUMBER           
M_ROW$$                     VARCHAR2(255)    
SNAPTIME$$                  DATE             
DMLTYPE$$                   VARCHAR2(1)      
OLD_NEW$$                   VARCHAR2(1)      
CHANGE_VECTOR$$             RAW(255 BYTE)    
XID$$                       NUMBER   
复制


请注意,MV日志第一次包括序列 $ $; 第二次它省略了这一点,而是包括列C2,C1。

也就是说,我可以看到get_ddl以字母顺序返回这些列:

select dbms_metadata.get_ddl ( 'MATERIALIZED_VIEW_LOG', 'MLOG$_T', user ) 
from   dual;

  CREATE MATERIALIZED VIEW LOG ON "CHRIS"."T"
 PCTFREE 10 PCTUSED 30 INITRANS 1 MAXTRANS 255 LOGGING
  TABLESPACE "USERS" 
  WITH PRIMARY KEY, ROWID ( "C1", "C2" ) EXCLUDING NEW VALUES  
复制


如果您需要此功能,请与支持人员交谈以提出错误。同样,如果您希望在字典视图中提供此信息,则会提出增强请求。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论