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

Spisie treści:

Anonim

Co to jest kolekcja?

Kolekcja to uporządkowana grupa elementów określonych typów danych. Może to być zbiór danych o prostym lub złożonym typie danych (np. Typy zdefiniowane przez użytkownika lub typy rekordów).

W kolekcji każdy element jest oznaczony terminem zwanym „indeksem dolnym”. Każdej pozycji w kolekcji przypisany jest unikalny indeks dolny. Danymi w tej kolekcji można manipulować lub pobierać, odwołując się do tego unikalnego indeksu.

Kolekcje są najbardziej przydatne, gdy trzeba przetwarzać lub manipulować dużymi danymi tego samego typu. Kolekcje mogą być wypełniane i manipulowane jako całość za pomocą opcji „BULK” w Oracle.

W tym samouczku nauczysz się:

  • Co to jest kolekcja?
  • Varrays
  • Tabele zagnieżdżone
  • Indeks według tabeli
  • Konstruktor i koncepcja inicjalizacji w kolekcjach
  • Metody zbierania

Kolekcje są klasyfikowane na podstawie struktury, indeksu dolnego i pamięci, jak pokazano poniżej.

  • Indeks według tabel (znany również jako tablica asocjacyjna)
  • Tabele zagnieżdżone
  • Varrays

W dowolnym momencie do danych w kolekcji można odwoływać się za pomocą trzech terminów Nazwa zbioru, Indeks dolny, Nazwa pola / kolumny jako „ (). ”. O tych wyżej wymienionych kategoriach kolekcji dowiesz się dalej w poniższej sekcji.

Varrays

Varray to metoda gromadzenia danych, w której rozmiar tablicy jest ustalony. Rozmiar tablicy nie może zostać przekroczony niż jej stała wartość. Indeks dolny Varray ma wartość liczbową. Oto atrybuty Varrayes.

  • Rozmiar górnego limitu jest ustalony
  • Wypełniane sekwencyjnie, zaczynając od indeksu dolnego „1”
  • Ten typ kolekcji jest zawsze gęsty, tzn. Nie możemy usunąć żadnych elementów tablicy. Varray można usunąć w całości lub przyciąć od końca.
  • Ponieważ zawsze jest gęsty, ma znacznie mniejszą elastyczność.
  • Bardziej odpowiednie jest użycie, gdy znany jest rozmiar tablicy, i wykonywanie podobnych czynności na wszystkich elementach tablicy.
  • Indeks dolny i sekwencja zawsze pozostają stabilne, tj. Indeks dolny i liczba kolekcji są zawsze takie same.
  • Przed użyciem w programach należy je zainicjować. Każda operacja (z wyjątkiem operacji EXISTS) na niezainicjowanej kolekcji spowoduje zgłoszenie błędu.
  • Może zostać utworzony jako obiekt bazy danych, który jest widoczny w całej bazie danych lub wewnątrz podprogramu, który może być użyty tylko w tym podprogramie.

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

Indeks 1 2 3 4 5 6 7
Wartość Xyz Dfv Sde Cxs Vbc Nhu Qwe

Składnia VARRAY:

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

Tabele zagnieżdżone

Tabela zagnieżdżona to kolekcja, w której rozmiar tablicy nie jest ustalony. Ma numeryczny typ indeksu dolnego. Poniżej znajduje się więcej opisów dotyczących typu tabeli zagnieżdżonej.

  • Tabela zagnieżdżona nie ma górnego limitu rozmiaru.
  • Ponieważ górny limit rozmiaru nie jest ustalony, kolekcja, pamięć musi być każdorazowo powiększana przed jej użyciem. Zbiór możemy rozszerzyć za pomocą słowa kluczowego „EXTEND”.
  • Wypełniane sekwencyjnie, zaczynając od indeksu dolnego „1”.
  • Ten typ kolekcji może być zarówno gęsty, jak i rzadki , tj. Możemy utworzyć kolekcję jako gęstą, a także możemy losowo usunąć pojedynczy element tablicy, co czyni go rzadkim.
  • Daje większą elastyczność w usuwaniu elementu tablicy.
  • Jest przechowywany w tabeli bazy danych wygenerowanej przez system i może być użyty w zapytaniu wybierającym do pobrania wartości.
  • Indeks dolny i sekwencja nie są stabilne, tj. Indeks dolny i liczba elementów tablicy mogą się różnić.
  • Przed użyciem w programach należy je zainicjować. Każda operacja (z wyjątkiem operacji EXISTS) na niezainicjowanej kolekcji spowoduje zgłoszenie błędu.
  • Może zostać utworzony jako obiekt bazy danych, który jest widoczny w całej bazie danych lub wewnątrz podprogramu, który może być użyty tylko w tym podprogramie.

