ORA-14097: column type or size mismatch in ALTER TABLE EXCHANGE PARTITION
2 tablo arasında kolon sayısı ,kolon tipleri,kolonların sırası farklı ise bu hata alınabilir.
Not : Tablo partition lı değilse aşağıdaki scripti çalıştırılarak unused kolonlar drop edilebilir.
Eğer tablolarda partition varsa aşağıdaki script çalışmayacaktır çünkü MOVE işlemi hata alacaktır.
ALTER TABLE XX.table_1 NOCOMPRESS;
ALTER TABLE XX.table_1 DROP UNUSED COLUMNS;
ALTER TABLE XX.table_1 MOVE PARALLEL 4 NOLOGGING;
ALTER TABLE XX.table_2 NOCOMPRESS;
ALTER TABLE XX.table_2 DROP UNUSED COLUMNS;
ALTER TABLE XX.table_2 MOVE PARALLEL 4 NOLOGGING;
Bu hata alındığında yapılması gereken şey ; UNUSED olan kolonların sayısının ve sırasının yine aynı şekilde veritipinin aynı olmasının sağlanmasıdır.
SELECT * FROM sys.dba_tab_cols 🡪unused kolonları görebileceğimiz tablo
WHERE TABLE_NAME ='table_2' 🡪bu tablo partitionlı ve unused kolonlar var
AND OWNER='XX'
ORDER BY INTERNAL_COLUMN_ID; ----ÇOK ÖNEMLI, BU KOLONDAKI SIRAYA GÖRE DIĞER TABLODA(table_1) BU YARATILAN KOLONLAR UNUSED OLARAK SET EDILMELIDIR.
Yani asıl yüklemenin yapılacağı tabloyu referans alarak unused kolonlar
ekleyebilir ya da drop edebiliriz.
Bir örnek üzerinden gidecek olursak temp tablomuzda unused kolon olmadığını varsayalım fakat datayı Exchange edeceğimiz tabloda(table_2) unused kolonlar olsun bu durumda yapılması gereken şey referans aldığımız tablodaki kolonları aynı sıra/tip/adet olacak şekilde tabloyu drop/create edip sonrasında bu kolonları UNUSED olarak işaret etmektir.
Burada SYS_ ile başlayan kolonların daha önceden bu tabloda eklenen
ya da drop edilen kolonlar olduğunu biliyoruz artık.
DROP TABLE XX.table_1;
CREATE TABLE XX.table_1
(
...
PARA_KOD varchar2(100),
SYS_C00092 NUMBER(30,6),
PARA_BIRIMI number,
SYS_C00093 NUMBER(30,6),
SYS_C00094 NUMBER(30,6),
SYS_C00095 NUMBER(30,6)
....
);
GRANT SELECT ON XX.table_1 TO ROLE_1;
Eğer test – preprod –prod gibi farklı ortamlarınız varsa tavsiyem test ve
preprod ortamında tabloları unused kolonlar var gibi direkt taşımanız ,
prod ortamda sadece aşağıdaki scripti çalıştırmanız olacaktır.
ALTER TABLE xx.table_1 SET UNUSED (SYS_C00097, SYS_C00049,SYS_C00050,SYS_C00051,SYS_C00145, SYS_C00093,
SYS_C00094,SYS_C00095,SYS_C00092);
Not : Unused kolonları isimlendirme konusunda bir kısıtımız yok örneğin
ben SYS_C00092 vb gibi yeni kolonlar oluşturdum.
Bu işlemi de yaptıktan sonra unused kolonlar da dahil olacak şekilde kontrol sağlanmalı
iki tabloda 1-1 eşitllik görülürse exchange adımına geçilebilir.
alter table XX.table_2 exchange partition P_20221120 with table XX.table_1;

Yorum Gönder