Oracle Kolekcje PL/SQL: Varrays, zagnieżdżone i indeksowane według tabel

⚡ Inteligentne podsumowanie

Kolekcje PL/SQL to uporządkowane grupy elementów tego samego typu danych, do których dostęp uzyskuje się za pomocą indeksu dolnego. Trzy typy: Varray, tabela zagnieżdżona i tabela indeksowana, różnią się tym, czy rozmiar jest stały, jak działa indeks dolny oraz czy można je przechowywać w bazie danych.

  • 🧺 Definicja: Kolekcja zawiera wiele elementów jednego typu, z których każdy jest identyfikowany za pomocą unikalnego indeksu dolnego.
  • 📐 Varray: Stały rozmiar górny, zawsze gęsty, indeks dolny numeryczny, musi zostać zainicjowany przed użyciem.
  • 📚 Zagnieżdżona tabela: Brak ograniczeń co do rozmiaru, może być gęsty lub rzadki, przechowywany w tabeli systemowej, rozszerzany za pomocą EXTEND.
  • 🔑 Indeks według tabeli: Brak limitu rozmiaru, indeks dolny może być ciągiem znaków lub ujemną liczbą całkowitą, która nie jest przechowywana w bazie danych.
  • 🏗️. Budowniczy: Tabele Varray i zagnieżdżone wymagają jawnego konstruktora do zainicjowania przed odwołaniem.
  • 🛠️. metody: Funkcje COUNT, EXISTS, FIRST, LAST, EXTEND, TRIM i DELETE służą do zarządzania kolekcją.
  • Wielka ilość: Funkcja BULK COLLECT umożliwia wypełnienie kolekcji w jednym kroku, co pozwala na szybkie przetwarzanie.

Oracle Kolekcje PL/SQL

Co to jest kolekcja?

Kolekcja to uporządkowana grupa elementów określonego typu danych. Może to być kolekcja prostego lub złożonego typu danych, takiego jak typy zdefiniowane przez użytkownika lub rekordy.

W kolekcji każdy element jest identyfikowany terminem zwanym "indeks." Każdemu elementowi przypisany jest unikalny indeks dolny, a dane można przetwarzać lub pobierać, odwołując się do tego unikalnego indeksu dolnego.

Kolekcje są najbardziej przydatne, gdy trzeba przetworzyć lub zmodyfikować dużą ilość danych tego samego typu. Kolekcje można wypełniać i modyfikować jako całość, korzystając z opcji „BULK” w Oracle.

Kolekcje są klasyfikowane na podstawie struktury, indeksu dolnego i magazynu, jak pokazano poniżej:

  • Tabele indeksowane (znane również jako tablice asocjacyjne)
  • Tabele zagnieżdżone
  • Varrays

W dowolnym momencie do danych w zbiorze można odwoływać się za pomocą trzech terminów: nazwy zbioru, indeksu dolnego oraz nazwy pola lub kolumny, jako „ ( ). ”. Dowiesz się więcej o tych kategoriach kolekcji w poniższych sekcjach.

Typy kolekcji w skrócie

Te trzy typy kolekcji wiążą się z różnymi kompromisami. Poniższa tabela zestawia je ze sobą, a następnie szczegółowo omawia każdy z nich.

WYGLĄD Varray Zagnieżdżona tabela Indeks według tabeli
Rozmiar Stały górny limit Bez limitu Bez limitu
indeks Numeryczne Numeryczne Liczba całkowita lub ciąg znaków
Gęstość Zawsze gęsty Gęsty lub rzadki Zawsze rzadkie
Przechowywane w bazie danych Tak Tak Nie
Wymaga inicjalizacji Tak Tak Nie

Varrays

Varray to kolekcja, w której rozmiar tablicy jest stały i nie może zostać przekroczony. Indeks dolny Varray jest wartością liczbową. Atrybuty Varray to:

  • Rozmiar górnego limitu jest stały.
  • Wypełniane sekwencyjnie, zaczynając od indeksu dolnego '1'.
  • Ten typ kolekcji jest zawsze gęsty; nie możemy usuwać pojedynczych elementów tablicy. Zbiór Varray można usunąć w całości lub przyciąć od końca.
  • Ponieważ jest zawsze gęsty, ma bardzo małą elastyczność.
  • Jest to bardziej odpowiednie, gdy rozmiar tablicy jest znany i podobne czynności są wykonywane na wszystkich elementach.
  • Indeks dolny i liczba pozycji w kolekcji zawsze pozostają stabilne.
  • Musi zostać zainicjowana przed użyciem. Każda operacja na niezainicjowanej kolekcji, z wyjątkiem EXISTS, powoduje błąd.
  • Można go utworzyć jako obiekt bazy danych widoczny w całej bazie danych lub jako obiekt wewnątrz podprogramu, przeznaczony do użytku tylko tam.