Poniższy rysunek ilustruje schematycznie alokację pamięci zagnieżdżonej tabeli (gęstej i rzadkiej). Obszar elementów w kolorze czarnym oznacza pusty element w kolekcji, tj. Rzadki.

Indeks 1 2 3 4 5 6 7
Wartość (gęsta) Xyz Dfv Sde Cxs Vbc Nhu Qwe
Wartość (rzadka) Qwe Asd Afg Asd Wer

Składnia zagnieżdżonej tabeli:

TYPE  IS TABLE OF ;
  • W powyższej składni nazwa_typu jest zadeklarowana jako zbiór tabel zagnieżdżonych typu „DATA_TYPE”. Typ danych może być prosty lub złożony.

Indeks według tabeli

Indeks według tabeli to kolekcja, w której rozmiar tablicy nie jest ustalony. W przeciwieństwie do innych typów kolekcji, w kolekcji indeksów według tabeli indeks dolny może składać się z definicji użytkownika. Poniżej znajdują się atrybuty indeksu według tabeli.

  • Indeks dolny może składać się z liczby całkowitej lub łańcuchów. W momencie tworzenia kolekcji należy podać typ indeksu dolnego.
  • Te kolekcje nie są przechowywane sekwencyjnie.
  • Z natury są zawsze rzadkie.
  • Rozmiar tablicy nie jest ustalony.
  • Nie można ich przechowywać w kolumnie bazy danych. Powinny być tworzone i używane w dowolnym programie w tej konkretnej sesji.
  • Dają większą elastyczność w zakresie utrzymywania indeksu.
  • Indeksy dolne mogą mieć również ujemną sekwencję indeksów dolnych.
  • Są one bardziej odpowiednie do użycia dla stosunkowo mniejszych wartości zbiorczych, w których zbiór może być zainicjowany i używany w tych samych podprogramach.
  • Nie trzeba ich inicjalizować przed rozpoczęciem korzystania z nich.
  • Nie można go utworzyć jako obiektu bazy danych. Można go utworzyć tylko w podprogramie, którego można używać tylko w tym podprogramie.
  • BULK COLLECT nie może być używany w tym typie kolekcji, ponieważ indeks dolny powinien być jawnie podawany dla każdego rekordu w kolekcji.

Poniższy rysunek ilustruje schematycznie alokację pamięci zagnieżdżonej tabeli (rzadkiej). Obszar elementów w kolorze czarnym oznacza pusty element w kolekcji, tj. Rzadki.

Indeks dolny (varchar) PIERWSZY DRUGA TRZECI CZWARTY PIĄTY SZÓSTY SIÓDMY
Wartość (rzadka) Qwe Asd Afg Asd Wer

Składnia indeksu według tabeli

TYPE  IS TABLE OF  INDEX BY VARCHAR2 (10);
  • W powyższej składni nazwa_typu jest zadeklarowana jako zbiór indeksów według tabeli typu „DATA_TYPE”. Typ danych może być prosty lub złożony. Zmienna subsciprt / index jest podawana jako typ VARCHAR2 z maksymalnym rozmiarem 10.

Konstruktor i koncepcja inicjalizacji w kolekcjach

Konstruktory to wbudowana funkcja udostępniana przez wyrocznię, która ma taką samą nazwę jak obiekt lub kolekcje. Są one wykonywane jako pierwsze za każdym razem, gdy obiekt lub kolekcje są przywoływane po raz pierwszy w sesji. Poniżej znajdują się ważne szczegóły dotyczące konstruktora w kontekście kolekcji:

  • W przypadku kolekcji te konstruktory powinny być wywoływane jawnie, aby je zainicjować.
  • Zarówno tabele Varray, jak i tabele zagnieżdżone muszą zostać zainicjowane za pomocą tych konstruktorów przed odniesieniem do programu.
  • Konstruktor niejawnie rozszerza alokację pamięci dla kolekcji (z wyjątkiem Varray), dlatego konstruktor może również przypisywać zmienne do kolekcji.
  • Przypisywanie wartości do kolekcji za pomocą konstruktorów nigdy nie spowoduje, że kolekcja będzie rzadka.

Metody zbierania

Oracle zapewnia wiele funkcji do manipulowania i pracy z kolekcjami. Funkcje te są bardzo przydatne w programie do określania i modyfikowania różnych atrybutów kolekcji. Poniższa tabela przedstawia różne funkcje i ich opis.

