İçeriğe geç
← Blog

Oracle Merging Rows

3 Nisan 2010, 01:52 Databases 4 dk 3.1k 0

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

PLSQL
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.

PLSQL
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.

PLSQL
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.

PLSQL
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

PLSQL
WHEN MATCHED THEN
    UPDATE SET ...

Eğer kayıt hedef tabloda mevcutsa yalnızca belirtilen kolonlar güncellenir.

WHEN NOT MATCHED

PLSQL
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 INTO komutu 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ümlerinde MERGE komutu 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.