C11. Oracle / OR (1)

32
C11. Oracle / OR (1) Date Semistructurate, 2012-2013

description

C11. Oracle / OR (1). Date Semistructurate, 2012-2013. C 11 . DS. Oracle – object-relational (1). C11 - DS. Sistemele de BD relationale ofera suport pentru o colectie mica si (aproape) fixa de tipuri de date. In multe aplicatii, insa, trebuie gestionate date de complexitate mai mare. - PowerPoint PPT Presentation

Transcript of C11. Oracle / OR (1)

Page 1: C11. Oracle / OR (1)

C11. Oracle / OR (1)

Date Semistructurate, 2012-2013

Page 2: C11. Oracle / OR (1)

C11. DS

• Oracle – object-relational (1)

Page 3: C11. Oracle / OR (1)

• Sistemele de BD relationale ofera suport pentru o colectie mica si (aproape) fixa de tipuri de date. In multe aplicatii, insa, trebuie gestionate date de complexitate mai mare.

• Pentru a evita limitarile modelului relational pentru anumite aplicatii, s-au dezvoltat modele de date, printre care orientat-obiect, obiect-relational. In plus, XML este un limbaj prin care se permite prezentarea datelor intr-un mod „mai putin structurat” decat al celorlalte modele.

• Conceptele de orientare-obiect au influentat suportul unor SGBD-uri pentru tipuri complexe, plus suport pentru orientare-obiect (clase, mostenire, suprascriere de metode, instantiere…).

C11 - DS

Page 4: C11. Oracle / OR (1)

• Sistemele de BD obiectuale s-au dezvoltat pe doua directii:

– SGBD orientate-obiect (OODBMS): au fost propuse ca alternativa pentru SGBD relationale, pentru aplicatiile care lucreaza cu date de tipuri complexe; sunt prezente multe concepte din OO

– SGBD obiect-relationale (ORDBMS): au fost propuse ca tentativa de a extinde BD relationale cu functionalitati necesare unei arii mai mari de aplicatii (inclusiv pentru date complexe), ca intermediar intre BD relationale si OO

C11 - DS

Page 5: C11. Oracle / OR (1)

• Modele de date O-R (object-relational)

• Este o extindere a modelului relational prin includere de facilitati pentru orientare obiect si constructii care sa ofere suport unor tipuri de date noi / adaugate.

• Se permite ca atributele tuplelor sa aiba un tip complex, inclusiv valori non-atomice precum relatiile imbricate.

• Sunt pastrate fundamentele modelului relational, in particular, accesul declarativ la date, si este mentinuta compatibilitatea cu limbajele relationale existente.

C11 - DS

Page 6: C11. Oracle / OR (1)

• Modele de date O-R (object-relational). Oracle

• Observatii:– Nu se respecta 1NF

– Multimi / colectii / secvente / referinte la obiecte

– Tabele imbricate (nested tables)

– Se pastreaza fundamentul matematic al modelului relational:• Tabele unde unele coloane sunt de tip colectie / tabel• Tabele cu inregistrari de tip obiect (tabel de obiecte)

C11 - DS

Page 7: C11. Oracle / OR (1)

• Exemplu: biblioteca; fiecare carte are un titlu, o multime de autori, un editor si o multime de cuvinte cheie => relatia in non-1NF

titlu set_autori editor (nume, filiala) set_cuv_cheie

carte1 {A11, A12} (nume_E1, fil_E1) {Cuv1, Cuv2 }

carte2 {A21, A22} (nume_E1, fil_E1) {Cuv3}

• Versiunea 1NF (transformare directa, a.i. sa nu existe grupuri repetitive)

• Exemplu: relatia biblioteca in 1NF (flat):titlu autor nume_editor filiala_editor cuv_cheie

carte1 A11 nume_e1 fil_e1 cuv1

carte1 A12 nume_e1 fil_e1 cuv1

carte1 A11 nume_e1 fil_e1 cuv2

carte1 A12 nume_e1 fil_e1 cuv2

carte2 A21 nume_e1 fil_e1 cuv3

