Presentation is loading. Please wait.

Presentation is loading. Please wait.

Date Semistructurate, 2012-2013 C12. Oracle / OR (2) Date Semistructurate, 2012-2013.

Similar presentations


Presentation on theme: "Date Semistructurate, 2012-2013 C12. Oracle / OR (2) Date Semistructurate, 2012-2013."— Presentation transcript:

1 Date Semistructurate, 2012-2013
C12. Oracle / OR (2) Date Semistructurate,

2 Oracle – object-relational (2)
C12. DS Oracle – object-relational (2)

3 Tip obiect Declarare tip obiect: C12 - DS
CREATE [OR REPLACE] TYPE nume {IS | AS} OBJECT [UNDER nume_parinte] ( nume_atribut tip_data [, nume_atribut tip_data] ... [CONSTRUCTOR nume([lista_parametri]) return SELF AS RESULT,] [{MAP | ORDER} MEMBER def_functie,] [[{FINAL | OVERRIDING | NOT INSTANTIABLE}] MEMBER {def_functie | def_procedura} [, [{FINAL | OVERRIDING | NOT INSTANTIABLE}] MEMBER {def_functie | def_procedura}] ...] ) [{FINAL | NOT FINAL}][{INSTANTIABLE | NOT INSTANTIABLE}];

4 Definire corp tip obiect:
C12 - DS Tip obiect Definire corp tip obiect: CREATE [OR REPLACE] TYPE BODY nume {IS | AS} implementare metode definite in partea de specificatii END;

5 C12 - DS Observatii: Tipul atributelor poate fi un alt tip obiect memorat La definirea unui atribut nu se poate stabili o valoare implicita (clauza DEFAULT), sau restrictii (clauza NOT NULL) Un tip obiect poate sa nu contina metode. Fara metode => o inregistrare Pentru fiecare metoda din partea de specificare trebuie sa exista o implementare in corpul tipului Un tip obiect se poate folosi pentru: declararea unei variabile declararea unui atribut la un tip obiect sau la un record declararea unei coloane dintr-un tabel declararea unei colectii declararea unui parametru la un subprogram declararea rezultatului unei functii definirea unui tabel de obiecte

6 C12 - DS Observatii: Daca o metoda nu are parametri, atunci la folosirea acesteia sunt necesare parantezele: obiect.metoda() Metodele de acelasi tip (proceduri, respectiv functii) pot fi avea aceasi denumire (=>supraincare) => trebuie ca sa se poata diferentia cele doua metode prin numarul de parametri / prin tipul parametrilor. La implementarea unei metode se poate folosi cuvantul SELF pentru referire la obiectul care se implementeaza. La implementarea metodelor unui tip obiect se pot referi atribute si alte metode fara a folosi calificarea. Doua obiecte (instante ale unui tip obiect) pot fi comparate prin "=" (toate atributele au aceleasi valori) sau prin "<>“ Pentru stergerea unui tip obiect care nu este folosit la o definitie memorata in baza de date se poate folosi instructiunea: DROP TYPE nume; Modificarea unui tip obiect se poate face prin instructiunea ALTER TYPE. Se poate face adaugarea, modificarea, stergerea de atribute, adaugarea, stergerea de metode (vezi CREATE OR REPLACE).

7 C12 - DS Observatii: Fiecare tip obiect are un constructor implicit cu numele identic cu numele tipului obiect si are ca parametri numele atributelor cu tipurile acestora. Pentru un tip obiect se poate defini si un constructor explicit, care furnizeaza un obiect. Dupa atribuirea de valori pentru atribute (la obiectul SELF), se foloseste instructiunea "RETURN;" pentru a termina functia constructor. Constructorul se apeleaza explicit, nu exista situatii pentru care se face o apelare implicita. O variabila declarata de un tip obiect si care nu a primit o valoare (ne-instantiata) este evaluata la null => eroare daca se incearca atribuirea unei valori unui atribut dintr-o astfel de variabila.

8 C12 - DS Observatii: Pentru ordonarea obiectelor se poate defini o functie introdusa cu MAP si care are valori de tipul: Date, Number, Char, Varchar2, sau de tipuri sau subtipuri asemanatoare. Aceasta functie se foloseste pentru a compara doua obiecte prin operatori relationali (=, !=, <, <=, >, >=, <>) sau in instructiuni SELECT la clauzele: DISTINCT, GROUP BY, ORDER BY. Functia Map poate fi inlocuita cu o metoda ORDER (la comparatii, la evaluarea instructiunii SELECT - cu variantele descrise mai sus). O astfel de metoda are cel mult doi parametri, primul (optional) care este SELF, iar urmatorul este un parametru de acelasi tip obiect. Valoarea functiei este un numar. Se presupune ca se compara obiectul insusi (SELF) cu obiectul precizat ca parametru pentru aceasta functie. Daca rezultatul este: <0 => Self < obiectul precizat ca parametru =0 => Self = obiectul precizat ca parametru >0 => Self > obiectul precizat ca parametru Un tip obiect poate avea numai una dintre aceste metode. Pentru o ordonare mai rapida se recomanda functia de tip MAP

