[20190503]12C R2 分区交换.txt

来源:这里教程网 时间:2026-03-03 13:28:05 作者:

[20190503]12C R2 分区交换.txt --//12C之前分区交换,如果表存在UNUSED COLUMN时,如果通过ctas建立的表进行交换会报错. --//12c R2 建立表时指定FOR EXCHANGE WITH TABLE参数可以将隐含列一起建立过来. --//通过例子说明: 1. 环境: SCOTT@test01p> @ ver1 PORT_STRING                    VERSION        BANNER                                                                               CON_ID ------------------------------ -------------- -------------------------------------------------------------------------------- ---------- IBMPC/WIN_NT64-9.1.0           12.2.0.1.0     Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production              0 --//直接参考链接测试:https://oracle-base.com/articles/12c/create-table-for-exchange-with-table-12cr2 CREATE TABLE t1 (   id            NUMBER,   code          VARCHAR2(10),   description   VARCHAR2(50),   created_date  DATE,   data_1        VARCHAR2(1000),   data_2        VARCHAR2(1000),   CONSTRAINT t1_pk PRIMARY KEY (id) ) PARTITION BY RANGE (created_date) (   PARTITION t1_2017 VALUES LESS THAN (TO_DATE('01-JAN-2018','DD-MON-YYYY')),   PARTITION t1_2018 VALUES LESS THAN (TO_DATE('01-JAN-2019','DD-MON-YYYY')) ); ALTER TABLE t1 SET UNUSED (data_1); ALTER TABLE t1 MODIFY data_2 INVISIBLE; SCOTT@test01p> @ desc t1 Name          Null?    Type ------------- -------- ------------- ID            NOT NULL NUMBER CODE                   VARCHAR2(10) DESCRIPTION            VARCHAR2(50) CREATED_DATE           DATE --//DROP TABLE t1_temp PURGE; SCOTT@test01p> CREATE TABLE t1_temp AS SELECT * FROM t1 WHERE 1=2; Table created. SCOTT@test01p> ALTER TABLE t1_temp ADD CONSTRAINT t1_temp_pk PRIMARY KEY (id); Table altered. INSERT INTO t1_temp VALUES ( 1, 'ONE',   'Description for ONE', TO_DATE('02-SEP-2017','DD-MON-YYYY')); INSERT INTO t1_temp VALUES ( 2, 'TWO',   'Description for ONE', TO_DATE('02-SEP-2017','DD-MON-YYYY')); INSERT INTO t1_temp VALUES ( 3, 'THREE', 'Description for ONE', TO_DATE('02-SEP-2017','DD-MON-YYYY')); INSERT INTO t1_temp VALUES ( 4, 'FOUR',  'Description for ONE', TO_DATE('02-SEP-2017','DD-MON-YYYY')); COMMIT; SCOTT@test01p> ALTER TABLE t1 EXCHANGE PARTITION t1_2017 WITH TABLE t1_temp WITHOUT VALIDATION UPDATE GLOBAL INDEXES; ALTER TABLE t1 EXCHANGE PARTITION t1_2017 WITH TABLE t1_temp WITHOUT VALIDATION UPDATE GLOBAL INDEXES * ERROR at line 1: ORA-14097: column type or size mismatch in ALTER TABLE EXCHANGE PARTITION --//主要问题在于2个表结构实际上内部不一致. SCOTT@test01p> SELECT column_id, column_name, hidden_column FROM user_tab_cols WHERE table_name = 'T1' ORDER BY internal_column_id;  COLUMN_ID COLUMN_NAME                    HID ---------- ------------------------------ ---          1 ID                             NO          2 CODE                           NO          3 DESCRIPTION                    NO          4 CREATED_DATE                   NO            SYS_C00005_19050321:47:40$     YES            DATA_2                         YES 6 rows selected. --//实际表T1存在2个隐含列. --//重复: DROP TABLE t1_temp PURGE; CREATE TABLE t1_temp TABLESPACE users FOR EXCHANGE WITH TABLE t1; ALTER TABLE t1_temp ADD CONSTRAINT t1_temp_pk PRIMARY KEY (id); INSERT INTO t1_temp VALUES ( 1, 'ONE',   'Description for ONE', TO_DATE('02-SEP-2017','DD-MON-YYYY')); INSERT INTO t1_temp VALUES ( 2, 'TWO',   'Description for ONE', TO_DATE('02-SEP-2017','DD-MON-YYYY')); INSERT INTO t1_temp VALUES ( 3, 'THREE', 'Description for ONE', TO_DATE('02-SEP-2017','DD-MON-YYYY')); INSERT INTO t1_temp VALUES ( 4, 'FOUR',  'Description for ONE', TO_DATE('02-SEP-2017','DD-MON-YYYY')); COMMIT; SCOTT@test01p> SELECT column_id, column_name, hidden_column FROM user_tab_cols WHERE table_name = 'T1_TEMP' ORDER BY internal_column_id;  COLUMN_ID COLUMN_NAME                    HID ---------- ------------------------------ ---          1 ID                             NO          2 CODE                           NO          3 DESCRIPTION                    NO          4 CREATED_DATE                   NO            SYS_C00005_19050321:47:40$     YES            DATA_2                         YES 6 rows selected. --//你可以发现现在T1_temp表结构与T1一致. SCOTT@test01p> ALTER TABLE t1  EXCHANGE PARTITION t1_2017 WITH TABLE t1_temp  WITHOUT VALIDATION  UPDATE GLOBAL INDEXES; Table altered. --//OK现在成功了. SCOTT@test01p> select count(*) from t1 partition(t1_2017)  ;   COUNT(*) ----------          4 SCOTT@test01p> select count(*) from t1_temp  ;   COUNT(*) ----------          0

相关推荐