W tym poście przedstawię jak pobrać zawartość tabeli bazodanowej do kolekcji PL/SQL.
Pokażemy kilka z dostępnych możliwości wraz z kodem opartym o użytkownika HR.
Zaczniemy od zwięzłego przeglądu kolekcji, jakie mamy dostępne w Oracle:
Indeksowane przez BINARY_INTEGER – dostępne są wszystkie elementy w kolekcji z zakresu typu binary_integer. W momencie przypisywania do danego elementu kolekcji alokowana jest dla niego pamięć. Nie musi to być typ BINARY_INTEGER – jaki inny typ może zostać użyty opiszę w jednym z kolejnych postów.
TYPE nazwa IS TABLE OF typ INDEX BY binary_integer;
Zagnieżdżone: przed przypisaniem wartości do elementu kolekcji musi zostać zainicjalizowany – w innym wypadku będzie błąd. Elementy indeksowane są kolejnymi liczbami od 1.
TYPE nazwa IS TABLE OF typ;
VARRAY – o określonej maksymalnej długości. Podobnie jak zagnieżdżone wymagają
zainicjalizowania elementu przed jego przypisaniem. Elementy indeksowane są kolejnymi liczbami od 1 do rozmiaru maksymalnego.
TYPE nazwa IS VARRAY(n) OF typ;
Zatem do dzieła!
Do załadowania zawartości tabeli użyjemy kolekcji indeksowanych przez BINARY_INTEGER oraz kolekcji zagnieżdżonych.
1. Ładowanie przy użyciu kursorów
DECLARE TYPE t_typ IS TABLE OF employees%ROWTYPE INDEX BY BINARY_INTEGER; kolekcja t_typ; i NUMBER:=0; BEGIN FOR rekord IN (SELECT * FROM employees) LOOP i:=i+1; kolekcja(i):=rekord; END LOOP; END;
DECLARE TYPE t_typ IS TABLE OF employees%ROWTYPE; kolekcja t_typ:=t_typ(); i NUMBER:=0; BEGIN FOR rekord IN (SELECT * FROM employees) LOOP i:=i+1; kolekcja.EXTEND; kolekcja(i):=rekord; END LOOP; END;
Jak widać w powyższym przykładzie – konieczna jest inicjalizacja oraz “poszerzanie” kolekcji przy użyciu extend.
2. Ładowanie przez przetwarzanie masowe – BULK COLLECT
DECLARE TYPE t_tablica IS TABLE OF employees%ROWTYPE; tablica t_tablica; BEGIN SELECT * BULK COLLECT INTO tablica FROM employees; END;
Jak widać nie ma konieczności inicjalizowania kolekcji
DECLARE TYPE t_tablica IS TABLE OF employees%ROWTYPE INDEX BY BINARY_INTEGER; tablica t_tablica; BEGIN SELECT * BULK COLLECT INTO tablica FROM employees; END;
Więcej o kolekcjach i przetwarzaniu masowym w kolejnych postach.