ORA-14097: column type or size mismatch in ALTER TABLE EXCHANGE PARTITION Hatası

ORA-14097: column type or size mismatch in ALTER TABLE EXCHANGE PARTITION


ORACLE-BASE - Create Table for Exchange With a Partitioned Table in Oracle  Database 12c Release 2 (12.2)

2 tablo arasında kolon sayısı ,kolon tipleri,kolonların sırası farklı ise bu hata alınabilir.
Burada 2 tablo 1’e-1 eşitlenerek çözüm bulunabilir.

Fakat 2 tablo arasında yukarıda belirtilen farklarından hiçbiri yok ise ve dışarıdan bakıldığında
tablolar arasında hiçbir fark görülemiyorsa o zaman tablolarda
add/drop column yapılmasından kaynaklı unused kolonların olması ihtimalini düşünmeliyiz.


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.

D:\Users\bdelice\Desktop\blogyazısı_1.PNG

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