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 ALIM: Yavaş çalışan satır satır veri çekme yönteminin yerine, tek seferde birden fazla satırı bir koleksiyon değişkenine getirir.
  • 🔁 FORALL: Tek bir bağlam değiştirme işlemiyle tüm koleksiyon üzerinde tek bir INSERT, UPDATE veya DELETE işlemi çalıştırır.
  • 📏 Sınırlama Maddesi: Her BULK COLLECT sorgusunun yükleyeceği satır sayısını sınırlandırarak, büyük tablolarda oturum belleğini korur.
  • 📊 TOPLU ALIM Özellikleri: %BULK_ROWCOUNT(n) özniteliği, n. FORALL DML ifadesinin kaç satırı etkilediğini gösterir.
  • ⚙️ Gerekli Koleksiyonlar: INTO yan tümcesi, iç içe tablo veya ilişkisel dizi gibi bir koleksiyon türünü hedeflemelidir.
  • 🤖 Yapay Zeka Yardımı: GitHub Copilot gibi yapay zeka asistanları, BULK COLLECT ve FORALL bloklarını oluşturur ve eksik bir LIMIT maddesini işaretler.

Oracle PL/SQL BULK COLLECT ve FORALL (LIMIT maddesiyle birlikte) genel bakış

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.

TOPLU TOPLAMA, SINIR ve TÜMÜ ile örnek: çalışan maaşının güncellenmesi Oracle PL / SQL

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.

SSS

Hayır. Toplu toplama (BULK COLLECT SELECT) işlemi asla NO_DATA_FOUND hatası vermez; bunun yerine boş bir koleksiyon döndürür. Her zaman, toplama işlemine başlamadan önce koleksiyonu .COUNT yöntemiyle test edin.pingAksi takdirde sıfır satırı sessizce işleyebilirsiniz.

SAVE EXCEPTIONS, tek tek satırlar başarısız olduğunda FORALL'un çalışmaya devam etmesini sağlar. Başarısız olan satırlar SQL%BULK_EXCEPTIONS'ta saklanır, ardından Oracle ORA-24381 hatası verir, bunu bir tuzakta yakalarsınız. istisna Her hatayı incelemek için bir işleyici.

Bir döngü çok sayıda satır okuduğunda BULK COLLECT komutunu kullanın. imleç FOR döngüsü her switch işleminde bir satır getirir, bu nedenle toplu veri çekme ve FORALL kombinasyonu büyük sonuç kümelerinde çok daha hızlı çalışabilir.

BULK COLLECT, aynı anda birçok satır döndürür, bu nedenle çok satırlı bir kapsayıcıya ihtiyaç duyar. INTO hedefi şu şekilde olmalıdır: Toplamak Örneğin, iç içe tablo, VARRAY veya ilişkisel dizi gibi yapılar, tek bir skalar değişken değil.

Hayır. FORALL başlığı yalnızca bir INSERT, UPDATE, DELETE veya MERGE işlemini yönlendirir. Yalnızca VALUES ve WHERE yan tümcelerindeki değerler her yinelemede değişebilir. Birden fazla ifade için ayrı FORALL ifadeleri kullanın.

Toplu işlem, satır satır koda göre birkaç kat hatta yüz kat daha hızlı olabilir, çünkü BULK COLLECT ve FORALL komutları binlerce motor bağlam geçişini birkaç geçişe indirgeyerek büyük veri hacimlerinde iş yükünü önemli ölçüde azaltır.

Evet. GitHub Yardımcı Pilotu Bu, bir yorumdan BULK COLLECT isteklerini, FORALL DML döngülerini ve LIMIT maddelerini taslak olarak alır ve koleksiyon türü bildirimleri önerir; ancak toplu işlem boyutlarını ve hata işlemeyi kendiniz gözden geçirmeniz gerekir.

Yapay zekâ asistanları, tek seferde bir satır getiren veya değiştiren döngüleri tarar ve bunları BULK COLLECT, LIMIT ve FORALL ile yeniden yazmayı önerir. Bu makine öğrenimi incelemesi, üretim öncesinde eksik LIMIT sınırlarını ve performans darboğazlarını tespit eder.

Bu yazıyı şu şekilde özetleyin: