Pazar , 13 Temmuz 2014
Son Haberler
Anasayfa / MAKALELER / Veri Tabanı / Oracle’da Merge İşlemi

Oracle’da Merge İşlemi

Pusula Akademi Oracle grubundan Anıl’ı bu güzel makalesi için tebrik ediyoruz.Devamını bekliyoruz

 

 

Merge, tablolar arası birleştirme işlemi yapar yani iki tablo birleştirilecek ise kolonlar kontrol edilerek dataların durumuna göre update veya insert işlemleri ile birleştirme yapılmış olur. Merge kullanarak programlama bazında çoklu else-if yapısından kurtulmuş oluruz.

Merge kullanımı için basit bir uygulama yapacağız, bunun için öncelikle iki tablo create edip,  data insert edeceğiz..

create table ogrenci

(

no number,

ad varchar2(10)

);

insert into ogrenci(no,ad) values(1,’Anıl’);

insert into ogrenci(no,ad) values(2,’Okan’);

insert into ogrenci(no,ad) values(3,’Reşat’);

 

Kodlarda görüldüğü üzere bir öğrenci tablosu oluşturuldu ve 3 data eklendi. Bu işlemleri select * from ogrenci order by 1; ile aşağıdaki hali ile karşımızdadır.

m

 

Daha sonra ki işlemimizde ise tekrardan ogrenci2 adında bir tablo oluşturulacak ve yukardaki işlemleri takip eder nitelikte 3 data eklenecektir. Kodları:

 

create table ogrenci2

(

no number,

ad varchar2(10)

);

 

insert into ogrenci2(no,ad) values(1,’Anıl’);

insert into ogrenci2(no,ad) values(2,’Çağatay’);

insert into ogrenci2(no,ad) values(3,’Tolga’);

İşlemlerimiz sonrası tabloyu select * from ogrenci2 order by 1;  komutu ile listeletme işlemi yapıyoruz

 

m1

 

merge into ogrenci2 iki

using(select no,ad from ogrenci) bir

on (bir.no=iki.no)

WHEN MATCHED THEN

UPDATE SET iki.ad = bir.ad

WHEN NOT MATCHED THEN

INSERT (iki.no,iki.ad)

VALUES (bir.no,bir.ad);

 

Daha sonra da Merge işlemi yapılır .Yukarıda ki kodlar da yapılmak istenen, öğrenci tablosundaki dataları al ogrenci2 tablosunda ki datalar ile birleştir yani data var ise update (değiştir, güncelle) yok ise insert (ekle) et ve son olarak bu uygulamamızda select * from ogrenci2 order by 1; kodu ile birleştirme sonrası değişiklikleri gözlemleyeceğiz,

 

m2

Üstte görünen resimde ki gibi data olmadığından insert işlemi olmadı ama “2” no lu Çağatay ve “3” nolu Tolga datası Okan ve Reşat datası olarak update edilmiştir. Bu basit uygulama sonrası biraz daha kapsamlı bir şekilde Merge komutunun görevini inceleyeceğiz…

Soru: İki tane personel tablosu var ve ortak kolonların yanında farklı kolonlarda bulunmaktadır, bunun için nasıl bir merge işlemi uygulanmalıdır?

Bu soru için ilk önce iki adet tablo oluşturup data insert edeceğiz:  Personel tablosu ve dataların listelenmesi aşağıdaki gibidir.

create table personel

(

id number(5),

ad varchar2(10),

soyad varchar2(10),

dept_no number(10),

maas number(10)

);

insert into personel(id,ad,soyad,dept_no,maas) values(1,’Anıl’,'Erdoğan’,100,1500);

insert into personel(id,ad,soyad,dept_no,maas) values(2,’Çağatay’,'Aksu’,100,1200);

insert into personel(id,ad,soyad,dept_no,maas) values(3,’Tolga’,'Açıkgöz’,200,2500);

insert into personel(id,ad,soyad,dept_no,maas) values(4,’Veysel’,'Maden’,200,2700);

 

select * from personel

 

m3

 

Personel2 tablosu ve dataların listelenmesi aşağıdaki gibidir.

 

create table personel2

(

id number(5),

ad varchar2(10),

soyad varchar2(10),

dept_no number(10),

mail varchar2(10)

);

insert into personel2(id,ad,soyad,dept_no,mail) values(8,’Ahmet’,'Erdi’,100,’[email protected]’);

insert into personel2(id,ad,soyad,dept_no,mail) values(7,’Bilal’,'Akman’,100,’[email protected]’);

insert into personel2(id,ad,soyad,dept_no,mail) values(9,’Tarık’,'Kinin’,200,’[email protected]’);

insert into personel2(id,ad,soyad,dept_no,mail) values(5,’Kerem’,'Sönmez’,200,’[email protected]’);

 

select * from personel2 order by 1;

 

m4

 

İki tabloyu da oluşturduk, bakıldığında personel tablosunda maaş kolonu varken, personel2 tablosunda bulunmamaktadır aynı şekilde personel2 tablosunda mail kolonu varken, personel tablosunda bulunmamaktadır ve yapacağımız işlem iki tabloyu da kapsayacak şekilde yeni bir tablo oluşturmak ve bu iki personel tablosunu ortak tabloya merge etmek olacaktır..

 

merge into ortak_personel iki

using(select id,ad,soyad,dept_no,maas from personel) bir

on (bir.id=iki.id)

WHEN MATCHED THEN

UPDATE SET  iki.ad = bir.ad,

iki.soyad = bir.soyad,

iki.dept_no = bir.dept_no,

iki.maas = bir.maas,

iki.mail = null

WHEN NOT MATCHED THEN

INSERT (iki.id,iki.ad,iki.soyad,iki.dept_no,iki.maas,iki.mail)

VALUES (bir.id,bir.ad,bir.soyad,bir.dept_no,bir.maas,null);

Yukarıdaki işlemde personel tablosu ortak_personel tablosuna merge edildi ve personel tablosunda mail kolonu olmadığından ortak_personel tablosunda bulunan mail kolonuna null değer aktarıldı.

select * from ortak_personel order by 1 ? Kodu sonrası aşağıdaki listeye ulaşırız.

 

m5

 

Daha sonra ise personel2 tablosunu ortak_personel tablosuna merge ediyoruz.

 

merge into ortak_personel iki

using(select id,ad,soyad,dept_no,mail from personel2) bir

on (bir.id=iki.id)

WHEN MATCHED THEN

UPDATE SET  iki.ad = bir.ad,

iki.soyad = bir.soyad,

iki.dept_no = bir.dept_no,

iki.maas = null,

iki.mail = bir.mail

WHEN NOT MATCHED THEN

INSERT (iki.id,iki.ad,iki.soyad,iki.dept_no,iki.maas,iki.mail)

VALUES (bir.id,bir.ad,bir.soyad,bir.dept_no,null,bir.mail);

 

Bu kod ile merge işlemimizin sonrasında meydana gelen değişiklikleri görüyoruz:

select * from ortak_personel order by 1;

 

m6

 

Merge işlemini size iki örnek ile anlatmaya çalıştım umarım faydalı olmuştur, bir sonraki VİEW konulu makalem  de görüşmek dileği ile… Anıl ERDOĞAN

 

Hakkında Yusuf Arslan

Sakarya Üniversitesi Bilgisayar Mühendisliği bölümünü bitirdikten sonra kariyerine Datawarehouse-Database Uzmanı olarak devam etmektedir Sitenin kurucusu ve yazarıdır. yus[email protected] adresinden bana ulaşabilirsiniz.

Cevapla

E-posta adresiniz yayınlanmayacak. Required fields are marked *

*


Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>