carte2 A22 nume_e1 fil_e1 cuv3

...

C11 - DS

Page 8: C11. Oracle / OR (1)

• In 1NF flat: se elimina nevoia de a efectua join-uri, insa se pierde corespondenta 1-la-1 intre tuple si documente si prezinta redundanta a datelor.

• Daca se presupune ca toate atributele relatiei depind de „titlu”, atunci procesul de normalizare (-> 3NF) ar avea ca rezultat obtinerea a trei relatii:– Autori (titlu, autor)– Cuvinte_cheie (titlu, cuv_cheie)– Carti (titlu, nume_editor, filiala_editor)– (eventual si Editori)

• => Probleme:– multe interogari asupra acestor date presupun efectuare de operatii de join– reprezentarea prin relatii imbricate este mai naturala / potrivita aici

C11 - DS

Page 9: C11. Oracle / OR (1)

• Exemplu:Cursuri:1 BD 2012 {Tambulea, Navroschi, Ban} {221, 222}2 DS 2012 {Varga, Navroschi} {232, 531}3 SO 2012 {Boian, Sterca} {221, 223,

224}

Sau:

1 BD 2012 {(Tambulea, 221), (Tambulea, 222), (Navroschi, 221), (Ban,

222)}

Vezi normalizare (1NF flat – 1 tabel, 1NF – 2 sau 3 tabele)

Depinde ce se vrea!!!

C11 - DS

Page 10: C11. Oracle / OR (1)

• Oracle – caracteristici OR

– tipuri de obiecte – ierarhii de tipuri – mostenire simpla

– tipuri colectie (varrays si tabele imbricate)

– tabele obiect (folosite in stocarea obiectelor, permitand consultarea atributelor acestora in mod relational)

– functii tabel (au ca rezultat un set de inregistrari, care poate fi folosit in clauza FROM a unei interogari)

– view-uri obiect (permit ca datele stocate in format relational sa fie vazute in „stil” OO)

– metode (pot fi scrise in PL/SQL, Java sau C)

– functii de agregare si functii de sortare definite de utilizator (utilizabile in interogari)

– tipuri de date XML (stocare de documente XML)

C11 - DS

Page 11: C11. Oracle / OR (1)

• Tipuri de date– Tipuri si subtipuri de date scalare

• numerice: number, real, float, integer, int, smallint, decimal, dec, numeric, natural, positive, binary_integer, ...

• caracter: varchar2, varchar, string, long, raw, rowid, char, ...• boolean: boolean• data calendaristica: date

– Valori binare: BLOB, CLOB, BFILE

– Compuse: inregistrari, colectii

– Cursor, referinta

– Utilizator (TAD)

– XMLType

– Tipul unei variabile definita anterior: variabila%TYPE

– Tipul unei coloane dintr-un tabel: [schema.]tabel.coloana%TYPE

– Tipul unei inregistrari dintr-un tabel, dintr-un cursor: [schema.]tabel%ROWTYPE sau nume_cursor%ROWTYPE

C11 - DS

Page 12: C11. Oracle / OR (1)

• Expresii– Operanzi: constante, variabile, coloane din tabele sau cursoare, valori ale

functiilor utilizator sau sistem

– Operatori: aritmetici (+, -, *, /), concatenare (||), relationali (=, !=, <, <=, >, >=), logici (not, and, or)In expresii se pot folosi si operatorii:

• IS NULL(expresie) - care are valoarea de true daca expresia argument este null, si false in caz contrar

• expresie_sir_caractere LIKE sablon• expresie BETWEEN valmin AND valmax• expresie IN (lista_de_valori)• EXISTS

• Conversii– Explicite: prin folosirea unor functii de conversie (ex: to_char(i))

– Implicite: la folosirea unor instructiuni de atribuire

C11 - DS

Page 13: C11. Oracle / OR (1)

• Structura bloc anonim:

[declare

<Constants>

<Variables>

<Cursors>

<User defined exceptions>]

begin

<PL/SQL statements>

end;

C11 - DS

