Politechnika Opolska | Opole University of Technology | www.po.opole.pl
Wydział Elektrotechniki, Automatyki i Informatyki| www.we.po.opole.pl OPOLE 2018 Instytut Informatyki | www.ii.po.opole.pl Tabele obiektowe 2
Po zdefiniowaniu typów obiektowych powstaje możliwość
tworzenia tabel obiektowych, zawierających atrybuty typu obiektowego. Tabela obiektowa jest logicznie i fizycznie podobna do tabeli relacyjnej, której typy kolumn odpowiadają najwyższemu poziomowi atrybutów typu obiektowego przechowywanego w tabeli obiektowej. Różnica polega na tym, że tabela obiektowa opcjonalnie może zawierać dodatkową kolumnę zawierającą identyfikator obiektu (OID). Składania polecenia (w najprostszej postaci)
Polecenie to pozwala na:
określenie wartości domyślnych dla poszczególnych kolumn tabeli; zdefiniowanie ograniczeń dla poszczególnych kolumn tabeli; określenie sposobu identyfikacji obiektów (wierszy tabeli obiektowej); określenie sposobu przechowywania tabel zagnieżdżonych oraz tablic VARRAY. Składania polecenia (w najprostszej postaci) Składania polecenia (w najprostszej postaci) Składania polecenia (w najprostszej postaci) Ograniczenia na atrybutach 8
Analogicznie jak dla kolumn tabel relacyjnych, na atrybuty tabel obiektowych
można nakładać ograniczenia, za wyjątkiem kolumn zawierających referencje obiektowe REF z nieograniczonym zakresem (ang. not scoped). Definicja ograniczenia zawiera słowo kluczowe CONSTRAINT, nazwę oraz definicję ograniczenia. W poniższym przykładzie zdefiniowano klucz główny dla kolumny id_osoba tabeli obiektowej osoba_zewn_objtab :
CREATE TYPE lokalizacja_objtyp AS OBJECT (
nr_budynku NUMBER, miasto VARCHAR2(40) ); CREATE TYPE osoba_objtyp AS OBJECT ( id_osoba NUMBER, nazwisko VARCHAR2(100), adres VARCHAR2(100), biuro lokalizacja_objtyp ); CREATE TABLE osoba_zewn_objtab OF osoba_objtyp (id_osoba PRIMARY KEY ); Tabele zagnieżdżone 9
Oracle przechowuje wiersze tabeli
zagnieżdżonej w odrębnej tabeli składowej. Do połączenia wierszy w tabeli macierzystej z wierszami tabeli zagnieżdżonej służy ukryta kolumna NESTED_TABLE_ID o szerokości 16 bajtów wygenerowana przez system. Powiązanie tabeli macierzystej z tabelą zagnieżdżoną przedstawiono na rysunku: Tabela zagnieżdżoną o organizacji indeksowej (OIT) 10
Jeżeli tabela zagnieżdżona posiada klucz główny, to
może mieć organizację indeksową (IOT). W takim przypadku kolumna NESTED_TABLE_ID jest prefiksem klucza głównego dla danego wiersza tabeli macierzystej, a Oracle fizycznie łączy wiersze tabeli zagnieżdżonej odpowiadające danemu wierszowi tabeli macierzystej. Daje to możliwość szybkiego dostępu do wszystkich wierszy tabeli zagnieżdżonej, odpowiadających danemu wierszowi tabeli macierzystej. Zastosowanie klauzuli COMPRESS 11
W przypadku organizacji indeksowej, prefiks
określający wiersz tabeli macierzystej, któremu odpowiada dany wiersz tabeli zagnieżdżonej, jest zapisywany w każdym wierszu tabeli zagnieżdżonej. Zastosowanie klauzuli COMPRESS podczas tworzenia tabeli zagnieżdżonej powoduje, że prefiks określający wiersz tabeli macierzystej zapisywany jest w tabeli zagnieżdżonej tylko raz, dla wszystkich wierszy tabeli zagnieżdżonej, odpowiadających danemu wierszowi tabeli macierzystej Zagnieżdżanie pośrednie 12
Kolekcje można także zagnieżdżać w sposób pośredni, poprzez
zastosowanie referencji REF. Można utworzyć tabelę zagnieżdżoną typu obiektowego zawierającą atrybut wskazujący obiekt o atrybucie w postaci tabeli zagnieżdżonej lub tablicy VARRAY. Kiedy nie ma potrzeby dostępu do wszystkich elementów wielopoziomowej kolekcji, zagnieżdżanie kolekcji z referencjami REF może zapewnić lepszą wydajność. Zagnieżdżanie pośrednie - przykład 13
Załóżmy, że chcemy utworzyć nowy typ obiektowy osoba_objtyp używający
typów obiektowych: nazwisko_objtyp, adres_objtyp, oraz telefon_ntabtyp CREATE TYPE nazwisko_objtyp AS OBJECT ( imie1 VARCHAR2(15), imie2 VARCHAR2(15), nazwisko VARCHAR2(15));
CREATE TYPE adres_objtyp AS OBJECT (
CREATE TYPE osoba_objtyp AS OBJECT ( ulica VARCHAR2(200), id NUMBER(4), miasto VARCHAR2(200), nazwisko_obj nazwisko_objtyp, wojew CHAR(2), adres_obj adres_objtyp, kod VARCHAR2(20)); telefony_ntab telefon_ntabtyp);
CREATE TYPE telefon_objtyp AS OBJECT (
miejsce VARCHAR2(15), numer VARCHAR2(14));
Ponieważ każda osoba może posiadać
więcej niż jeden numer telefonu, tworzony CREATE TYPE jest typ tabeli zagnieżdżonej telefon_ntabtyp AS TABLE OF telefon_objtyp; telefon_ntabtyp oparty na typie obiektowym telefon_objtyp Zagnieżdżanie pośrednie - przykład 14
Utworzenie tabeli obiektowej ludzie_objtab typu osoba_objtyp :
CREATE TYPE osoba_objtyp AS OBJECT ( CREATE TABLE ludzie_objtab OF id NUMBER(4), nazwisko_obj nazwisko_objtyp, osoba_objtyp (id PRIMARY KEY) adres_obj adres_objtyp, NESTED TABLE telefony_ntab STORE AS telefony_ntab telefon_ntabtyp); ntab_telefony_lista ; Można wskazywać obiekty wierszowe w tabeli obiektowej ludzie_objtab z innych tabel. Dla przykładu załóżmy, że chcemy utworzyć tabelę projekty_objtab, zawierającą: numeryczny identyfikator każdego projektu, tytuł każdego projektu, prowadzącego każdego projektu, opis każdego projektu, kolekcję w postaci tabeli zagnieżdżonej zawierającą zespół osób realizujących każdy projekt. Przykład – pośrednia kolekcja zagnieżdżona 15
W pierwszej kolejności tworzymy typ obiektowy tabeli zagnieżdżonej
osoba_ref_ntabtyp oparty na typie obiektowym osoba_objtyp:
CREATE TYPE osoba_ref_ntabtyp AS TABLE OF REF osoba_objtyp;
Następnie tworzymy tabelę obiektową projekty_objtab typu projekt_objtyp:
CREATE TYPE projekty_objtyp AS OBJECT ( Tabela zawiera referencję id NUMBER(4), obiektową REF do tabeli tytul VARCHAR2(15), ludzie_objtab w celu wskazania prowadzacy_ref REF osoba_objtyp, osoby prowadzącej dany projekt opis CLOB, oraz kolekcję w postaci tabeli zespol_ntab osoba_ref_ntabtyp); zagnieżdżonej zawierającą referencje obiektowe REF dla CREATE TABLE projekty_objtab OF projekty_objtyp ( zespołu osób realizujących projekt. id PRIMARY KEY) NESTED TABLE zespol_ntab STORE AS ntab_zespol_lista; 16 Przykłady 1
(id_typ5 NUMBER, atr1 VARCHAR2(10), atr2 VARCHAR2(10), typ4_ntab typ4_ntabtyp); CREATE TABLE tabela5_objtab OF typ5_objtyp 4.2 NESTED TABLE typ4_ntab STORE AS ntab_typ4 ((PRIMARY KEY (NESTED_TABLE_ID, id_typ4)) ORGANIZATION INDEX COMPRESS);
CREATE TABLE tabela5_objtab OF typ5_objtyp
(PRIMARY KEY (id_typ5)) NESTED TABLE typ4_ntab STORE AS ntab_typ4 ((PRIMARY KEY (NESTED_TABLE_ID, id_typ4)) ORGANIZATION INDEX COMPRESS);
CREATE TABLE tabela5_objtab OF typ5_objtyp
(PRIMARY KEY (id_typ5)) OBJECT IDENTIFIER IS PRIMARY KEY NESTED TABLE typ4_ntab STORE AS ntab_typ4 ((PRIMARY KEY (NESTED_TABLE_ID, id_typ4)) ORGANIZATION INDEX COMPRESS);
prefiks określający wiersz tabeli macierzystej zapisywany jest w tabeli
zagnieżdżonej tylko raz, dla wszystkich wierszy tabeli zagnieżdżonej, odpowiadających danemu wierszowi tabeli macierzystej 4.3 DROP TABLE tabela5_objtab;
(id_typ7 NUMBER, atr1 VARCHAR2(10), atr2 VARCHAR2(10), typ6_ntab typ6_ntabtyp); CREATE TYPE typ7_ntabtyp AS TABLE OF typ7_objtyp; 5.2 CREATE TYPE typ8_objtyp AS OBJECT (id_typ8 NUMBER, atr1 VARCHAR2(10), atr2 VARCHAR2(10), typ7_ntab typ7_ntabtyp);
CREATE TABLE tabela8_objtab OF typ8_objtyp
(PRIMARY KEY (id_typ8)) OBJECT IDENTIFIER IS PRIMARY KEY NESTED TABLE typ7_ntab STORE AS ntab_typ7 ((PRIMARY KEY (NESTED_TABLE_ID, id_typ7)) ORGANIZATION INDEX COMPRESS NESTED TABLE typ6_ntab STORE AS ntab_typ6 ((PRIMARY KEY (NESTED_TABLE_ID, id_typ6)) ORGANIZATION INDEX COMPRESS)); 5.3 DROP TABLE tabela8_objtab;
(PRIMARY KEY (id_typ11)) OBJECT IDENTIFIER IS PRIMARY KEY NESTED TABLE typ9_ntab STORE AS ntab_typ9 ((PRIMARY KEY (NESTED_TABLE_ID, id_typ9)) ORGANIZATION INDEX COMPRESS) NESTED TABLE typ10_ntab STORE AS ntab_typ10 ((PRIMARY KEY (NESTED_TABLE_ID, id_typ10)) ORGANIZATION INDEX COMPRESS); 6.3 DROP TABLE tabela11_objtab;
DROP TYPE typ11_objtyp;
DROP TYPE typ10_ntabtyp;
DROP TYPE typ10_objtyp;
DROP TYPE typ9_ntabtyp;
DROP TYPE typ9_objtyp;
33 … na kolejnych wykładach: … operacje obiektowe, metody obiektowe, widoki obiektowe Literatura 34
[AJS2012] Antywzorce języka SQL. Bill Karwin, Helion 2012.
[DBORDG] Database Object-Relational Developer's Guide, Oracle® Database, 12c Release 1, https://docs.oracle.com/database/121/ADOBJ/toc.htm [DBSQLR] Database SQL Language Reference, Oracle® Database, 12c Release 1, https://docs.oracle.com/database/121/SQLRF/toc.htm [WSPBD2005] Współczesne problemy systemów baz danych Cz. 1.” red. Włodzimierz Stanisławski, Skrypty Politechniki Opolskiej ; nr 27. , 2005. - 210 s..