Oracle PL/SQL BULK COLLECT: FORALL Örneği
⚡ Akıllı Özet
TOPLU ALIM Oracle PL/SQL, bir koleksiyona aynı anda birçok satır getirirken, FORALL ise toplu DML işlemlerini veritabanına geri gönderir. Her ikisi de SQL ve PL/SQL motorları arasındaki bağlam geçişlerini azaltarak performansı artırır.

TOPLU TOPLAMA nedir?
BULK COLLECT, bağlamlar arasındaki geçişleri azaltır. SQL ve PL/SQL motorunu destekler ve SQL motorunun kayıtları tek seferde getirmesine olanak tanır.
Oracle PL / SQL Bu BULK COLLECT, kayıtları tek tek almak yerine toplu olarak alma işlevini sağlar. Bu BULK COLLECT, kayıtları toplu olarak doldurmak veya almak için bir SELECT ifadesinde kullanılabilir. imleç Toplu olarak. BULK COLLECT kayıtları toplu olarak getirdiği için, INTO yan tümcesi her zaman bir koleksiyon türü değişkeni içermelidir. BULK COLLECT kullanmanın temel avantajı, veritabanı ile PL/SQL motoru arasındaki etkileşimi azaltarak performansı artırmasıdır.
Sözdizimi:
SELECT <column1> BULK COLLECT INTO bulk_variable FROM <table name>; FETCH <cursor_name> BULK COLLECT INTO <bulk_variable>;
Yukarıdaki sözdiziminde, BULK COLLECT, SELECT ve FETCH ifadelerinden verileri toplamak için kullanılır.
FORALL Maddesi
FORALL bildirisi şu işlevleri yerine getirir: DML işlemleri Toplu veri üzerinde çalışır. FOR döngüsüne benzer, ancak FOR döngüsünde işlemler kayıt düzeyinde gerçekleşirken, FORALL'da döngü kavramı yoktur. Bunun yerine, verilen aralıktaki 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 veri yükleme kavramı, tüm veriyi hedef veri toplama değişkenine toplu olarak yükler; yani tüm veri tek seferde veri toplama değişkenine aktarılır. Ancak, yüklenmesi gereken toplam kayıt sayısı çok büyük olduğunda bu yöntem önerilmez, çünkü PL/SQL tüm veriyi yüklemeye çalıştığında daha fazla oturum belleği tüketir. Bu nedenle, bu toplu veri yükleme işleminin boyutunu sınırlamak her zaman iyidir.
Bu boyut sınırlaması, SELECT ifadesine ROWNUM koşulu eklenerek kolayca elde edilebilirken, imleç durumunda bu mümkün değildir.
Bunun üstesinden gelmek için, Oracle Toplu işleme dahil edilmesi gereken kayıt 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ç getirme ifadesi, LIMIT yan tümcesiyle birlikte BULK COLLECT ifadesini kullanır.
TOPLU TOPLAMA Nitelikleri
İmleç özelliklerine benzer şekilde, BULK COLLECT'in %BULK_ROWCOUNT(n) özelliği, FORALL ifadesinin n. DML ifadesinde etkilenen satır sayısını döndürür; yani, koleksiyon değişkenindeki her bir değer için FORALL ifadesinde etkilenen kayıt sayısını verir. 'n' terimi, satır sayısının gerekli olduğu koleksiyondaki değerin sırasını gösterir.
Örnek 1: Bu örnekte, BULK COLLECT kullanarak emp tablosundaki tüm çalışan isimlerini yansıtacağız ve ayrıca FORALL kullanarak tüm çalışanların maaşlarını 5000 artıracağız.
Aşağıdaki ekran görüntüsü, BULK COLLECT ve FORALL komutlarının bu örneğini ve çıktısını göstermektedir. Oracle.
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 salary=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
Code Açıklama:
- Code 2 hattı: 'SELECT emp_name FROM emp' sorgusu için guru99_det imleci tanımlanıyor.
- Code 3 hattı: lv_emp_name_tbl'yi VARCHAR2(50) tablo türü olarak tanımlıyoruz.
- Code 4 hattı: lv_emp_name'i lv_emp_name_tbl türünde tanımlıyoruz.
- Code 6 hattı: İmleci açma.
- Code 7 hattı: BULK COLLECT komutu kullanılarak ve LIMIT boyutu 5000 olarak belirlenerek imleç lv_emp_name değişkenine alınıyor.
- Code 8-11. satırlar: lv_emp_name koleksiyonundaki tüm kayıtları yazdırmak için bir FOR döngüsü oluşturuluyor.
- Code 12 hattı: FORALL kullanarak tüm çalışanların maaşlarını 5000 artırın.
- Code 14 hattı: Suçu işlemek işlem.

