Oracle PL / SQL BULK COLLECT: FORALL Przykład

Spisie treści:

Anonim

Co to jest BULK COLLECT?

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

Oracle PL / SQL zapewnia funkcjonalność pobierania rekordów zbiorczo zamiast pobierania pojedynczo. Tego BULK COLLECT można użyć w instrukcji „SELECT” do zbiorczego wypełniania rekordów lub zbiorczego pobierania kursora. Ponieważ BULK COLLECT pobiera rekord w BULK, klauzula INTO powinna zawsze zawierać zmienną typu kolekcji. Główną zaletą korzystania z BULK COLLECT jest zwiększenie wydajności poprzez zmniejszenie interakcji między bazą danych a silnikiem PL / SQL.

Składnia:

SELECT  BULK COLLECT INTO bulk_varaible FROM 
;FETCH  BULK COLLECT INTO ;

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

W tym samouczku nauczysz się:

  • Klauzula FORALL
  • Klauzula LIMIT
  • Atrybuty BULK COLLECT

Klauzula FORALL

FORALL umożliwia masowe wykonywanie operacji DML na danych. Jest podobny do instrukcji pętli FOR, z wyjątkiem tego, że w pętli FOR rzeczy dzieją się na poziomie rekordu, podczas gdy w FORALL nie ma koncepcji LOOP. Zamiast tego wszystkie dane obecne w podanym zakresie są przetwarzane w tym samym czasie.

Składnia:

FORALL in;

W powyższej składni dana operacja DML zostanie wykonana dla wszystkich danych, które są obecne między dolnym a wyższym zakresem.

Klauzula LIMIT

Koncepcja zbiorczego zbierania danych ładuje całe dane do zmiennej docelowej kolekcji jako zbiorcze, tj. Całe dane zostaną wprowadzone do zmiennej kolekcji za jednym razem. Nie jest to jednak zalecane, gdy całkowity rekord, który należy załadować, jest bardzo duży, ponieważ gdy PL / SQL próbuje załadować całe dane, zużywa więcej pamięci sesji. W związku z tym zawsze dobrze jest ograniczyć rozmiar tej operacji zbiorczej zbiórki.

Jednak ten limit rozmiaru można łatwo osiągnąć, wprowadzając warunek ROWNUM w instrukcji „SELECT”, podczas gdy w przypadku kursora nie jest to możliwe.

Aby przezwyciężyć tę kwestię, Oracle dostarczyła klauzulę „LIMIT”, która określa liczbę rekordów, które należy uwzględnić w zbiorczej.

Składnia:

FETCH  BULK COLLECT INTO  LIMIT ;

W powyższej składni instrukcja pobierania kursora używa instrukcji BULK COLLECT wraz z klauzulą ​​LIMIT.

Atrybuty BULK COLLECT

Podobnie do atrybutów kursora BULK COLLECT ma% BULK_ROWCOUNT (n), który zwraca liczbę wierszy, na które ma wpływ n- ta instrukcja DML instrukcji FORALL, tj. Poda liczbę rekordów, na które ma wpływ instrukcja FORALL, dla każdej pojedynczej wartości z kolekcji zmienna. Termin „n” wskazuje sekwencję wartości w kolekcji, dla której potrzebna jest liczba wierszy.

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

DECLARECURSOR 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;BEGINOPEN 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.LASTLOOPDbms_output.put_line(‘Employee Fetched:‘||c_emp_name);END LOOP:FORALL i IN lv_emp_name.FIRST… lv emp_name.LASTUPDATE emp SET salaiy=salary+5000 WHERE emp_name=lv_emp_name(i);COMMIT; Dbms_output.put_line(‘Salary Updated‘);CLOSE guru99_det;END;/

Wynik

Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYSalary Updated

Objaśnienie kodu:

  • Linia kodu 2 : Deklaracja kursora guru99_det dla instrukcji „SELECT emp_name FROM emp”.
  • Linia kodu 3 : Deklarowanie lv_emp_name_tbl jako typ tabeli VARCHAR2 (50)
  • Linia kodu 4 : Deklarowanie lv_emp_name jako typ lv_emp_name_tbl.
  • Linia kodu 6: Otwarcie kursora.
  • Linia kodu 7: Pobieranie kursora przy użyciu BULK COLLECT z rozmiarem LIMIT jako zmienna 5000 intl lv_emp_name.
  • Linia kodu 8-11: Konfiguracja pętli FOR, aby wydrukować cały rekord z kolekcji lv_emp_name.
  • Linia kodu 12: Korzystanie z FORALL aktualizujące wynagrodzenie wszystkich pracowników o 5000.
  • Linia kodu 14: Zatwierdzenie transakcji.