9 C12 - DS Mostenirea La definirea unui tip obiect - se poate folosi mostenirea simpla: clauza "UNDER nume_parinte". => Tipul care se creaza va mosteni toate atributele si metodele tipului parinte. Pe langa aceste atribute si metode noul tip de data poate contine atribute si metode suplimentare care pot supraincarca metodele tipului parinte. La definirea unui tip obiect se pot mentiona: NOT FINAL: tipul definit se poate folosi pentru definirea de subtipuri FINAL: din acest tip de data nu se pot face derivari NOT INSTANTIABLE: tipul obiect definit nu se poate instantia, deci nu exista constructor (implicit sau explicit) INSTANTIABLE: tipul obiect definit se poate instantia

10 Crearea unui tip (memorat in baza de date)
C12 - DS Crearea unui tip (memorat in baza de date) (sintaxa pentru tip obiect, colectie vector, colectie tabel; pot fi definite si alte tipuri) CREATE [OR REPLACE] TYPE [schema.]nume_tip {IS | AS} OBJECT ... CREATE [OR REPLACE] TYPE [schema.]nume_tip {IS | AS} VARRAY(dim) OF tip; CREATE [OR REPLACE] TYPE [schema.]nume_tip {IS | AS} TABLE OF tip; Pentru informatii despre tipurile definite de utilizator se pot folosi view-urile sistem: user_types, all_types user_coll_types, all_coll_types

11 Crearea unui tabel C12 - DS CREATE TABLE nume_tabel (
coloana [, coloana]...[, proprietati_tabel] ) clauze; unde coloana poate fi definita ca: nume_coloana tipScalar | nume_coloana tipObiect | nume_coloana tipColectieVectorSauTable | nume_coloana REF tipObiect Pentru a defini tabel imbricat (pentru coloane de tip table of): clauze = NESTED TABLE nume_coloana STORE AS nume_tabel

12 Crearea unui tabel. Observatii
C12 - DS Crearea unui tabel. Observatii Daca o coloana este de tip colectie: Vector (sau tabel non-nested): Stocat inline, impreuna cu restul datelor din tabel (small) Operatii permise: consultare si suprascriere de valori (in SQL nu se permite utilizarea functiilor / metodelor specifice colectiilor – gen count, first, extend – , sau var_colectie(i)) Table (nested) Stocat in tabele auxiliare (large) Operatii permise: inserare, modificare, stergere de elemente din colectie (nested table)

13 Tabel de obiecte memorat relational
C12 - DS Tabel de obiecte memorat relational CREATE TABLE nume_tabel OF tipObiect => o inregistrare este formata dintr-o instanta de tipObiect

14 Exemplu TAD, constructori
C12 - DS Exemplu TAD, constructori drop type t1; create or replace type t1 as object ( a int, b int, constructor function t1(x int) return self as result ); / create or replace type body t1 as constructor function t1(x int) return self as result is begin self.a:=x; self.b:=0; return; end;

15 Exemplu TAD, functii MAP (definire)
C12 - DS Exemplu TAD, functii MAP (definire) drop type t1; create or replace type t1 as object ( a int, b int, map member function map_t1 return int ); / create or replace type body t1 as map member function map_t1 return int is begin return self.a; end;

16 Exemplu TAD, functii MAP (utilizare) (1)
C12 - DS Exemplu TAD, functii MAP (utilizare) (1) set serveroutput on; declare o1 t1; o2 t1; begin dbms_output.enable; o1:=t1(5, 10); o2:=t1(5, 20); dbms_output.put_line(o1.a); dbms_output.put_line(o1.b); dbms_output.put_line(o2.a); dbms_output.put_line(o2.b); dbms_output.put_line(o1.map_t1()); if o1 = o2 then dbms_output.put_line('egale'); else dbms_output.put_line('diferite'); end if; end;

17 Exemplu TAD, functii MAP (utilizare) (2)
C12 - DS Exemplu TAD, functii MAP (utilizare) (2) create table tt1(id int, o t1); insert into tt1 values (1, t1(10, 10)); insert into tt1 values (2, t1(20, 20)); insert into tt1 values (3, t1(5, 5)); insert into tt1 values (4, t1(15, 15)); insert into tt1 values (5, t1(40, 40)); select * from tt1 order by o;

18 Exemple TAD; OR C12 - DS drop type TLocalitate;
create or replace type TLocalitate as object ( loc varchar2(10), nr int, jud varchar2(2) ) ; /

19 C12 - DS drop type TPersoana;
create or replace type TPersoana as object ( nume varchar2(20), prenume varchar2(20), member function nume_pers return varchar2 ) not final ; / create or replace type body TPersoana as member function nume_pers return varchar2 is numeintreg varchar2(40); begin numeintreg:=(self.prenume || self.nume); return numeintreg; end;

