Zbiorcze przetwarzanie danych za pomocą oświadczenia FORALL
Wiem, że poprzedni samouczek był krótką przerwą od naszej serii zbiorczego zbierania. W końcu było to żądanie publiczności i mieliśmy obowiązek to spełnić. Ale nie martw się, wracamy na właściwe tory. Zobaczmy więc wprowadzenie do masowego przetwarzania danych przy użyciu instrukcji FORALL w bazie danych Oracle.
Jeśli nie wiesz o jakim tutorialu mówię to sprawdź tutaj. Przejdźmy teraz do tematu.
Co to jest oświadczenie FORALL?
Instrukcja FORALL pomaga przetwarzać dane zbiorcze w zoptymalizowany sposób, wysyłając instrukcje DML lub instrukcję MERGE (jeśli używasz 11g lub powyżej) w partiach z silnika PL/SQL do silnika SQL.
Możesz również zdefiniować instrukcję FORALL jako konstrukcję pętli zbiorczej, która wykonuje instrukcję DML lub instrukcję MERGE raz lub wiele razy naraz.
Zbieranie zbiorcze optymalizuje zapytanie i zwiększa wydajność, zmniejszając przełączniki kontekstu. FORALL robi to samo dla instrukcji DML, takich jak Insert, Delete, Update lub dla instrukcji MERGE.
Jaka jest składnia wyrażenia FORALL?
Składnia jest dość prosta, spójrzmy.
FORALL index IN bound_clauses [SAVE EXCEPTION] DML statement;
Gdzie:
DLA WSZYSTKICH jest słowem kluczowym Oracle Reserved.
Indeks jest niejawnie zdefiniowanym licznikiem pętli, który jest deklarowany przez silnik PL/SQL jako PLS_INTEGER. Ponieważ jest niejawnie zdefiniowany przez silnik PL/SQL, nie musisz go definiować. Zakres Indeksu jest ograniczony do oświadczenia FORALL, w którym jest zdefiniowany.
Związane_klauzule są klauzulami, które kontrolują liczbę iteracji pętli. Od tego zależy również wartość indeksu. Istnieją trzy rodzaje klauzul związanych w Oracle PL/SQL, które omówimy osobno w dalszej części tego samouczka.
ZAPISZ WYJĄTEK jest opcjonalnym wyborem, który utrzymuje działanie instrukcji FORALL nawet wtedy, gdy instrukcja DML powoduje wyjątek. Te wyjątki są zapisywane w atrybucie kursora o nazwie SQL%Bulk_Exceptions.
Informacje:
Ze względu na SAVE EXCEPTION, instrukcja FORALL nie kończy się nagle, nawet jeśli występuje wyjątek. Jest to przewaga instrukcji FORALL nad pętlą FOR.
Oświadczenie DML :Instrukcja DML może być dowolną instrukcją DML, taką jak INSERT, UPDATE lub DELETE. Jeśli używasz Oracle 11g lub nowszego, możesz również użyć instrukcji MERGE z FORALL. Musisz jednak upewnić się, że instrukcja DML lub instrukcja MERGE musi odwoływać się do co najmniej jednej kolekcji w klauzuli VALUES lub WHERE.
Co więcej, w przeciwieństwie do pętli FOR, za pomocą instrukcji FORALL możemy używać tylko jednego DML na raz. To jest wada FORALL.
Czy FORALL jest pętlą jak pętla FOR?
Nie, chociaż instrukcja FORALL przechodzi przez wszystkie wiersze kolekcji, ale nie jest pętlą FOR. Jeśli dokładnie zapoznałeś się ze składnią, to musiałeś zauważyć, że w przeciwieństwie do „FOR Loop” blok instrukcji FORALL nie zaczyna się słowem kluczowym LOOP ani nie kończy się słowem kluczowym END LOOP.
Czy możemy wykonać wstawianie i aktualizowanie DML jednocześnie za pomocą FORALL?
Nie, niestety w przeciwieństwie do pętli FOR z FORALL nie możemy wykonać więcej niż jednego DML na raz. Oznacza to, że możesz wykonać wstawkę lub aktualizację jednocześnie, a nie oba jednocześnie. To jest wada oświadczenia FORALL.
Co to jest atrybut kursora SQL%Bulk_Exceptions?
Atrybut kursora SQL%Bulk_Exceptions to zbiór rekordów, który ma dwa pola Error_Index i Error_Code. Error_Index przechowuje liczbę iteracji instrukcji FORALL, w trakcie których wystąpił wyjątek. Z drugiej strony Error_Code przechowuje kod wyjątku, który odpowiada zgłoszonemu wyjątkowi.
Czy możemy zobaczyć liczbę wyjątków, które wystąpiły podczas wykonywania instrukcji FORALL?
Możesz łatwo sprawdzić, ile wyjątków zostało zgłoszonych podczas wykonywania instrukcji FORALL, używając SQL%BULK_EXCEPTION.COUNT.
Co to są klauzule związane? Powiedz nam coś o nich.
Jak wspomniano powyżej, klauzule Bound kontrolują wartość indeksu pętli i liczbę iteracji instrukcji FORALL. Istnieją trzy typy klauzul powiązanych, których można używać z instrukcją FORALL w bazie danych Oracle. Są to:
- Dolna i górna granica
- Indeksy i
- Wartości
GÓRNA I DOLNA granica :Podobnie jak w przypadku FOR LOOP, w tej klauzuli powiązanej musisz określić poprawny początek i koniec kolejnych numerów indeksu wskazanej kolekcji.
Konieczne jest określenie prawidłowego zakresu kolejnych numerów indeksu wraz z niniejszą klauzulą powiązaną dla liczby kolekcji, do których odwołuje się instrukcja DML. Jednak istnieje ryzyko błędu, jeśli kolekcja, do której odwołuje się ta klauzula, jest rzadka. Pojawi się następujący błąd:
ORA-22160: element at index [3] does not exist
W przypadku, gdy Twoja kolekcja, do której się odnosisz, jest nieliczna i używasz Oracle 10g lub wyższej, możesz użyć dwóch pozostałych opcji, czyli „Wskaźniki” i „Wartości”.
WSKAŹNIKI :Druga dostępna dla nas klauzula związana to ‘Indices of’. Ta klauzula związana umożliwia naszej instrukcji FORALL przechodzenie przez rzadką kolekcję, taką jak tablica asocjacyjna lub tabela zagnieżdżona.
Sugerowana lektura:wprowadzenie do kolekcji PL/SQL
WARTOŚCI :Trzecia klauzula związana to Values of. Opcja VALUES OF wyjaśnia, że wartości elementów określonej kolekcji licznika pętli są podstawą wartości w instrukcji FORALL. Zasadniczo ta kolekcja jest grupą indeksów, przez którą może przechodzić instrukcja FORALL. Co więcej, te indeksy nie muszą być unikalne i mogą być wymienione w dowolnej kolejności.
Jeśli nauczysz się szybciej, oglądając samouczek wideo, oto jedno szczegółowo wyjaśniające oświadczenie FORALL.
W przyszłych samouczkach nauczymy się używać wszystkich tych powiązanych klauzul z instrukcją FORALL, więc bądźcie czujni. Aby uzyskać najnowszą aktualizację, możesz zasubskrybować mój kanał na YouTube i śledzić mnie w moich mediach społecznościowych.
Dzięki i życzę miłego dnia!