Poniższy rysunek przedstawia alokację pamięci Varray (gęstej).

indeks 1 2 3 4 5 6 7
Wartość: Xyz Dfw Sde Cxs Vbc Nhu Qwe

Składnia VARRAY:

TYPE <type_name> IS VARRAY (<SIZE>) OF <DATA_TYPE>;
  • W powyższej składni type_name jest deklarowane jako tablica VARRAY typu „DATA_TYPE” dla podanego limitu rozmiaru. Typ danych może być prosty lub złożony.

Tabele zagnieżdżone

Zagnieżdżona tabela to kolekcja, w której rozmiar tablicy nie jest stały. Ma ona numeryczny indeks dolny. Więcej o zagnieżdżonym typie tabeli:

  • Zagnieżdżona tabela nie ma górnego limitu rozmiaru.
  • Ponieważ górny limit nie jest stały, przed każdym użyciem należy rozszerzyć pamięć, używając słowa kluczowego „EXTEND”.
  • Wypełniane sekwencyjnie, zaczynając od indeksu dolnego '1'.
  • Ten typ kolekcji może być zarówno gęsty i rzadki; możemy stworzyć go gęstym, a także losowo usuwać pojedyncze elementy, co sprawi, że będzie rzadki.
  • Zapewnia większą elastyczność usuwania elementów tablicy.
  • Jest on przechowywany w tabeli bazy danych generowanej przez system i można go używać w zapytaniu selektywnym w celu pobierania wartości.
  • Indeks dolny i liczba liter mogą się różnić.
  • Musi zostać zainicjowana przed użyciem. Każda operacja na niezainicjowanej kolekcji, z wyjątkiem EXISTS, powoduje błąd.
  • Można go utworzyć jako obiekt bazy danych widoczny w całej bazie danych lub jako obiekt wewnątrz podprogramu, przeznaczony do użytku tylko tam.

Poniższy rysunek wyjaśnia alokację pamięci w tabeli zagnieżdżonej (gęstej i rzadkiej). Pusta przestrzeń elementów oznacza element rzadki.

indeks 1 2 3 4 5 6 7
Wartość (gęsta) Xyz Dfw Sde Cxs Vbc Nhu Qwe
Wartość (rzadka) Qwe asd afg asd Wer

Składnia tabeli zagnieżdżonej:

TYPE <type_name> IS TABLE OF <DATA_TYPE>;
  • W powyższej składni type_name jest deklarowane jako zagnieżdżona kolekcja tabel typu „DATA_TYPE”. Typ danych może być prosty lub złożony.

Indeks według tabeli

Tabela indeksowana po indeksie to kolekcja, w której rozmiar tablicy nie jest stały. W przeciwieństwie do innych typów kolekcji, indeks dolny tabeli indeksowanej po indeksie może być zdefiniowany przez użytkownika. Atrybuty tabeli indeksowanej po indeksie to:

  • Indeks dolny może być liczbą całkowitą lub ciągiem znaków. Typ indeksu dolnego należy podać podczas tworzenia kolekcji.
  • Zbiory te nie są przechowywane sekwencyjnie.
  • Mają one zawsze nieliczny charakter.
  • Rozmiar tablicy nie jest stały.
  • Nie można ich przechowywać w kolumnie bazy danych. Są tworzone i używane w ramach konkretnej sesji.
  • Dają większą elastyczność w utrzymaniu indeksu.
  • Indeksy dolne mogą być sekwencją ujemną.
  • Są one bardziej odpowiednie w przypadku stosunkowo mniejszych wartości zbiorów wykorzystywanych w ramach tego samego podprogramu.
  • Nie ma potrzeby ich inicjowania przed użyciem.
  • Nie można ich utworzyć jako obiektów bazy danych; tworzy się je wyłącznie wewnątrz podprogramu.
  • Funkcji BULK COLLECT nie można używać z tym typem kolekcji, ponieważ indeks dolny musi być podany jawnie dla każdego rekordu.

