![](http://www.sqldat.com/article/uploadfiles/202205/2022051015280955.png)
Klauzula zbiorczego zbierania z wyciągiem FETCH INTO
W poprzednim samouczku udało nam się skompresować wiele przełączników kontekstowych w jeden za pomocą PL/SQL Bulk Collect z instrukcją SELECT-INTO. Instrukcja SELECT-INTO to standardowe zapytanie SQL, co oznacza, że programista nie ma dużej kontroli nad wykonaniem instrukcji.
Jeśli mówimy o wydajności zapytań, nie możemy wyjść poza zakres z instrukcją SELECT-INTO. Zobaczmy, jak możemy przezwyciężyć wszystkie te niedociągnięcia instrukcji SELECT-INTO.
W tym blogu dowiesz się, jak używać klauzuli Bulk Collect z instrukcją FETCH-INTO wyraźnego kursora. Ponieważ instrukcje FETCH są częścią cyklu życia kursora, do lepszego zrozumienia tego samouczka wymagana jest praktyczna znajomość jawnego kursora. Z tego samego powodu możesz zapoznać się z samouczkiem dotyczącym tworzenia wyraźnego kursora w bazie danych Oracle.
Dlaczego powinniśmy używać klauzuli Bulk Collect z instrukcją FETCH INTO?
Jak wspomniano w poprzednim blogu, za każdym razem, gdy używamy Bulk-Collect z instrukcją SELECT-INTO, silnik wykonawczy używa niejawnego kursora do przetwarzania zadania. Ale jeśli użyjemy Bulk Collect z instrukcją FETCH-INTO, silnik wykonawczy użyje jawnego kursora do przetworzenia zadania.
Wyraźny kursor zawsze pomaga nam uzyskać zaawansowaną kontrolę nad naszymi standardowymi zapytaniami SQL. Na przykład za pomocą wyraźnego kursora możemy kontrolować, kiedy pobrać rekordy lub ile rekordów chcemy pobrać jednocześnie, jednak nie jest to możliwe w przypadku instrukcji SELECT-INTO.
Jaka jest składnia funkcji Bulk Collect z instrukcją Fetch-Into?
Podobnie jak w przypadku instrukcji SELECT-INTO, klauzula zbiorczego zbierania działa jako atrybut instrukcji FETCH-INTO. Oto składnia
FETCH <cursor_name> BULK COLLECT INTO <plsql_collection>;
Instrukcje FETCH są częścią jawnego kursora. Jeśli spróbujesz je wykonać bez deklarowania ich kursora nadrzędnego, otrzymasz błąd. Pamiętaj też, że kolekcje PL/SQL są jedyną obsługiwaną strukturą dla zbierania zbiorczego.
Przykład:Jak używać PL/SQL Bulk Collect z instrukcją FETCH-INTO w bazie danych Oracle.
SET SERVEROUTPUT ON; DECLARE --Create an explicit cursor CURSOR exp_cur IS SELECT first_name FROM employees; --Declare collection for holding the data TYPE nt_fName IS TABLE OF VARCHAR2 (20); fname nt_fName; BEGIN OPEN exp_cur; LOOP FETCH exp_cur BULK COLLECT INTO fname; EXIT WHEN fname.count=0; --Print data FOR idx IN fname.FIRST.. fname.LAST LOOP DBMS_OUTPUT.PUT_LINE (idx||' '||fname(idx) ); END LOOP; END LOOP; CLOSE exp_cur; END; /
Szczegółowo wyjaśniłem każdy wiersz tego całego kodu w samouczku wideo na moim kanale YouTube. Możesz obejrzeć ten samouczek.
Ponieważ w tym kodzie użyliśmy klauzuli Bulk Collect z instrukcją fetch into, oznacza to, że przełączanie kontekstu nie będzie problemem. Jak wiemy, klauzula zbiorczego zbierania kompresuje wiele przełączników w jeden, dzięki czemu nie ma dalszego wąskiego gardła wydajności.
Ale czy to oznacza, że ten kod jest dobrze zoptymalizowany i nie wymaga dalszej optymalizacji? A może w przyszłości wydajność zapytań nigdy nie będzie dla nas problemem?
Bądź na bieżąco, aby uzyskać odpowiedzi na wszystkie te pytania, a także dowiedzieć się, jak możemy dalej optymalizować ten program PL/SQL.
Mam nadzieję, że podobał Ci się ten blog. Jeśli masz jakiekolwiek wątpliwości lub pytania lub uważasz, że zapomniałem o czymś wspomnieć na tym blogu, napisz do mnie na mojej stronie na Facebooku lub Twitterze. Dzięki i życzę miłego dnia!