ORACLE – ROW_NUMBER() ile Loop Kullanımı

Merhaba,

Row_Number() analitik fonksiyonu ile select cümleciğimiz içinde order by kullanarak istediğimiz sıradaki satırları başından itibaren 1..2..3 diye numaralandırabiliriz.

OVER (PARTITION BY …) ile neye göre gruplayacağımızı belirterek GROUP BY kullanmadan neye göre sıralama yaptıracağımızı belirtebiliriz.

    SELECT 
         ROW_NUMBER() OVER (PARTITION BY MATERIAL ORDER BY CREATEDAT) AS BB,
            MATERIAL,MATGRP,CREATEDBY,CREATEDAT,CHANGEDAT 
             FROM tablename V WHERE COMPANY = '01' 
                       AND ISDELETE = 0 
                       AND MATERIAL IN (
                            SELECT MATERIAL FROM tablename WHERE COMPANY = '01' 
                                        AND ISDELETE = 0 
                                        GROUP BY MATERIAL
                                        HAVING COUNT(MATERIAL) > 1
                           )
                       ORDER BY V.MATERIAL
              )

materyal kolonuna göre gruplayıp numaralandırma işlemini BB kolonu ile yapmış oluruz böylelikle, sıralamayı da oluşturma zamanına göre ayarlarız..

xxxxx

Bu durumda sonuç ekranında, yukarıdaki gibi oluşturulma zamanlarına göre sıralanmış ve materyallere göre gruplanmış halde satır id si verilmiş datalara ulaşırız..

Bu aşamadan sonra datayı oracle’da koleksiyon halinde alıp (sql server’da ;WITH ile CTE oluşturmak gibi) veri kümesi içinde dönerek row id ye göre işlemimizi yaptırabiliriz.

BEGIN

FOR COLLECTION IN (
             
    SELECT 
         ROW_NUMBER() OVER (PARTITION BY MATERIAL ORDER BY CREATEDAT) AS BB,
            MATERIAL,MATGRP,CREATEDBY,CREATEDAT,CHANGEDAT 
             FROM tablename V WHERE COMPANY = '01' 
                       AND ISDELETE = 0 
                       AND MATERIAL IN (
                            SELECT MATERIAL FROM tablename WHERE COMPANY = '01' 
                                        AND ISDELETE = 0 
                                        GROUP BY MATERIAL
                                        HAVING COUNT(MATERIAL) > 1
                           )
                       ORDER BY V.MATERIAL
              )
    LOOP

    IF COLLECTION.BB = 1 THEN

       UPDATE tablename 
          SET CREATEDBY = COLLECTION.CREATEDBY,
              CREATEDAT = COLLECTION.CREATEDAT
            WHERE MATERIAL = COLLECTION.MATERIAL AND ISDELETE = 0;
        
    END IF;

    END LOOP;

END;

 

Örnek olarak kodda rowid’si 1 olanlar için bir güncelleme işlemi yaptırıyoruz..

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s