در صورتی که قصد داریم جدولی را برای انجام عملیات EXCHANGE PARTITION ایجاد کنیم، باید ساختار این جدول مشابه با ساختار جدول پارتیشن شده باشد تا امکان انجام عملیات EXCHANGE بین جدول جدید و پارتیشن مورد نظر فراهم شود:
SQL> create table EXCHTBL as select * from SALTBL where 1=2;
Table created
SQL> ALTER TABLE SALTBL EXCHANGE PARTITION P2020 WITH TABLE EXCHTBL;
Table altered
SQL> select count(*) from EXCHTBL;
COUNT(*)
———-
70000
حال زمانی را در نظر بگیرید که یکی از ستونهای جدول saltbl در حالت INVISIBLE قرار دارد، در این صورت، با طی کردن سناریوی قبلی، به خطا برخواهیم خورد:
SQL> desc saltbl;
Name Type Nullable Default Comments
——— ———— ——– ——- ——–
ID NUMBER Y
NAME VARCHAR2(10) Y
LAST_NAME VARCHAR2(10) Y
SALARY NUMBER Y
TIME_ DATE Y
SQL> ALTER TABLE saltbl MODIFY salary INVISIBLE;
Table altered
SQL> desc saltbl;
Name Type Nullable Default Comments
——— ———— ——– ——- ——–
ID NUMBER Y
NAME VARCHAR2(10) Y
LAST_NAME VARCHAR2(10) Y
TIME_ DATE Y
SQL> create table EXCHTBL2 as select * from SALTBL where 1=2;
Table created
SQL> desc EXCHTBL2
Name Type Nullable Default Comments
——— ———— ——– ——- ——–
ID NUMBER Y
NAME VARCHAR2(10) Y
LAST_NAME VARCHAR2(10) Y
TIME_ DATE Y
SQL> ALTER TABLE SALTBL EXCHANGE PARTITION P2019 WITH TABLE EXCHTBL2;
ORA-14097: column type or size mismatch in ALTER TABLE EXCHANGE PARTITION
همانطور که می بینید، به دلیل آنکه ستون salary در جدول EXCHTBL2 موجود نیست، دستور EXCHANGE PARTITION با خطا مواجه شده است.
برای رفع این مشکل، اوراکل در نسخه 12cR2، عبارت for exchange with را به دستور create table اضافه کرده است که با کمک ان می توان جدولی مشابه ساختار جدول پارتیشن شده را برای انجام عملیات EXCHANGE PARTITION ایجاد نمود. با این کار، همه ستونهای مخفی اعم از invisible، virtual، unused و همچنین محدودیت not null در جدول جدید هم موجود خواهد بود:
SQL> CREATE TABLE EXCHTBL3 FOR EXCHANGE WITH TABLE SALTBL;
Table created
SQL> desc EXCHTBL3
Name Type Nullable Default Comments
——— ———— ——– ——- ——–
ID NUMBER Y
NAME VARCHAR2(10) Y
LAST_NAME VARCHAR2(10) Y
TIME_ DATE Y
SALARY NUMBER Y
SQL> ALTER TABLE SALTBL EXCHANGE PARTITION P2019 WITH TABLE EXCHTBL3;
Table altered
SQL> select count(*) from EXCHTBL3;
COUNT(*)
———-
70000
Comment (1)