Poniższy rysunek wyjaśnia alokację pamięci w tabeli indeksowanej (rzadkiej). Pusta przestrzeń elementów oznacza element rzadki.

Indeks dolny (varchar) PIERWSZY DRUGIE TRZECI CZWARTY PIĄTY SZÓSTY SIÓDMY
Wartość (rzadka) Qwe asd afg asd Wer

Składnia indeksowania według tabeli:

TYPE <type_name> IS TABLE OF <DATA_TYPE> INDEX BY VARCHAR2 (10);
  • W powyższej składni type_name jest deklarowane jako kolekcja tabel indeksowanych przez typ „DATA_TYPE”. Zmienna indeksu dolnego jest typu VARCHAR2 o maksymalnym rozmiarze 10.

Konstruktor i koncepcja inicjalizacji w kolekcjach

Konstruktory to wbudowane funkcje dostarczane przez Oracle które mają taką samą nazwę jak obiekt lub kolekcja. Są one wykonywane jako pierwsze za każdym razem, gdy w sesji odwołujemy się do obiektu lub kolekcji po raz pierwszy. Ważne szczegóły dotyczące konstruktora w kontekście kolekcji:

  • W przypadku kolekcji konstruktory te muszą zostać wywołane jawnie w celu zainicjowania kolekcji.
  • Zarówno tabele Varray, jak i tabele zagnieżdżone muszą zostać zainicjowane za pomocą tych konstruktorów, zanim będzie można się do nich odwołać w programie.
  • Konstruktor niejawnie rozszerza alokację pamięci dla kolekcji (z wyjątkiem Varray), dzięki czemu może również przypisywać zmienne do kolekcji.
  • Przypisywanie wartości za pomocą konstruktorów nigdy nie sprawia, że ​​kolekcja staje się rozrzedzona.

Metody zbierania

Oracle Oferuje wiele funkcji do manipulowania kolekcjami i pracy z nimi. Funkcje te określają i modyfikują różne atrybuty kolekcji. Poniższa tabela zawiera różne funkcje i ich opisy.

Metoda wykonania OPIS Składnia
ISTNIEJE (n) Zwraca wynik logiczny. Zwraca wartość TRUE, jeśli n-ty element istnieje, w przeciwnym razie FALSE. W przypadku niezainicjowanej kolekcji można użyć tylko funkcji EXISTS. .ISTNIEJE(pozycja_elementu)
COUNT Podaje całkowitą liczbę elementów w kolekcji. .LICZYĆ
LIMIT Zwraca maksymalny rozmiar kolekcji. W przypadku Varray zwraca stały rozmiar; w przypadku tabel zagnieżdżonych i indeksowanych zwraca NULL. .LIMIT
PIERWSZY Zwraca wartość pierwszego indeksu dolnego kolekcji. .PIERWSZY
LAST Zwraca wartość ostatniego indeksu dolnego kolekcji. .OSTATNI
PRZED (n) Zwraca poprzedni indeks dolny n-tego elementu. Jeśli go nie ma, zwracana jest wartość NULL. .PRZED(n)
DALEJ (n) Zwraca kolejny indeks dolny n-tego elementu. Jeśli go nie ma, zwracana jest wartość NULL. .DALEJ(n)
POSZERZAĆ Rozszerza jeden element na końcu kolekcji. .ROZSZERZYĆ
WYDŁUŻ (n) Rozszerza n elementów na końcu kolekcji. .ROZDŁUŻ(n)
WYDŁUŻ (n,i) Rozszerza n kopii i-tego elementu na końcu kolekcji. .EXTEND(n,i)
TRIM Usuwa jeden element z końca kolekcji. .PRZYCINAĆ
PRZYCINANIE (n) Usuwa n elementów z końca kolekcji. .TRIM (n)
DELETE Usuwa wszystkie elementy ze zbioru, czyniąc go pustym. .USUWAĆ
USUŃ (n) Usuwa n-ty element. Jeśli n-ty element jest NULL, nie robi nic. .USUŃ(n)
USUŃ (m, n) Usuwa elementy z zakresu od m-tego do n-tego w kolekcji. .USUŃ(m,n)

Przykład 1: Typ rekordu na poziomie podprogramu

W tym przykładzie widzimy, jak wypełnić kolekcję za pomocą 'ZBIÓRKA ZBIOROWAi jak odwoływać się do danych ze zbioru.

Kolekcja PL/SQL wypełniona przykładem BULK COLLECT

