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