Oracle Merging Rows
Oracle’da iki tabloyu belirli bir koşula göre karşılaştırarak güncelleme (UPDATE) veya ekleme (INSERT) işlemlerini tek bir SQL ifadesiyle gerçekleştirmek istediğinizde MERGE INTO komutu oldukça kullanışlıdır.
Bu komut, kaynak tablo ile hedef tabloyu belirlediğiniz koşula göre eşleştirir.
- Eğer eşleşen kayıt bulunursa UPDATE işlemi yapılır.
- Eğer eşleşme bulunmazsa INSERT işlemi gerçekleştirilir.
Bu yaklaşım, özellikle senkronizasyon (data synchronization), veri aktarımı (data migration) ve toplu güncelleme işlemlerinde sıkça tercih edilir.
Senaryo
Bu örnekte employees tablosundaki bir çalışanın bilgilerini, copy_emp isimli kopya tabloya aktaracağız.
İşlem sırasında;
- Belirlenen çalışan numarasına göre kayıt aranacak,
- Kayıt varsa güncellenecek,
- Yoksa yeni kayıt eklenecektir.
Örnek Kod
DECLARE
v_empno employees.employee_id%TYPE := 100;
BEGIN
MERGE INTO copy_emp c
USING employees e
ON (c.employee_id = e.employee_id
AND e.employee_id = v_empno)
WHEN MATCHED THEN
UPDATE SET
c.first_name = e.first_name,
c.last_name = e.last_name,
c.email = e.email,
c.phone_number = e.phone_number,
c.hire_date = e.hire_date,
c.job_id = e.job_id,
c.salary = e.salary,
c.department_id = e.department_id
WHEN NOT MATCHED THEN
INSERT
(
employee_id,
first_name,
last_name,
email,
phone_number,
hire_date,
job_id,
salary,
department_id
)
VALUES
(
e.employee_id,
e.first_name,
e.last_name,
e.email,
e.phone_number,
e.hire_date,
e.job_id,
e.salary,
e.department_id
);
END;
/
Kodun Açıklaması
İlk olarak güncellemek veya eklemek istediğimiz çalışan numarasını tanımlıyoruz.
v_empno employees.employee_id%TYPE := 100;
Burada %TYPE kullanılması, değişkenin veri tipinin doğrudan tablo kolonundan alınmasını sağlar. Böylece kolon tipi değişirse kodu güncellemek zorunda kalmayız.
Ardından MERGE INTO komutu ile hedef tablo belirtilir.
MERGE INTO copy_emp c
USING kısmında ise verilerin alınacağı kaynak tablo tanımlanır.
USING employees e
ON bölümü iki tablo arasındaki eşleşme koşulunu belirtir.
ON (
c.employee_id = e.employee_id
AND e.employee_id = v_empno
)
Bu koşul sağlanıyorsa Oracle ilgili kaydı eşleşmiş kabul eder.
WHEN MATCHED
WHEN MATCHED THEN
UPDATE SET ...
Eğer kayıt hedef tabloda mevcutsa yalnızca belirtilen kolonlar güncellenir.
WHEN NOT MATCHED
WHEN NOT MATCHED THEN
INSERT (...)
VALUES (...);
Hedef tabloda karşılık gelen kayıt bulunamazsa yeni kayıt eklenir.
Sonuç
MERGE INTO, Oracle’ın en güçlü DML komutlarından biridir. Tek bir sorgu ile hem UPDATE hem de INSERT işlemlerini gerçekleştirebildiği için kod tekrarını azaltır ve veri senkronizasyonunu oldukça kolaylaştırır.
Özellikle ETL süreçlerinde, veri ambarı uygulamalarında ve farklı tablolar arasında veri eşitleme işlemlerinde sıkça kullanılan bir yöntemdir.
📝 Arşiv Notu
Bu yazı ilk olarak 2010 yılında hazırlanmıştır.
MERGE INTOkomutu Oracle’ın uzun yıllardır desteklediği bir özelliktir ve temel kullanım mantığı günümüzde de aynıdır. Ancak yeni Oracle sürümlerindeMERGEkomutu için ek iyileştirmeler ve yeni özellikler eklenmiştir. Bu yazı, temel kullanım mantığını göstermek amacıyla hazırlanmış bir örnektir.