metoda Opis SKŁADNIA
ISTNIEJE (n) Ta metoda zwróci wyniki logiczne. Zwróci „TRUE”, jeśli n- ty element istnieje w tej kolekcji, w przeciwnym razie zwróci FALSE. W niezainicjowanej kolekcji można używać tylko funkcji ISTNIEJE .EXISTS (pozycja_elementu)
LICZYĆ Podaje całkowitą liczbę elementów obecnych w kolekcji .COUNT
LIMIT Zwraca maksymalny rozmiar kolekcji. W przypadku Varray zwróci stały rozmiar, który został zdefiniowany. W przypadku tabeli zagnieżdżonej i indeksu według tabeli daje NULL .LIMIT
PIERWSZY Zwraca wartość pierwszej zmiennej indeksującej (indeks dolny) kolekcji .FIRST
OSTATNI, UBIEGŁY, ZESZŁY Zwraca wartość ostatniej zmiennej indeksującej (indeks dolny) kolekcji .LAST
PRIOR (n) Zwracane wartości poprzedzają zmienną indeksu w kolekcji n- tego elementu. Jeśli nie ma poprzedzającego indeksu, zwracana jest wartość NULL .PRIOR (n)
NASTĘPNY (n) Zwraca sukces zmienna indeksowa w kolekcji n- tego elementu. Jeśli nic się nie powiedzie, zwracana jest wartość indeksu NULL .NEXT (n)
POSZERZAĆ Rozszerza na końcu jeden element w kolekcji .EXTEND
PRZEDŁUŻ (n) Rozszerza n elementów na końcu kolekcji .EXTEND (n)
PRZEDŁUŻ (n, i) Rozszerza n kopii i- tego elementu na końcu kolekcji .EXTEND (n, i)
TRYM Usuwa jeden element z końca kolekcji .TRIM
TRIM (n) Usuwa n elementów z końca kolekcji .TRIM (n)
KASOWAĆ Usuwa wszystkie elementy z kolekcji. Powoduje, że kolekcja jest pusta .DELETE
USUŃ (n) Usuwa n-ty element z kolekcji. Jeśli n- ty element ma wartość NULL, to nic nie da .DELETE (n)
USUŃ (m, n) Usuwa element z zakresu od m- tego do n- tego w kolekcji .DELETE (m, n)

Przykład 1: Typ rekordu na poziomie podprogramu

W tym przykładzie zobaczymy, jak zapełnić kolekcję przy użyciu funkcji „BULK COLLECT” i jak odwołać się do danych kolekcji.

DECLARETYPE 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();BEGININSERT 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_recFROM emp;dbms_output.put_line (‘Employee Detail');FOR i IN guru99_emp_rec.FIRST… guru99_emp_rec.LASTLOOPdbms_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;/

Objaśnienie kodu:

  • Linia kodu 2-8 : typ rekordu „emp_det” jest zadeklarowany w kolumnach emp_no, emp_name, wynagrodzenie i menedżer typu danych NUMBER, VARCHAR2, NUMBER, NUMBER.
  • Linia kodu 9: Tworzenie kolekcji „emp_det_tbl” elementu typu rekordu „emp_det”
  • Linia kodu 10: Zadeklarowanie zmiennej „guru99_emp_rec” jako typu „emp_det_tbl” i zainicjowanie jej konstruktorem o wartości null.
  • Linia kodu 12-15: Wstawianie przykładowych danych do tabeli „emp”.
  • Linia kodu 16: Zatwierdzenie transakcji insertowej.
  • Linia kodu 17: Pobieranie rekordów z tabeli „emp” i zapełnianie zmiennej kolekcji zbiorczo za pomocą polecenia „BULK COLLECT”. Teraz zmienna „guru99_emp_rec” zawiera wszystkie rekordy obecne w tabeli „emp”.
  • Wiersz kodu 19-26: Ustawienie pętli „FOR” za pomocą, aby wydrukować wszystkie rekordy w kolekcji jeden po drugim. Metoda zbierania FIRST i LAST jest używana jako dolna i górna granica pętli.

Wyjście : Jak widać na powyższym zrzucie ekranu, po wykonaniu powyższego kodu otrzymasz następujące dane wyjściowe

Employee DetailEmployee Number: 1000Employee Name: AAAEmployee Salary: 25000Employee Manager Number: 1000----------------------------------------------Employee Number: 1001Employee Name: XXXEmployee Salary: 10000Employee Manager Number: 1000----------------------------------------------Employee Number: 1002Employee Name: YYYEmployee Salary: 15000Employee Manager Number: 1000----------------------------------------------Employee Number: 1003Employee Name: ZZZEmployee Salary: 7500Employee Manager Number: 1000----------------------------------------------