Page 14: C11. Oracle / OR (1)

• Declaratie variabila:

<variable_name> [constant] <data_type> [not null]

[:= <expression>];

• Atribuire de valori variabilelor:

<variable_name> := <expression>;

• Sau

select <column_list> into <variable_list>

from <table>

…;

C11 - DS

Page 15: C11. Oracle / OR (1)

Exemplu:

declare

counter integer := 0;

begin

counter := counter + 1;

end;

---------------------------------

declare

cs int;

ds varchar2(20);

begin

select cods, denumires into cs, ds

from Sectii where cods = 1;

end;

C11 - DS

Page 16: C11. Oracle / OR (1)

Exemplu: fie tabelul EMP

declare

employee_rec EMP%ROWTYPE;

max_sal EMP.SALARY%TYPE;

begin

select EMPNO, ENAME, JOB, MGR, SALARY, HIREDATE, DEPTNO

into employee_rec

from EMP

where EMPNO = 5698;

select max(SAL) into max_sal from EMP;

end;

C11 - DS

Page 17: C11. Oracle / OR (1)

• Structuri de control:

if <condition> then <sequence of statements>[elsif ] <condition> then <sequence of statements>. . .[else] <sequence of statements> end if ;

while <condition> loop<sequence of statements>;

end loop

for <index> in [reverse] <lower bound>..<upper bound> loop<sequence of statements>

end loop

Obs: o varianta de parcurgere a unui cursor – cu for...loop; alta varianta – vezi comenzile OPEN, FETCH, CLOSE

for row_variable in cursor loop<sequence of statements>

end loop

C11 - DS

Page 18: C11. Oracle / OR (1)

• Proceduri / functii:

create [or replace] procedure <procedure name>

[(<list of parameters>)] is

<declarations>

begin

<sequence of statements>

end [<procedure name>];

------------------------------------------------------

create [or replace] function <function name>

[(<list of parameters>)] return <data type> is

<declarations>

begin

<sequence of statements>

end [<function name>];

C11 - DS

Page 19: C11. Oracle / OR (1)

• Definire parametrii proceduri / functii:

<parameter name> [IN | OUT | IN OUT] <data type>

[{ := | DEFAULT} <expression>]

• Executie proceduri:

<proc_name>(<list of parameters>);

C11 - DS

Page 20: C11. Oracle / OR (1)

• Comentarii:

-- comentariu pe o linie

/* Comentariu

pe mai

multe

linii*/

C11 - DS

Page 21: C11. Oracle / OR (1)

• Exemple:

set serveroutput on;declare

i int;begin

dbms_output.enable;

for i in 1..5 loopdbms_output.put_line(to_char(i));

end loop;

dbms_output.put_line('----------------');

for i in reverse 1..5 loopdbms_output.put_line(to_char(i));

end loop;end;

C11 - DS

Page 22: C11. Oracle / OR (1)

set serveroutput on;declare

cursor c is select id, nume from tc;varc c%ROWTYPE;

begindbms_output.enable;

for varc in c loopdbms_output.put_line(varc.nume);

end loop;-- sauopen c;fetch c into varc;while c%FOUND loop

dbms_output.put_line(varc.nume);fetch c into varc;

end loop;close c;

end;

C11 - DS

Page 23: C11. Oracle / OR (1)

set serveroutput on;declare

i int;

procedure tipar(i int)asbegin

dbms_output.enable;dbms_output.put_line('i: ' || to_char(i));

end;

begin

dbms_output.enable;

tipar(10);

end;

C11 - DS

Page 24: C11. Oracle / OR (1)

• Colectii

• Colectia: multime ordonata de elemente de acelasi tip.

• Tipuri colectii:

– Vector: cu valori pentru indice intre 1 si o valoare maxima precizata la definire

– Tabel indexat: cu valori posibile pentru indice intre -(2^31 - 1) si (2^31 - 1)

– Tabel: cu valori pentru indice: 1, 2, .... Este asemanator cu un tabel memorat in baza de date unde dimensiunea superioara poate creste (nu e fixata); array variabil

