Oracle ZBIERANIE ZBIORCZE PL/SQL: FORALL Przykład

Co to jest ZBIERANIE BULKOWE?

BULK COLLECT ogranicza przełączanie kontekstu pomiędzy silnikiem SQL i PL/SQL i umożliwia silnikowi SQL jednoczesne pobieranie rekordów.

Oracle PL/SQL zapewnia funkcję zbiorczego pobierania rekordów, zamiast pobierania jeden po drugim. Tego BULK COLLECT można użyć w instrukcji „SELECT” w celu zbiorczego wypełnienia rekordów lub zbiorczego pobrania kursora. Ponieważ BULK COLLECT pobiera rekord BULK, klauzula INTO powinna zawsze zawierać zmienną typu kolekcji. Główną zaletą korzystania z BULK COLLECT jest zwiększenie wydajności poprzez ograniczenie interakcji pomiędzy bazą danych a silnikiem PL/SQL.

Składnia:

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

W powyższej składni BULK COLLECT służy do zbierania danych z instrukcji „SELECT” i „FETCH”.

Klauzula FORALL

FORALL pozwala na wykonywanie operacji DML na danych hurtowo. Jest podobny do pętli FOR, z wyjątkiem Dla pętli rzeczy dzieją się na poziomie rekordu, podczas gdy w FORALL nie ma koncepcji LOOP. Zamiast tego przetwarzane są jednocześnie wszystkie dane znajdujące się w danym zakresie.

Składnia:

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

<DML operations>;

W powyższej składni podana operacja DML zostanie wykonana dla wszystkich danych znajdujących się pomiędzy dolnym i górnym zakresem.

Klauzula LIMIT

Koncepcja gromadzenia zbiorczego ładuje całe dane do docelowej zmiennej zbiorczej jako zbiorcze, tj. całe dane zostaną wprowadzone do zmiennej zbiorczej za jednym razem. Nie jest to jednak wskazane, gdy łączny rekord, który należy załadować, jest bardzo duży, bo kiedy PL / SQL próbuje załadować wszystkie dane, zużywa więcej pamięci sesji. Dlatego zawsze dobrze jest ograniczyć rozmiar tej operacji zbiorczego zbierania danych.

Jednak takie ograniczenie wielkości można łatwo osiągnąć wprowadzając warunek ROWNUM w instrukcji 'SELECT', podczas gdy w przypadku kursora nie jest to możliwe.

Aby to przezwyciężyć Oracle udostępnił klauzulę „LIMIT”, która określa liczbę rekordów, które należy uwzględnić w zbiorze.

Składnia:

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

W powyższej składni instrukcja pobierania kursora wykorzystuje instrukcję BULK COLLECT wraz z klauzulą ​​LIMIT.

ZBIERAJ ZBIORCZO Atrybuty

Podobny do kursor atrybuty BULK COLLECT mają %BULK_ROWCOUNT(n), który zwraca liczbę wierszy, których dotyczy nth Instrukcja DML instrukcji FORALL, tzn. poda liczbę rekordów, których dotyczy instrukcja FORALL, dla każdej pojedynczej wartości ze zmiennej kolekcji. Termin „n” wskazuje sekwencję wartości w kolekcji, dla której wymagana jest liczba wierszy.

1 przykład: W tym przykładzie wyświetlimy nazwiska wszystkich pracowników z tabeli emp za pomocą BULK COLLECT, a także zwiększymy pensje wszystkich pracowników o 5000 za pomocą FORALL.

ZBIERAJ ZBIORCZO Atrybuty

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;
/

Wydajność

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

Wyjaśnienie kodu:

  • Linia kodu 2: Deklarowanie kursora guru99_det dla instrukcji „SELECT emp_name FROM emp”.
  • Linia kodu 3: Deklarowanie lv_emp_name_tbl jako typu tabeli VARCHAR2(50)
  • Linia kodu 4: Deklarowanie nazwy lv_emp_name jako typu lv_emp_name_tbl.
  • Linia kodu 6: Otwarcie kursora.
  • Linia kodu 7: Pobieranie kursora za pomocą BULK COLLECT z rozmiarem LIMIT jako 5000 intl zmienna lv_emp_name.
  • Linia kodu 8-11: Konfigurowanie pętli FOR w celu wydrukowania całego rekordu w kolekcji nazwa_emp_lv.
  • Linia kodu 12: Korzystanie z FORALL aktualizuje wynagrodzenie wszystkich pracowników o 5000.
  • Linia kodu 14: Zatwierdzenie transakcji.