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

Oracle 12C中的列默认值

askTom 2018-09-10
938

问题描述

嗨,汤姆,

我们正在将oracle表转换为分区表。为此,我们使用ORACLE Exchange partition。
数据库版本12C。

我们正在遵循的步骤。
1.原始表 -- 现有表
    create table tab1(col1 integer,
                      col2 varchar2(100));

2.当前没有日期字段,因此添加日期列并使用默认SYSDATE填充
  alter table tab1 add col3 date default sysdate;

 select col#,segcol#,name from sys.col$ where obj#=(select object_id from dba_objects where object_name='TAB1')
1 1 COL1
2 2 COL2
0 3 SYS_NC00003$
3 4 COL3


3.创建类似于原始表的临时表

create table tab2
partition by range(col3)
 interval(numtodsinterval(1,'DAY')) 
                      (
                              partition PART_01 values less than (TO_DATE('01/09/2018', 'DD/MM/YYYY'))) ENABLE ROW MOVEMENT 
             as select * from tab1 where 1= 2;


4.使用exchange分区从原始表链接数据
ALTER TABLE  tab2
EXCHANGE PARTITION PART_01  WITH TABLE  tab1 WITHOUT VALIDATION ;


这是失败的,有以下错误
ORA-14097: ALTER TABLE EXCHANGE分区中的列类型或大小不匹配

而当我在user_tab_columns中查看列时它是匹配的。但是当我查看sys.col $时,它显示的是与SYS_NC00003 $ 不同的行。

这种方法在11g下工作正常,只在12C下出现问题。
您能否建议如何克服这个问题。

谢谢。

专家解答

首先,无需查询sys.col $。使用 * _tab_cols!

无论如何,问题是由于12c中的快速列默认添加了可空列。这将创建不可见的SYS _ * 列。还有其他一些功能可能导致系统生成的隐藏列。设置一个未使用的列是关键的罪魁祸首。

那该怎么办?

这在错误17741995中得到解决。如果安装补丁17741995 (包含在12.1.0.2中),则可以通过设置事件14529来解决此问题:

create table tab1(
  col1 integer,
  col2 varchar2(100)
);

alter table tab1 add col3 date default sysdate;

select column_name, hidden_column
from   user_tab_cols
where  table_name = 'TAB1';

COLUMN_NAME    HIDDEN_COLUMN   
COL3           NO              
SYS_NC00003$   YES             
COL2           NO              
COL1           NO 

Alter session set events '14529 trace name context forever, level 512';

create table tab2
partition by range(col3)
interval(numtodsinterval(1,'DAY'))  (
  partition PART_01 values less than (to_date('01/09/2018', 'DD/MM/YYYY'))
) enable row movement 
as 
  select * from tab1 where 1 = 2;

alter session set events '14529 trace name context off';

alter table tab2
exchange partition part_01 with table tab1 without validation ;

Table TAB2 altered.


请参阅MOS注释2240439.1。

如果您使用12.2,则还有另一种可能性: 使用 “for exchange was” 参数创建表。然后更改要分区的新表:

drop table tab2 cascade constraints purge;

create table tab2 for exchange with table tab1;

alter table tab2 modify partition by range(col3)
interval(numtodsinterval(1,'DAY'))  (
  partition PART_01 values less than (to_date('01/09/2018', 'DD/MM/YYYY'))
);

alter table tab2
exchange partition part_01 with table tab1 without validation ;

Table TAB2 altered.

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论