PL/SQL w Oracle ? porównanie typów kolekcyjnych VARRAY i NESTED TABLE

Typy kolekcyjne to implikacja wynikająca z obiektowego rozszerzenie języka SQL w Oracle. Służy ono do zawierania wielu wartości wewnątrz jednego wiersza tabeli – innymi słowy – do tworzenia kolumny, której pole jest tabelą.

W Oracle mamy do wybory 2 rodzaje typów kolekcyjnych. Są nimi:

  • nested table (tablica zagnieżdżona)
  • varray (tablica o zmiennej długości)

Typy kolekcyjne mają tylko jeden wymiar. Oznacza to, iż mogą się składać tylko z jednego pola. Jednakże, owe pole może być typem obiektu i dzięki temu można symulować istnienie większej ilości pól poprzez tworzenie kolejnych atrybutów danego typu obiektu.

Do typów kolekcyjnych możemy odwoływć się zarówno z poziomy języka SQL oraz z poziomu języka PL/SQL. W tym drugim przypadku uzyskujemy możliwość odwoływania się do poszczególnych pozycji w kolekcji za pomocą numerów indeksowych. Owe numery – co zostanie opisane niżej – są stałe dla VARRAY i tymczasowe dla NESTED TABLE.

Różnica między obydwoma typami jest dość znacząca. Z nested table działamy jak ze zwykłą tabelą. Możemy do niej łatwo dodawać, usuwać oraz zmieniać wiersze zarówno z poziomu PL/SQL oraz z poziomy bazy danych (czyli zapytań SQL). Tak jak zwykła tabela, nested table nie utrzymuje konkretnej kolejności wierszy, co jest również bardzo ważną jej cechą, jednakże gdy pracujemy z nested table w PL/SQL to mamy dostęp do wierszy za pomocą numerów indeksu, które są tymczasowe i nadane w momencie sprowadzenia nested table do zmiennej. Nested table jest utrzymywana w bazie danych w osobnej tabeli, do której nie mamy bezpośredniego dostępu. Kolejną cechą nested table jest to, iż nie ma ona ograniczeń co do ilości wierszy.

Varray jest zupełnie inna. Jest o wiele prostsza – jesteśmy bardzo ograniczeni w możliwościach pracy z nią. Z poziomu SQL możemy jedynie wyświtlić całą zawartość varray lub nadać jej nową wartość podając wszystkie pozycje – innymi słowy – jeżeli z poziomu SQL chcemy dodać do varray nowy element musimy mu przypisać jeszcze raz wszystkie wcześniejsze elementy wzbogacone o ten nowy. Z poziomu PL/SQL możemy więcej – możemy dodatkowo dopisywać wiersze do varray oraz możemy zmieniać elementy (używając indeksów pozycji, które są stale utrzymywane, gdyż kolejność w varray jest zachowana). To czego nie możemy robić nawet w PL/SQL to usuwanie elementów oraz dodawania elementów gdzieś w środku. Gdy chcemy to zrobić to musimy nadać nową wartość całej varray. Varray jest zapisywana wewnątrz tabeli, w której jest powoływana do życia, a nie w osobnej tabeli – jak nested table. Dodatkowo, tworząc varray nadajemy jej limit ilości jej elementów.

Czytając dokumentację dotyczącą powyższych typów kolekcyjnych możemy się spotkać z określeniem, że nested table jest tylko początkowo sparse (rzadka), a varray nigdy nie jest sparse (rzadka). Cecha to opisuje, czy z danego typu kolekcyjnego możemy usuwać elementy ze środka tworząc w nim dziury. Tak jak wyżej zostało opisane – w nested table tak, a w varray nie.

Zapraszam do innych artykukułów Oracle, aby dowiedzieć się jak pracować z powyższymi typami kolekcyjnymi.