Klauzula zbiorczego zbierania z instrukcją SELECT INTO
Witamy w drugim samouczku z serii PL/SQL Bulk Collect, w którym nauczymy się używać klauzuli BULK COLLECT z instrukcją SELECT-INTO.
Przełączniki kontekstowe są dobre, ale tylko wtedy, gdy ich liczba jest niewielka. Zwiększona liczba przełączników kontekstu może powodować problemy, takie jak niska wydajność zapytań. To obciążenie spowodowane przez przełączniki kontekstu można łatwo kontrolować, jeśli możemy je skompresować. Właśnie tego nauczysz się w tym samouczku.
Możesz dowiedzieć się więcej o SELECT-INTO tutaj .
Kiedy powinniśmy używać zbiorczego zbierania z wyciągiem Select-Into?
Gdy masz pewność, że zwracany wynik instrukcji SELECT jest mały wtedy powinieneś użyć klauzuli Bulk Collect z instrukcją Select-Into. W przeciwnym razie klauzula zbiorczego zbierania danych sprawi, że instrukcja Select-Into stanie się potworem pochłaniającym pamięć. W konsekwencji spowolni to działanie Twojej bazy danych.
Co powinienem zrobić, jeśli moja instrukcja SELECT pobiera ogromną liczbę wierszy?
Zawsze możesz użyć klauzuli LIMIT razem z Bulk Collect, aby ograniczyć liczbę wierszy pobieranych z bazy danych. Ale jest to możliwe tylko wtedy, gdy używamy klauzuli Bulk Collect z kursorami PL/SQL. Niemniej jednak omówimy to szczegółowo w następnym samouczku.
Dlaczego nie możemy ograniczyć danych pobieranych za pomocą funkcji Bulk Collect w instrukcji SELECT-INTO?
Kiedy używamy klauzuli Bulk Collect z instrukcją SELECT-INTO, używa ona niejawnego kursor do wykonania zadania masowego przetwarzania danych. Klauzula Limit może być jednak używana tylko z klauzulą Bulk Collect, gdy ta ostatnia używa Kursora jawnego do przetwarzania danych.
Kiedy klauzula zbiorczego zbierania używa niejawnego kursora, a kiedy jawnego?
Jeśli używamy klauzuli zbiorczej zbiorczej z instrukcją SQL, taką jak SELECT-INTO, używa ona niejawnego kursora. Z drugiej strony za każdym razem, gdy używamy klauzuli Bulk Collect z instrukcją FETCH, używa ona wyraźnego kursora.
Proponuję przeczytać jak utworzyć wyraźny kursor , aby dowiedzieć się więcej o wyciągu FETCH.
Czy możemy przechowywać wynik zwrócony przez klauzulę zbiorczego zbierania danych w zmiennej o pierwotnym typie danych?
Nie, jak na razie kolekcje PL/SQL są jedynymi typami danych obsługującymi zbiorcze przetwarzanie danych z klauzulą zbiorczego zbierania w bazie danych Oracle. W przypadku, gdy spróbujesz zapisać dane pobrane za pomocą klauzuli Bulk Collect w zmiennej typu danych, takiej jak Char, Number lub Varchar2, otrzymasz błąd, który będzie wyglądał następująco:
„PLS-00497:Nie można mieszać między jednym i wieloma wierszami (BULK) na liście INTO”
Definicja zbiorczego zbierania w wyciągu
Instrukcja „Bulk Collect Into” wybiera wiele danych z kolumny i przechowuje je w kolekcji SQL.
Składnia klauzuli Bulk Collect z instrukcją Select-Into.
Składnia używania klauzuli PL/SQL Bulk Collect z instrukcją Select-Into w bazie danych Oracle jest następująca:
SELECT column_list BULK COLLECT INTO collection_datatype_name FROM table_name WHERE <where clause> ORDER BY <column list>;
Gdzie:
Lista kolumn to lista kolumn, z których chcesz pobrać dane.
Nazwa typu danych kolekcji będzie nazwą zmiennej kolekcji, która będzie przechowywać dane zwrócone przez klauzulę zbiorczego zbierania.
Ponadto zawsze pamiętaj, że każda kolumna, którą określiłeś do pobierania danych, musi zawierać odpowiedni typ danych kolekcji do przechowywania tych danych. Ponieważ silnik wykonawczy PL/SQL zawsze przechowuje dane pobrane z kolumny w kolekcji w sposób równoległy.
Na przykład
SELECT column_1, column_2 BULK COLLECT INTO collection_1, collection2 FROM table;
Tutaj dane pobrane z kolumny_1 zostaną automatycznie zapisane w kolekcji_1, a dane z kolumny_2 w kolekcji_2.
Nazwa tabeli może być nazwą dowolnej tabeli, z której chcesz pobrać dane.
Następnie mamy klauzule WHERE i ORDER BY, które są opcjonalne, ale jeśli chcesz, możesz ich użyć.
Teraz, gdy omówiliśmy składnię, zróbmy prosty przykład, aby dowiedzieć się, jak pracować z klauzulą PL/SQL Bulk Collect z instrukcją SELECT INTO w bazie danych Oracle.
SET SERVEROUTPUT ON; DECLARE TYPE nt_fName IS TABLE OF VARCHAR2 (20); TYPE nt_lName IS TABLE OF VARCHAR2 (20); fname nt_fName; lName nt_lName; BEGIN SELECT first_name, last_name BULK COLLECT INTO fName, lName FROM employees; --Print values from the collection-- FOR idx IN 1..fName.COUNT LOOP DBMS_OUTPUT.PUT_LINE (idx||' - '||fName (idx) ||' '||lName (idx)); END LOOP; END; /
Wyjaśnienie przykładu
Tutaj mamy bardzo prosty kod, który pokazuje, jak używać klauzuli zbiorczej zbiorczej z instrukcją Select-Into. W sekcji deklaracji tego kodu najpierw utworzyliśmy dwie kolekcje typu Nested Table „nt_fName” i „nt_lName” z odpowiadającymi im zmiennymi kolekcji „fName” i „lName”. W rzeczywistości obie te kolekcje będą używane do przechowywania danych zwracanych przez instrukcję Select-Into.
Tutaj możesz przeczytać, jak utworzyć zagnieżdżoną tabelę.
W sekcji deklaracji mamy nasze oświadczenie Select-Into z klauzulą Bulk Collect. Ponadto za pomocą tej instrukcji Select-Into pobieramy wszystkie dane z kolumny Imię i Nazwisko tabeli Pracownicy. Za pomocą klauzuli Bulk Collect przechowujemy te dane w odpowiednich kolekcjach równolegle.
Oprócz wraz z instrukcją Select-Into mamy również „Pętlę for” który drukuje dane obu kolekcji na ekranie wyjściowym.
Do obejrzenia
Koniecznie obejrzyj wideo, w którym pokazałem, jak klauzula zbiorczego zbierania kompresuje wiele przełączników kontekstu w jeden i poprawia wydajność zapytania. Tutaj jest link.
To jest samouczek wyjaśniający szczegółowo koncepcje klauzuli Bulk Collect z instrukcją Select-Into. W tym samouczku próbowałem odpowiedzieć na wszystkie możliwe pytania, które możesz napotkać podczas egzaminu certyfikacyjnego, a także podczas rozmowy kwalifikacyjnej.
Mam nadzieję, że podobało Ci się czytanie. Upewnij się, że UDOSTĘPNIASZ tego bloga znajomym w swojej sieci społecznościowej. Dzięki i życzę miłego dnia!