C11 - DS

Page 25: C11. Oracle / OR (1)

• Scenariu general pentru utilizarea unei colectii:

– Definirea unui tip de data colectie• Vector:

TYPE nume IS {VARRAY | VARYING ARRAY} (dimensiune) OF tip_element [NOT NULL]

• Tabel indexat:TYPE nume IS TABLE OF tip_element [NOT NULL] INDEX BY BINARY_INTEGER

• Tabel:TYPE nume IS TABLE OF tip_element

– Declararea unei variabile de un tip de data astfel definit

– Pentru un vector sau tabel este necesara utilizarea unui constructor pentru initializare. Constructorul coincide cu numele colectiei, iar ca argumente se pot folosi valori ale componentelor:

variabila:=nume_colectie([lista_de_valori)];

• Cu argumentele date constructorului se completeaza primele pozitii din colectie.• Initializarea se poate face la declararea variabilei, sau mai tarziu printr-o initializare

(instructiune de atribuire).– Pentru un tabel indexat se pot adauga valori prin atribuire, pe orice pozitie (fara ca

pozitiile sa fie consecutive).

C11 - DS

Page 26: C11. Oracle / OR (1)

• Observatii – colectii:– Dimensiune:

• Dimensiune fixa: vector• Dimensiune variabila: tabel indexat, tabel

– Constructor:• Se poate folosi constructor: vector, tabel• Fara constructor (direct atribuiri): tabel indexat

– Ocupare:• Pozitii continue: vector, tabel• Orice pozitie, posibil goluri: tabel indexat

– Adaugare / stergere:• La / de la sfarsit: vector, tabel• Pe / de pe orice pozitie: tabel indexat

– Posibilitate de a defini coloana de tip colectie:• Da: vector, tabel• Nu: tabel indexat

– Stocare ca tabel imbricat:• Da: tabel• Nu: vector

C11 - DS

Page 27: C11. Oracle / OR (1)

• Elementele colectiei pot fi: – un scalar (char, number, ...)– tipul unei variabile definita anterior– tipul unei coloane dintr-un tabel existent– tipul liniilor unui tabel sau cursor– o inregistrare– un obiect– un tip colectie

• Referire la un element din colectie: indexul si calificarea unei eventuale componente dintr-o inregistrare.

• Exemplu:nume_colectie(index)[(index)...]nume_colectie(index).componenta

C11 - DS

Page 28: C11. Oracle / OR (1)

• Metode (proceduri, functii) pentru colectii:– count - numarul de elemente din colectie– exists(n) - returneaza true daca pe pozitia n din colectie exista o valoare, si

false in caz contrar– first, last - furnizeaza prima, respectiv ultima pozitie folosita in colectie. – prior(n), next(n) - dau indexul din fata, respectiv care urmeaza, celui

precizat in argument.– extend - extinde o colectie vector sau tabel, care este deja initializata:

• extend - adauga un element cu valoarea null (se poate efectua daca la declarare nu s-a folosit restrictia not null)

• extend(n) - care adauga n elemente cu valoarea null• extend(n,i) care adauga n elemente cu valoarea elementului de pe pozitia i

– trim - elimina elemente de la sfarsitul colectiilor de tip vector si tabel:• trim - elimina ultimul element• trim(n) - elimina ultimele n elemente din colectie

– delete - sterge elemente dintr-o colectie tabel indexat:• delete - sterge toate elementele din colectie• delete(n) - sterge elementul de pe pozitia n• delete(m,n) - sterge toate elementele de la pozitia m la pozitia n

C11 - DS

Page 29: C11. Oracle / OR (1)

set serveroutput on;declarei int;type tvector is varray (10) of i%type;v tvector;

begindbms_output.enable;v:=tvector(1, 2, 3);

--VECTORdbms_output.put_line('nr elemente:' ||

to_char(v.count));if v.exists(3) then

dbms_output.put_line('exista elem 3:' || to_char(v(3)));

elsedbms_output.put_line('nu exista elem 3:');

