Oracle PL/SQL BULK COLLECT: FORALL Örneği

TOPLU TOPLAMA nedir?

BULK COLLECT, SQL ve PL/SQL motoru arasındaki bağlam geçişlerini azaltır ve SQL motorunun kayıtları bir kerede getirmesine olanak tanır.

Oracle PL/SQL, kayıtları tek tek almak yerine toplu olarak alma işlevini sağlar. Bu BULK COLLECT, kayıtları toplu olarak doldurmak veya imleci toplu olarak getirmek için 'SELECT' ifadesinde kullanılabilir. BULK COLLECT, kaydı BULK olarak getirdiğinden, INTO yan tümcesinin her zaman bir koleksiyon türü değişkeni içermesi gerekir. BULK COLLECT kullanmanın temel avantajı, veritabanı ile PL/SQL motoru arasındaki etkileşimi azaltarak performansı arttırmasıdır.

Sözdizimi:

SELECT <columnl> BULK COLLECT INTO bulk_varaible FROM <table name>;
FETCH <cursor_name> BULK COLLECT INTO <bulk_varaible >;

Yukarıdaki sözdiziminde, 'SELECT' ve 'FETCH' ifadesinden veri toplamak için BULK COLLECT kullanılmıştır.

FORALL Maddesi

FORALL, veriler üzerinde DML işlemlerinin toplu olarak gerçekleştirilmesine olanak sağlar. FOR döngü deyimininkine benzer, ancak şu farkla: Döngü için işler rekor düzeyde gerçekleşirken FORALL'da LOOP kavramı yoktur. Bunun yerine, verilen aralıkta bulunan tüm veriler aynı anda işlenir.

Sözdizimi:

FORALL <loop_variable>in<lower range> .. <higher range> 

<DML operations>;

Yukarıdaki sözdiziminde, verilen DML işlemi alt ve üst aralık arasında bulunan tüm veriler için yürütülecektir.

SINIR Maddesi

Toplu toplama konsepti, tüm verileri hedef koleksiyon değişkenine toplu olarak yükler, yani tüm veriler tek seferde koleksiyon değişkenine doldurulur. Ancak yüklenmesi gereken toplam kayıt çok büyük olduğunda bu tavsiye edilmez. PL / SQL tüm veriyi yüklemeye çalıştığında daha fazla oturum belleği tüketir. Bu nedenle, bu toplu toplama işleminin boyutunu sınırlamak her zaman iyidir.

Ancak bu boyut sınırına 'SELECT' ifadesine ROWNUM koşulu getirilerek kolaylıkla ulaşılabilir, oysa imleç durumunda bu mümkün değildir.

Bunun üstesinden gelmek için Oracle toplu olarak dahil edilmesi gereken kayıtların sayısını tanımlayan 'LIMIT' maddesini sağlamıştır.

Sözdizimi:

FETCH <cursor_name> BULK COLLECT INTO <bulk_variable> LIMIT <size>;

Yukarıdaki sözdiziminde, imleç fetch deyimi, LIMIT deyimiyle birlikte BULK COLLECT deyimini kullanır.

TOPLU TOPLAMA Nitelikleri

Benzer imleç BULK COLLECT özelliği, n'de etkilenen satır sayısını döndüren %BULK_ROWCOUNT(n) özelliğine sahiptir.th FORALL ifadesinin DML ifadesi, yani koleksiyon değişkenindeki her bir değer için FORALL ifadesinde etkilenen kayıtların sayısını verecektir. 'N' terimi, koleksiyondaki satır sayısının gerekli olduğu değer sırasını belirtir.

Örnek 1: Bu örnekte BULK COLLECT kullanarak tüm çalışan isimlerini emp tablosundan yansıtacağız ve ayrıca FORALL kullanarak tüm çalışanların maaşını 5000 artıracağız.

TOPLU TOPLAMA Nitelikleri

DECLARE
CURSOR guru99_det IS SELECT emp_name FROM emp;
TYPE lv_emp_name_tbl IS TABLE OF VARCHAR2(50);
lv_emp_name lv_emp_name_tbl;
BEGIN
OPEN guru99_det;
FETCH guru99_det BULK COLLECT INTO lv_emp_name LIMIT 5000;
FOR c_emp_name IN lv_emp_name.FIRST .. lv_emp_name.LAST
LOOP
Dbms_output.put_line(‘Employee Fetched:‘||c_emp_name);
END LOOP:
FORALL i IN lv_emp_name.FIRST .. lv emp_name.LAST
UPDATE emp SET salaiy=salary+5000 WHERE emp_name=lv_emp_name(i);
COMMIT;	
Dbms_output.put_line(‘Salary Updated‘);
CLOSE guru99_det;
END;
/

Çıktı

Employee Fetched:BBB
Employee Fetched:XXX 
Employee Fetched:YYY
Salary Updated

Kod Açıklaması:

  • Kod satırı 2: 'SELECT emp_name FROM emp' ifadesi için guru99_det imlecinin bildirilmesi.
  • Kod satırı 3: lv_emp_name_tbl'nin VARCHAR2(50) tablo türü olarak bildirilmesi
  • Kod satırı 4: lv_emp_name'in lv_emp_name_tbl türü olarak bildirilmesi.
  • Kod satırı 6: İmleci açma.
  • Kod satırı 7: İmleci, LIMIT boyutunda 5000 intl lv_emp_name değişkeni ile BULK COLLECT kullanarak getirme.
  • Kod satırı 8-11: lv_emp_name koleksiyonundaki tüm kayıtları yazdırmak için FOR döngüsünü ayarlama.
  • Kod satırı 12: FORALL'u kullanarak tüm çalışanların maaşını 5000 oranında güncelliyoruz.
  • Kod satırı 14: İşlem gerçekleştiriliyor.