20 C12 - DS drop type TEditor;
create or replace type TEditor under TPersoana ( rating int ) ; / drop type TCapitol; create or replace type TCapitol as object numar int, titlu varchar2(50), nrpagini int

21 C12 - DS drop type TTipografie;
create or replace type TTipografie as object ( cod int, denumire varchar2(50), locatie TLocalitate ) ; / create or replace type CVAutori as varray(10) of varchar2(20); create or replace type CTCapitole as table of TCapitol;

22 C12 - DS create table TBTipografii of TTipografie;
create table TBCarti ( idc int, titlu varchar2(100), autori CVAutori, edt TEditor, capitole CTCapitole, tipografia ref TTipografie ) nested table capitole store as tab_cap;

23 C12 - DS declare t TTipografie; begin
t:=TTipografie(101, 'tip1', TLocalitate('cluj', 22, 'CJ')); insert into TBTipografii values (t); insert into TBTipografii values ( TTipografie(102, 'tip2', TLocalitate('bistrita', 11, 'BN')) ); end;

24 C12 - DS select * from TBTipografii; select value(t) from TBTipografii t;

25 C12 - DS select TTipografie(cod, denumire, locatie) from TBTipografii; select TTipografie( 1, 'denumire', TLocalitate('loc', 1, 'cj')) from dual;

26 C12 - DS select denumire, locatie from TBTipografii; select tt.v.denumire, tt.v.locatie from (select value(t) as v from TBTipografii t) tt;

27 C12 - DS insert into TBTipografii values (TTipografie(105, 'denumire', TLocalitate('loc', 1, 'cj'))); update TBTipografii set denumire = 'den noua' where cod = 105; delete from TBTipografii where cod = 105;

28 C12 - DS insert into TBCarti
select 51, 'Poezii', CVAutori('Eminescu', 'Cosbuc'), TEditor('Editorul', 'Geo', 4), CTCapitole(TCapitol(1, 'Introducere', 10), TCapitol(2, 'Poezii de dor', 30), TCapitol(3, 'Poezii de seara', 20)), ref(tp) from TBTipografii tp where cod = 101

29 C12 - DS select * from TBCarti;

30 C12 - DS select t.titlu, t.edt.nume_pers() as editor from TBCarti t;

31 C12 - DS select t.idc, t.titlu, t.autori, t.capitole, deref(tipografia) from TBCarti t;

32 C12 - DS update TBCarti set tipografia = ( select ref(tp) from TBTipografii tp where cod = 101) where idc = 54; set autori = CVAutori('Andreica', 'Sterca')

33 C12 - DS select autori, tipografia from TBCarti where idc = 54;

34 C12 - DS select capitole from TBCarti where idc = 54; (vezi slide 29)
from table(select capitole from TBCarti where idc = 54) t; (table sau the)

35 C12 - DS select t.idc, t.titlu, t.autori, t.edt.nume_pers(), tt.*
from TBCarti t, table(t.capitole) tt; (=> format flat)

36 C12 - DS select t.idc, t.titlu, ta.*, t.edt.nume_pers(), tc.*
from TBCarti t, table(t.autori) ta, table(t.capitole) tc;

37 C12 - DS insert into table(select t.capitole from TBCarti t where idc = 54) tc values (TCapitol(6, 'Bibliografie', 2));

38 C12 - DS update table(select t.capitole from TBCarti t where idc = 54) tc set nrpagini = nrpagini + 1 where numar = 3;

39 C12 - DS delete from table(select t.capitole from TBCarti t where idc = 54) tc where numar = 4;

40 C12 - DS select t.idc, t.titlu, (select count(*)
from table( select capitole from TBCarti t1 where t1.idc = t.idc)) cnt, (select max(nrpagini) where t1.idc = t.idc)) max from TBCarti t; select t.idc, t.titlu, count(*), max(nrpagini) from TBCarti t, table(t.capitole) tc group by t.idc, t.titlu;

41 C12 - DS select t.idc, t.titlu, cardinality(capitole) from TBCarti t;

42 Multiset, union, intersect, except:
C12 - DS Multiset, union, intersect, except: create table TBCapitole (idcap int, cap TCapitol); select cast(multiset( select cap from TBCapitole where idcap in (1, 3, 4) ) as CTCapitole) from dual; select (select capitole from TBCarti where idc = 51) multiset union (select capitole from TBCarti where idc = 54)

43 C12 - DS update TBCarti set capitole = (
select (select capitole from TBCarti where idc = 51) multiset union (select cast(multiset( select * from table( select capitole from TBCarti where idc = 54) where numar in (5, 6)) as CTCapitole) from dual) where idc = 53;

44 C12 - DS Next 13 Modelare XML


Download ppt "Date Semistructurate, 2012-2013 C12. Oracle / OR (2) Date Semistructurate, 2012-2013."

Similar presentations


Ads by Google