end if;if v.exists(4) then

dbms_output.put_line('exista elem 4:' || to_char(v(4)));

elsedbms_output.put_line('nu exista elem 4:');

end if;

dbms_output.put_line('v - first / last:');dbms_output.put_line(to_char(v.first));dbms_output.put_line(to_char(v.last));

dbms_output.put_line(to_char(v.next(2)));

C11 - DS

dbms_output.put_line('v:');

for i in 1..v.count loopdbms_output.put_line(to_char(v(i)));

end loop;

v.extend;for i in 1..v.count loop

dbms_output.put_line(to_char(v(i)));end loop;

v(4):=5;for i in 1..v.count loop

dbms_output.put_line(to_char(v(i)));end loop;

v.extend(2, 2);for i in 1..v.count loop

dbms_output.put_line(to_char(v(i)));end loop;

v.trim(3);for i in 1..v.count loop

dbms_output.put_line(to_char(v(i)));end loop;

end;

Page 30: C11. Oracle / OR (1)

set serveroutput on;declarei int;type ttindex is table of smallint index by

binary_integer;ti ttindex;

begindbms_output.enable;ti(2):=1;

--TABLE INDEXdbms_output.put_line('nr elemente:' ||

to_char(ti.count));if ti.exists(1) then

dbms_output.put_line('exista elem 1:' || to_char(ti(1)));

elsedbms_output.put_line('nu exista elem 1:');

end if;if ti.exists(2) then

dbms_output.put_line('exista elem 2:' || to_char(ti(2)));

elsedbms_output.put_line('nu exista elem 2:');

end if;

dbms_output.put_line('ti - first / last:');dbms_output.put_line(to_char(ti.first));dbms_output.put_line(to_char(ti.last));

C11 - DS

ti(6):=6;dbms_output.put_line(to_char(ti.first));dbms_output.put_line(to_char(ti.last));

if ti.exists(3) thendbms_output.put_line('exista elem 3:' || to_char(ti(3)));

elsedbms_output.put_line('nu exista elem 3:');

end if;dbms_output.put_line('--');

ti(7):=7;dbms_output.put_line('ti - first / last:');dbms_output.put_line(to_char(ti.first));dbms_output.put_line(to_char(ti.last));

ti.delete(6);dbms_output.put_line(to_char(ti.first));dbms_output.put_line(to_char(ti.last));

ti.delete(3, 8);dbms_output.put_line(to_char(ti.first));dbms_output.put_line(to_char(ti.last));

end;

Page 31: C11. Oracle / OR (1)

set serveroutput on;declaretype ttable is table of smallint;t ttable;

begindbms_output.enable;t:=ttable(1, 2, 3);

--TABLEdbms_output.put_line('nr elemente:' || to_char(t.count));if t.exists(1) then

dbms_output.put_line('exista elem 1:' || to_char(t(1)));

elsedbms_output.put_line('nu exista elem 1:');

end if;if t.exists(3) then

dbms_output.put_line('exista elem 3:' || to_char(t(3)));

elsedbms_output.put_line('nu exista elem 3:');

end if;

dbms_output.put_line('t - first / last:');dbms_output.put_line(to_char(t.first));dbms_output.put_line(to_char(t.last));

dbms_output.put_line('next de 1: ' || to_char(t.next(1)));dbms_output.put_line('next de 2: ' || to_char(t.next(2)));

C11 - DS

dbms_output.put_line('t:');for i in 1..t.count loop

dbms_output.put_line(to_char(t(i)));end loop;

t.extend;for i in 1..t.count loop

dbms_output.put_line(to_char(t(i)));end loop;

t(3):=5;for i in 1..t.count loop

dbms_output.put_line(to_char(t(i)));end loop;

t.extend(2, 2);for i in 1..t.count loop

dbms_output.put_line(to_char(t(i)));end loop;

t.trim(1);for i in 1..t.count loop

dbms_output.put_line(to_char(t(i)));end loop;

end;

Page 32: C11. Oracle / OR (1)

• Next 12– Oracle (2)

C11 - DS