BAZY DANYCH II WYKŁAD 5 Plan wykładu Kolekcje Tablice
Transkrypt
BAZY DANYCH II WYKŁAD 5 Plan wykładu Kolekcje Tablice
2010-11-24
Plan wykładu
Kolekcje
Tablice asocjacyjne
VARRAY
Tablice zagnieżdżone
BAZY DANYCH II
WYKŁAD 5
dr inż. Agnieszka Bołtuć
Kolekcje
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.
Tablice asocjacyjne
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
2010-11-24
Tablice asocjacyjne
Tablica składa się z dwóch kolumn: klucza
oraz wartości (skalarne lub rekordy)
Klucz
Wartości
1
Kowalski
2
Jankowski
3
Paczkowski
Wartość skalarna lub rekord
Definiowanie tablic asocjacyjnych
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)];
identyfikator nazwa_typu;
PLS_INTEGER, BINARY_INTEGER, VARCHAR2
Definiowanie tablic - przykład
Definiowanie tablic - przykład
DECLARE
TYPE t_nazwiska IS TABLE OF
employees.last_name%TYPE
INDEX BY PLS_INTEGER;
t_nazw t_nazwiska;
BEGIN
t_nazw(1):=’Smith’;
…
END;
DECLARE
TYPE t_daty IS TABLE OF DATE
INDEX BY PLS_INTEGER;
t_d t_daty;
BEGIN
t_d(3):=SYSDATE;
…
END;
2
2010-11-24
Metody tablic asocjacyjnych
Funkcje i procedury używane podczas korzystania
z tablic asocjacyjnych,
Sposób użycia:
nazwa_tabeli.nazwa_metody[(parametry)]
Należą do nich:
COUNT, DELETE
COUNT,
DELETE(n), DELETE(n,m)
EXISTS(n),
FIRST, LAST, NEXT(n),
PRIOR(n),
TRIM, TRIM(n)
EXISTS, LAST, FIRST, NEXT
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,
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,
PRIOR, TRIM
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
2010-11-24
Tablice asocjacyjne z rekordami
Tablice asocjacyjne z rekordami
DECLARE
TYPE t_pracownicy IS TABLE OF
employees%ROWTYPE
INDEX BY PLS_INTEGER;
t_prac t_pracownicy;
BEGIN
…
BEGIN
FOR i IN 1..100 LOOP
SELECT * INTO t_prac(i) FROM employees
WHERE employees_id=i;
END LOOP;
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);
END;
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);
END LOOP;
END;
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
2010-11-24
Tabele VARRAY - definicja
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
Tabele VARRAY - przykład
DECLARE
TYPE t_liczby IS VARRAY(3) OF INTEGER;
t_l t_liczby:= t_liczby (NULL,NULL,NULL);
BEGIN
inicjowanie tabeli w części deklaracyjnej
t_l(1):=10;
za pomocą wartości NULL
t_l(2):=11;
t_l(3):=12;
FOR i IN 1..3 LOOP
DBMS_OUTPUT.PUT_LINE(t_l(i));
END LOOP;
END;
Tabele VARRAY - przykład
Tabele VARRAY - przykład
DECLARE
TYPE t_liczby IS VARRAY(3) OF INTEGER;
t_l t_liczby;
BEGIN
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;
FOR i IN 1..3 LOOP
DBMS_OUTPUT.PUT_LINE(t_l(i));
END LOOP;
END;
DECLARE
TYPE t_liczby IS VARRAY(3) OF INTEGER;
t_l t_liczby:= t_liczby ();
BEGIN
FOR i IN 1..3 LOOP
t_l.EXTEND;
t_l(i):=9+i;
END LOOP;
inicjowanie tabeli w części deklaracyjnej
bez użycia żadnego wiersza
FOR i IN 1..3 LOOP
DBMS_OUTPUT.PUT_LINE(t_l(i));
END LOOP;
END;
5
2010-11-24
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.
Przykład
CREATE OR REPLACE TYPE t_liczby AS VARRAY(3) OF
INTEGER;
/
DECLARE
t_l t_liczby:= t_liczby (NULL,NULL,NULL);
BEGIN
t_l(1):=10;
t_l(2):=11;
t_l(3):=12;
FOR i IN 1..3 LOOP
DBMS_OUTPUT.PUT_LINE(t_l(i));
END LOOP;
END;
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).
Tabele VARRAY jako typ kolumny
w tabeli
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
2010-11-24
Tabele VARRAY jako typ kolumny
w tabeli
Tabele VARRAY jako typ kolumny
w tabeli
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
Tabele VARRAY jako typ kolumny
w tabeli
Modyfikacja tablic
Modyfikacja całej zawartości
UPDATE pracownicy
SET zarobki=
t_liczby(2000,200,300)
WHERE id=10;
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ą
Tabele VARRAY jako typ kolumny
w tabeli
Modyfikacja części zawartości (niemożliwe do wykonania za pomocą
samego SQL)
DECLARE
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;
BEGIN
7
2010-11-24
Tabele VARRAY jako typ kolumny
w tabeli
BEGIN
OPEN pobierz_zarobki(10);
FETCH pobierz_zarobki INTO prac;
CLOSE pobierz_zarobki;
Tabele zagnieżdżone
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.
END;
Tabele zagnieżdżone - składnia
Tabele zagnieżdżone w PL/SQL
CREATE OR REPLACE TYPE nazwa_typu
AS TABLE OF typ_elementu [NOT NULL];
DECLARE
TYPE t_wyrazy IS TABLE OF VARCHAR(5);
t_w t_wyrazy:= t_wyrazy (NULL,NULL,NULL);
BEGIN
t_w(1):=’aaaa’;
ewentualnie bez inicjowania NULLem
t_w(2):=’nnnn’;
z użyciem EXTEND
t_w(3):=’cccc’;
FOR i IN 1..3 LOOP
DBMS_OUTPUT.PUT_LINE(t_w(i));
END LOOP;
END;
8
2010-11-24
Tabele zagnieżdżone - obiekty
Tabele zagnieżdżone – typ
kolumny
CREATE OR REPLACE TYPE t_wyrazy AS TABLE OF
VARCHAR(5);
/
DECLARE
t_w t_wyrazy:= t_wyrazy (NULL,NULL,NULL);
BEGIN
t_w(1):=10;
t_w(2):=11;
t_w(3):=12;
FOR i IN 1..3 LOOP
DBMS_OUTPUT.PUT_LINE(t_w(i));
END LOOP;
END;
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
Tabele zagnieżdżone – typ
kolumny
Wstawianie do tablic
INSERT INTO pracownicy VALUES
(10,’Kowalski’,…,t_wyrazy(’mgr’,’dr’,’prof’);
SELECT column_value FROM
THE (SELECT tytuly FROM pracownicy
WHERE id=10);
Pobieranie danych
SELECT tytuly FROM pracownicy;
WYNIK: t_wyrazy(’mgr’,’dr’,’prof’)
WYNIK:
COLUMN_VALUE
------------------------mgr
dr
prof
9
2010-11-24
Tabele zagnieżdżone – typ
kolumny
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;
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