【问题标题】:Oracle - exchange partitions with a tableOracle - 用表交换分区
【发布时间】:2017-07-06 11:32:31
【问题描述】:

我尝试在 Oracle 11g.2.0.3 上创建一个 table2:

CREATE table2 
LOGGING TABLESPACE TS_table1_2014 PCTFREE 10 INITRANS 1 STORAGE ( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS UNLIMITED BUFFER_POOL DEFAULT ) NOCOMPRESS
as (select * from table1 where date_text <= '2015-12-31');

当我尝试将此表 2 与分区表 3 交换时,我收到以下错误:

alter table table3 exchange partition partition_name WITH TABLE table2;

    Error report -
    SQL Error: ORA-14097: column type or size mismatch in ALTER TABLE EXCHANGE PARTITION
    14097. 00000 -  "column type or size mismatch in ALTER TABLE EXCHANGE PARTITION"
    *Cause:    The corresponding columns in the tables specified in the
               ALTER TABLE EXCHANGE PARTITION are of different type or size
    *Action:   Ensure that the two tables have the same number of columns
               with the same type and size.

我有以下查询的测试差异:

Select a.COLUMN_NAME 
  , a.DATA_TYPE, b.DATA_TYPE 
  , a.data_length, b.data_length 
  , a.data_precision, b.data_precision 
  , a.data_scale, b.data_scale 
  , a.nullable, b.nullable 
from ALL_TAB_COLUMNS a 
full outer join ALL_TAB_COLUMNS b on a.column_name=b.column_name 
 and b.owner=user and b.table_name='&table2' 
 where  a.owner=user and a.table_name='&table1'   
 and ( 
    nvl(a.data_type,'#')!=nvl(b.data_type,'#') 
    or nvl(a.data_length,-1)!=nvl(b.data_length,-1) 
    or nvl(a.data_precision,-100)!=nvl(b.data_precision,-100) 
    or nvl(a.data_scale,-100)!=nvl(b.data_scale,-100) 
    or nvl(a.nullable,'#')!=nvl(b.nullable,'#') 
   ) 
;

导致的一些差异在于列大小。这种语法“create as select”没有保持新表创建的顺序和大小。

如何从 table1 创建 table2 as select 并强制保持与主 table1 源相同大小的列?

谢谢!

【问题讨论】:

  • table1 和 table3 的 DDL 是什么?
  • 在另一个具有相似表的数据集上,所有列的大小和顺序都可以使用简单的语法“create as select”创建。我怀疑分配的用户权限不同。
  • 您应该像这样进行分区:VALUES LESS THAN (TO_DATE('01-01-2015','dd-mm-yyyy'))
  • table1也需要DDL或结构

标签: oracle database-administration


【解决方案1】:

我在您的 DDL 中找不到任何差异。我的建议是使用相同的 DDL 创建 table2,然后执行:

insert into table2 select * from table1;

【讨论】:

  • 我更喜欢避免插入。我使用“create table as select”来提高执行速度。
  • 您可以与 FETCH BULK 和 FORALL 一起插入。另外,我们讨论的是语法错误,而不是性能问题 :)
【解决方案2】:

您需要使用 dbms_metadata 包或查询 all_tab_columns 等数据字典视图的数量来获取有关现有表的元数据,以便您可以为交换表构造正确的 sql(用于交换分区操作)。 CTAS 不传输 DEFAULT 值和约束,除了 NOT NULL 检查。 最佳实践是与分区表同时创建/重新创建/修改此表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    相关资源
    最近更新 更多