Ogólna zasada jest taka, że jeśli możesz to zrobić za pomocą pojedynczego polecenia SQL zamiast PL/SQL, powinieneś. Zwykle będzie bardziej wydajny.
Jednakże, jeśli potrzebujesz dodać więcej logiki proceduralnej (z jakiegoś powodu), może być konieczne użycie PL/SQL, ale powinieneś użyć operacji zbiorczych zamiast przetwarzania wiersz po rzędzie. (Uwaga: w Oracle 10g i późniejszych, twoja pętla FOR automatycznie użyje BULK COLLECT, aby pobrać 100 wierszy na raz, ale instrukcja wstawiania będzie nadal wykonywana rząd po rzędzie).
np.
DECLARE
TYPE tA IS TABLE OF FOO.A%TYPE INDEX BY PLS_INTEGER;
TYPE tB IS TABLE OF FOO.B%TYPE INDEX BY PLS_INTEGER;
TYPE tC IS TABLE OF FOO.C%TYPE INDEX BY PLS_INTEGER;
rA tA;
rB tB;
rC tC;
BEGIN
SELECT * BULK COLLECT INTO rA, rB, rC FROM FOO;
-- (do some procedural logic on the data?)
FORALL i IN rA.FIRST..rA.LAST
INSERT INTO BAR(A,
B,
C)
VALUES(rA(i),
rB(i),
rC(i));
END;
Powyższe rozwiązanie pozwala zminimalizować przełączanie kontekstu między SQL a PL/SQL. Oracle 11g ma również lepsze wsparcie dla tabel rekordów, dzięki czemu nie musisz mieć oddzielnej tabeli PL/SQL dla każdej kolumny.
Ponadto, jeśli objętość danych jest bardzo duża, istnieje możliwość zmiany kodu w celu przetwarzania danych w partiach.
FYI, nie powinieneś nazywać tego "wkładką zbiorczą". Podczas wstawiania dużych ilości danych dostępna jest funkcja PL/SQL o nazwie Operacje masowe (wkłady masowe, gromadzenie zbiorcze) itd. – moleboy
Aby dodać odniesienie do operacji zbiorczych, należy wziąć pod uwagę, że nad pozostałymi dwoma elementami w przypadku operacji związanych z dużymi danymi lub ciągłe, regularne operacje wstawiania. W przykładach wkładek masowych można uzyskać olbrzymią poprawę wydajności w porównaniu z prostymi wstawkami w podanych przykładach. – DCookie