Plan wykładu Kolekcje Tablice asocjacyjne VARRAY Tablice zagnieżdżone BAZY DANYCH II WYKŁAD 5 dr inż. Agnieszka Bołtuć Kolekcje Tablice asocjacyjne Używane w celu gromadzenia danych tego samego typu, Rekordy zarządzają pojedynczymi wierszami, zaś kolekcje wieloma wierszami, Rodzaje kolekcji: Tablice asocjacyjne (tabele indeksowane), Tablice VARRAY, Tabele zagnieżdżone. Są to jednowymiarowe struktury typów danych Oracle lub typów rekordowych, Cechy: Nie wymagają inicjowania oraz konstruktora, Indeksuje się je liczbami, a od wersji 10g także łańcuchami znaków o zmiennej długości, Jako wartości indeksów można używać dowolnych liczb całkowitych ujemnych i dodatnich + zero, Rozmiar tablicy jest dynamiczny. 1
Tablice asocjacyjne Definiowanie tablic asocjacyjnych Tablica składa się z dwóch kolumn: klucza oraz wartości (skalarne lub rekordy) Klucz Wartości 1 Kowalski 2 Jankowski 3 Paczkowski TYPE nazwa_typu IS TABLE OF {typ_elementu zmienna%type tabela.kolumna%type} [NOT NULL] tabela%rowtype INDEX BY [PLS_INTEGER BINARY_INTEGER VARCHAR2(rozmiar)]; PLS_INTEGER, BINARY_INTEGER, VARCHAR2 Wartość skalarna lub rekord identyfikator nazwa_typu; Definiowanie tablic - przykład Definiowanie tablic - przykład TYPE t_nazwiska IS TABLE OF employees.last_name%type INDEX BY PLS_INTEGER; t_nazw t_nazwiska; t_nazw(1):= Smith ; TYPE t_daty IS TABLE OF DATE INDEX BY PLS_INTEGER; t_d t_daty; t_d(3):=sysdate; 2
Metody tablic asocjacyjnych COUNT, DELETE Funkcje i procedury używane podczas korzystania z tablic asocjacyjnych, Sposób użycia: nazwa_tabeli.nazwa_metody[(parametry)] Należą do nich: COUNT, DELETE(n), DELETE(n,m) EXISTS(n), FIRST, LAST, NEXT(n), PRIOR(n), TRIM, TRIM(n) COUNT zwraca liczbę elementów aktualnie zapisanych w tablicy asocjacyjnej, zwracany typ to PLS_INTEGER, DELETE jest to procedura, służy do usuwania elementów z kolekcji w zależności od wersji są to: DELETE wszystkie elementy, DELETE(n) element o indeksie n, DELETE(n,m) elementy pomiędzy indeksami, EXISTS, LAST, FIRST, NEXT PRIOR, TRIM EXISTS(n) określa czy element o indeksie n znajduje się w kolekcji, zwraca wartość TRUE lub FALSE, FIRST zwraca najniższy indeks kolekcji, LAST - zwraca najwyższy indeks kolekcji, NEXT(n) zwraca indeks kolejny po n-tym, jeśli brak wyższego indeksu zwraca NULL, PRIOR(n) - zwraca indeks poprzedni w stosunku do n-tego, jeśli brak takiego indeksu zwraca NULL, TRIM usuwa z kolekcji element o najwyższym indeksie, jest to procedura, TRIM(n) usuwa n elementów z kolekcji, n musi być mniejsze niż zwracane przez funkcję COUNT, 3
Tablice asocjacyjne z rekordami Tablice asocjacyjne z rekordami TYPE t_pracownicy IS TABLE OF employees%rowtype INDEX BY PLS_INTEGER; t_prac t_pracownicy; SELECT * INTO t_prac(1) FROM employees WHERE employees_id=105; DBMS_OUTPUT.PUT_LINE(t_prac(1).last_name t_prac(1).salary t_prac(1).hire_date); FOR i IN 1..100 LOOP SELECT * INTO t_prac(i) FROM employees WHERE employees_id=i; FOR i IN t_prac.first.. t_prac.last LOOP DBMS_OUTPUT.PUT_LINE(t_prac(i).last_name t_prac(i).salary t_prac(i).hire_date); Przykłady użycia innych metod Tabele VARRAY DBMS_OUTPUT.PUT_LINE( liczba pracowników t_prac.count); IF t_prac.count <>0 THEN DBMS_OUTPUT.PUT_LINE(t_prac(1)); END IF; IF t_prac.exists(1) THEN DBMS_OUTPUT.PUT_LINE(t_prac(1)); END IF; Podobne do tablic asocjacyjnych jednak o stałym rozmiarze, Jednowymiarowe struktury typów danych Oracle, rekordowych lub zdefiniowanych przez użytkownika, Pojawiły się w Oracle 8, Można używać jako struktur programów PL/SQL oraz jako typów obiektowych oraz typów danych kolumn w tabelach, 4
Tabele VARRAY - definicja Tabele VARRAY - przykład TYPE nazwa_typu IS {VARRAY VARYING ARRAY} (rozmiar) OF typ_elementu [NOT NULL]; identyfikator nazwa_typu; - część deklaracyjna identyfikator:=nazwa_typu(); - część wykonawcza lub identyfikator nazwa_typu:=nazwa_typu(); - część deklaracyjna TYPE t_liczby IS VARRAY(3) OF INTEGER; t_l t_liczby:= t_liczby (NULL,NULL,NULL); t_l(1):=10; inicjowanie tabeli w części deklaracyjnej za pomocą wartości NULL t_l(2):=11; t_l(3):=12; DBMS_OUTPUT.PUT_LINE(t_l(i)); Tabele VARRAY - przykład Tabele VARRAY - przykład TYPE t_liczby IS VARRAY(3) OF INTEGER; t_l t_liczby; t_l:= t_liczby (NULL,NULL,NULL); t_l(1):=10; inicjowanie tabeli w części wykonawczej t_l(2):=11; za pomocą wartości NULL t_l(3):=12; DBMS_OUTPUT.PUT_LINE(t_l(i)); TYPE t_liczby IS VARRAY(3) OF INTEGER; t_l t_liczby:= t_liczby (); t_l.ext t_l(i):=9+i; DBMS_OUTPUT.PUT_LINE(t_l(i)); inicjowanie tabeli w części deklaracyjnej bez użycia żadnego wiersza 5
Metoda EXTEND EXTEND przydziela pamięć dla nowych elementów kolekcji przed dodaniem ich wartości, jest to procedura stosowana z tablicami VARRAY oraz tabelami zagnieżdżonymi, EXTEND(n) przydziela pamięć dla n nowych elementów kolekcji, stosuje się jak wyżej, EXTEND(n,i) przydziela pamięć dla n nowych elementów kolekcji, i to indeks elementu, który zostanie powielony na nowych pozycjach. Tabele VARRAY jako typ obiektowy w PL/SQL CREATE OR REPLACE TYPE nazwa_typu AS {VARRAY VARYING ARRAY} (rozmiar) OF typ_elementu [NOT NULL]; Zaletą jest możliwość korzystania z nich w dowolnym programie, podczas gdy dostęp do struktur typu tablicowego w PL/SQL jest ograniczony do jednostek danego programu (bloków anonimowych, procedury, pakietu). Przykład CREATE OR REPLACE TYPE t_liczby AS VARRAY(3) OF INTEGER; / t_l t_liczby:= t_liczby (NULL,NULL,NULL); t_l(1):=10; t_l(2):=11; t_l(3):=12; DBMS_OUTPUT.PUT_LINE(t_l(i)); Definiowanie tablic CREATE OR REPLACE TYPE t_liczby AS VARRAY(3) OF INTEGER; / CREATE TABLE pracownicy (id INTEGER PRIMARY KEY, nazwisko INTEGER NOT NULL,. zarobki t_liczby NOT NULL); 6
Wstawianie do tablic INSERT INTO pracownicy VALUES (10, Kowalski,,t_liczby(1000,200,300)); Pobieranie danych SELECT zarobki FROM pracownicy; WYNIK: t_liczby(1000,200,300) rozwiązanie problemu za pomocą tabel zagnieżdżonych CREATE OR REPLACE TYPE varray_nested_table IS TABLE INTEGER; / SELECT column_value FROM THE (SELECT CAST (zarobki AS varray_nested_table) FROM pracownicy WHERE id=10); WYNIK: COLUMN_VALUE ------------------------- 1000 200 300 - metoda column_value pozwala na dostęp do wierszy tabeli zagnieżdżonej - THE z SQL umożliwia pobranie column_value w zapytaniu kierowanym do tabeli zagnieżdżonej - CAST przekształca tablicę VARRAY w tabelę zagnieżdżoną Modyfikacja tablic Modyfikacja całej zawartości UPDATE pracownicy SET zarobki= t_liczby(2000,200,300) WHERE id=10; Modyfikacja części zawartości (niemożliwe do wykonania za pomocą samego SQL) TYPE pracownicy_typ IS RECORD (id INTEGER, nazwisko INTEGER,. zarobki t_liczby); prac pracownicy_typ; CURSOR pobierz_zarobki (par_id INTEGER) IS SELECT * FROM pracownicy WHERE id=par_id; 7
Tabele zagnieżdżone OPEN pobierz_zarobki(10); FETCH pobierz_zarobki INTO prac; CLOSE pobierz_zarobki; prac.zarobki(1):=2000; UPDATE pracownicy SET zarobki=prac.zarobki WHERE id=10; Jednowymiarowe struktury typów danych Oracle, rekordów lub typów obiektowych zdefiniowanych przez użytkownika, Można ich używać w definicjach tabel, rekordów i obiektów, zaś dostęp do nich uzyskujemy w kodzie SQL i PL/SQL, Można definiować w jednostkach programów PL/SQL, jako typy obiektów oraz typy danych kolumn w tabelach, Rozmiar dynamiczny. Tabele zagnieżdżone - składnia CREATE OR REPLACE TYPE nazwa_typu AS TABLE OF typ_elementu [NOT NULL]; Tabele zagnieżdżone w PL/SQL TYPE t_wyrazy IS TABLE OF VARCHAR(5); t_w t_wyrazy:= t_wyrazy (NULL,NULL,NULL); t_w(1):= aaaa ; t_w(2):= nnnn ; ewentualnie bez inicjowania NULLem z użyciem EXTEND t_w(3):= cccc ; DBMS_OUTPUT.PUT_LINE(t_w(i)); 8
Tabele zagnieżdżone - obiekty CREATE OR REPLACE TYPE t_wyrazy AS TABLE OF VARCHAR(5); / t_w t_wyrazy:= t_wyrazy (NULL,NULL,NULL); t_w(1):=10; t_w(2):=11; t_w(3):=12; DBMS_OUTPUT.PUT_LINE(t_w(i)); Tabele zagnieżdżone typ kolumny CREATE OR REPLACE TYPE t_wyrazy AS TABLE OF VARCHAR2(5); / CREATE TABLE pracownicy (id INTEGER PRIMARY KEY, nazwisko VARCHAR2(20) NOT NULL,. tytuly t_wyrazy NOT NULL) NESTED TABLE tytuly STORE AS nested_tytuly; Tabele zagnieżdżone typ kolumny Wstawianie do tablic INSERT INTO pracownicy VALUES (10, Kowalski,,t_wyrazy( mgr, dr, prof ); Pobieranie danych SELECT tytuly FROM pracownicy; WYNIK: t_wyrazy( mgr, dr, prof ) Tabele zagnieżdżone typ kolumny SELECT column_value FROM THE (SELECT tytuly FROM pracownicy WHERE id=10); WYNIK: COLUMN_VALUE ------------------------- mgr dr prof 9
Tabele zagnieżdżone typ kolumny Modyfikacja, aktualizacja tablic Aktualizacja całej zawartości tabeli zagnieżdżonej UPDATE pracownicy SET tytuly = t_wyrazy( mgr inż., dr, prof ) WHERE id=10; Tabele zagnieżdżone typ kolumny Aktualizacja części zawartości tabeli zagnieżdżonej UPDATE THE (SELECT tytuly FROM pracownicy WHERE id=10) SET column_value= prof. nzw. WHERE column_value= prof ; WYKORZYSTANA LITERATURA J. Price, Oracle Database 11g i SQL. Programowanie. Helion, 2009. S. Urman, R. Hardman, M. McLaughlin, Oracle Database 10g. Programowanie w języku PL/SQL. Helion, 2008. www.oracle.com 10