DECLARE
TYPE emp_det IS RECORD
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
TYPE emp_det_tbl IS TABLE OF emp_det;
guru99_emp_rec emp_det_tbl:= emp_det_tbl();
BEGIN
INSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1000,'AAA',25000,1000);
INSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1001,'XXX',10000,1000);
INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000);
INSERT INTO emp (emp_no,emp_name,salary, manager) VALUES (1003,'ZZZ',7500,1000);
COMMIT;
SELECT emp_no,emp_name,manager,salary BULK COLLECT INTO guru99_emp_rec
FROM emp;
dbms_output.put_line ('Employee Detail');
FOR i IN guru99_emp_rec.FIRST..guru99_emp_rec.LAST
LOOP
dbms_output.put_line ('Employee Number: '||guru99_emp_rec(i).emp_no);
dbms_output.put_line ('Employee Name: '||guru99_emp_rec(i).emp_name);
dbms_output.put_line ('Employee Salary:'|| guru99_emp_rec(i).salary);
dbms_output.put_line('Employee Manager Number:'||guru99_emp_rec(i).manager);
dbms_output.put_line('--------------------------------');
END LOOP;
END;
/

Code Wyjaśnienie

  • Code wiersz 2-8: Typ rekordu 'emp_det' jest deklarowany z kolumnami emp_no, emp_name, manager i salary o typie danych NUMBER, VARCHAR2, NUMBER i NUMBER.
  • Code linia 9: Tworzenie kolekcji „emp_det_tbl” elementu typu rekordu „emp_det”.
  • Code linia 10: Deklarowanie zmiennej „guru99_emp_rec” jako typu „emp_det_tbl” i inicjowanie jej konstruktorem null.
  • Code wiersz 12-15: Wstawianie przykładowych danych do tabeli „emp”.
  • Code linia 16: Zatwierdzanie transakcji wstawiania.
  • Code linia 17: Pobieranie rekordów z tabeli „emp” i zbiorcze wypełnianie zmiennej kolekcji za pomocą polecenia „BULK COLLECT”. Zmienna „guru99_emp_rec” zawiera teraz wszystkie rekordy obecne w tabeli „emp”.
  • Code wiersz 19-26: Ustawienie pętli „FOR” w celu wydrukowania wszystkich rekordów w kolekcji jeden po drugim. Metody kolekcji FIRST i LAST służą jako dolna i górna granica pętla.

Wyjście: Po wykonaniu powyższego kodu otrzymasz następujący wynik.

Employee Detail
Employee Number: 1000
Employee Name: AAA
Employee Salary: 25000
Employee Manager Number: 1000
----------------------------------------------
Employee Number: 1001
Employee Name: XXX
Employee Salary: 10000
Employee Manager Number: 1000
----------------------------------------------
Employee Number: 1002
Employee Name: YYY
Employee Salary: 15000
Employee Manager Number: 1000
----------------------------------------------
Employee Number: 1003
Employee Name: ZZZ
Employee Salary: 7500
Employee Manager Number: 1000
----------------------------------------------

FAQ

Tabela Varray ma stały rozmiar górny i jest zawsze gęsta. Tabela zagnieżdżona nie ma limitu rozmiaru, może być rzadka i rozszerzalna, co czyni ją bardziej elastyczną w przypadku rosnących lub nieregularnych danych.

Ponieważ jest to tablica asocjacyjna w pamięci, a nie tabela składowana. Indeks dolny działa jak klucz wyszukiwania, więc można użyć ciągu znaków lub ujemnej liczby całkowitej, co jest przydatne w przypadku wyszukiwania z kluczem w ramach sesji.

Niezainicjowany obiekt Varray lub tabela zagnieżdżona ma wartość atomową null, więc odwołanie się do elementu powoduje błąd. Wywołanie konstruktora powoduje jego alokację, po czym EXTEND i przypisania mogą dodać dane.

Tak. Biorąc pod uwagę, czy rozmiar jest stały, czy dane są przechowywane i czy potrzebny jest klucz tekstowy, AI może wskazać na tabelę Varray, tabelę zagnieżdżoną lub tabelę indeksowaną i wyjaśnić kompromis.

BULK COLLECT ładuje wszystkie wiersze do kolekcji podczas pojedynczego przełączenia kontekstu między silnikami SQL i PL/SQL, zamiast przełączania jednego wiersza, co znacznie zmniejsza obciążenie dużych zestawów wyników.

Podsumuj ten post następująco: