Sunteți pe pagina 1din 83

Diagrama de clase detaliată pentru pachetul P_Angajaţi

Diagrama de clase detaliată pentru pachetul P_Comenzi


1. Inainte de a incepe exemplificarea pentru pachetul P_Angajati va rog sa rulati scripturile
Creare si Populare tabele BD Resurse Umane.

2. Pentru clasa CDepartamente vom avea următoarea implementare:


CREATE OR REPLACE TYPE departamente_o AS OBJECT
(
id_departament NUMBER,
denumire_departament VARCHAR2(50),
id_manager NUMBER,
STATIC FUNCTION calculeaza_statistici(p_id_dep NUMBER) RETURN NUMBER
);

3. Crearea tabelei departamente_t pe baza definiţiei clasei departamente_o:


CREATE TABLE departamente_t OF departamente_o;

4. Popularea tabelei se poate realiza asemănător cu modalitatea de populare a tabelelor relaţionale:


INSERT INTO departamente_t
SELECT d.id_departament, d.denumire_departament, d.id_manager
FROM departamente d ;

5. Crearea tipului de obiecte functii_o şi a tabelei asociate se realizează asemănător:

CREATE OR REPLACE TYPE functii_o AS OBJECT


(
ID_FUNCTIE VARCHAR2(10),
DENUMIRE_FUNCTIE VARCHAR2(35),
SALARIU_MIN NUMBER(6),
SALARIU_MAX NUMBER(6),
STATIC FUNCTION calculeaza_statistici(p_id_func NUMBER) RETURN NUMBER
);

CREATE TABLE functii_t OF functii_o;

6. Clasa CAngajati are următoarea implementare prin crearea tipului de obiecte Angajati_o şi a tabelei
obiect asociate:

CREATE OR REPLACE TYPE angajati_o AS OBJECT


(
ID_ANGAJAT NUMBER(6),
PRENUME VARCHAR2(20),
NUME VARCHAR2(25),
EMAIL VARCHAR2(25),
TELEFON VARCHAR2(20),
DATA_ANGAJARE DATE,
ID_FUNCTIE VARCHAR2(10),
SALARIUL NUMBER(8,2),
COMISION NUMBER(2,2),
ID_MANAGER NUMBER(6),
ID_DEPARTAMENT NUMBER(4),
MEMBER FUNCTION calculeaza_bonus RETURN NUMBER,
MEMBER FUNCTION calculeaza_taxe RETURN NUMBER,
MEMBER FUNCTION calculeaza_venituri_totale RETURN NUMBER,
STATIC FUNCTION calculeaza_statistici (p_id_ang NUMBER) RETURN NUMBER
);
CREATE TABLE angajati_t OF angajati_o;

Pentru exemplificarile ulterioare este necesara popularea tabelei angajati_t

INSERT INTO angajati_t SELECT * FROM angajati;

7. Pentru a se putea crea corpul tipului de obiecte Angajati_o este necesara crearea anterioara a tipului
Comenzi_o si a tabelei comenzi_t

CREATE OR REPLACE TYPE comenzi_o AS OBJECT


(NR_COMANDA NUMBER(12) ,
DATA DATE,
MODALITATE VARCHAR2(8),
ID_CLIENT NUMBER(6),
STARE_COMANDA NUMBER(2),
ID_ANGAJAT NUMBER(6)
);

CREATE TABLE comenzi_t OF comenzi_o;

8. Implementarea metodelor din clase se realizează în corpul tipului de obiecte (object type body) al
fiecărui tip în parte.

CREATE OR REPLACE TYPE BODY departamente_o IS


STATIC FUNCTION calculeaza_statistici (p_id_dep NUMBER)
RETURN NUMBER
IS
v_nr_ang number;
BEGIN
SELECT count(*) INTO v_nr_ang
FROM angajati_t a
WHERE a.id_departament=p_id_dep;
RETURN v_nr_ang;
END;
END;

CREATE OR REPLACE TYPE BODY functii_o IS


STATIC FUNCTION calculeaza_statistici (p_id_func NUMBER)
RETURN NUMBER
IS
v_nr_ang number;
BEGIN
SELECT count(*) INTO v_nr_ang
FROM angajati_t a
WHERE a.id_functie=p_id_func;
RETURN v_nr_ang;
END;
END;

9. Putem interoga tabela Departamente_t pentru a afişa pentru fiecare departament denumirea şi
numărul de angajaţi, returnat de apelul funcţiei calculeaza_statistici:
SELECT id_departament, denumire_departament,
departamente_o.calculeaza_statistici(id_departament)
FROM departamente_t;

10. Apelul funcţiilor din tipurile obiect se poate realiza şi prin intermediul unui bloc PL/SQL. De exemplu,
se poate apela funcţia calculează_statistici din clasa CDepartamente pentru afişarea numărului de
angajaţi din departamentul 50 astfel:

DECLARE
v_nr NUMBER;
BEGIN
v_nr:=departamente_o.calculeaza_statistici(50);
DBMS_OUTPUT.PUT_LINE(v_nr);
END;
/

11. Metodele clasei CAngajati se vor implementa în cadrul corpului tipului de obiecte Angajati_o astfel:

CREATE OR REPLACE TYPE BODY angajati_o IS


-- functia membru calculeaza_bonus
MEMBER FUNCTION calculeaza_bonus
RETURN NUMBER
IS
BEGIN
RETURN SELF.salariul*NVL(SELF.comision,0);
END;
-- functia membru calculeaza_venituri_totale
MEMBER FUNCTION calculeaza_venituri_totale
RETURN NUMBER
IS
BEGIN
RETURN SELF.salariul*(1+NVL(SELF.comision,0));
END;
-- functia membru calculeaza_taxe
MEMBER FUNCTION calculeaza_taxe
RETURN NUMBER
IS
BEGIN
RETURN calculeaza_venituri_totale*0.16;
END;
-- functia calculeaza_statistici
STATIC FUNCTION calculeaza_statistici (p_id_ang number)
RETURN number
IS
v_nr_comenzi number;
BEGIN
SELECT COUNT(*) INTO v_nr_comenzi
FROM comenzi_t c
WHERE c.id_angajat=p_id_ang;
RETURN v_nr_comenzi;
END;
END;
12. Apelul funcţiilor membre ale tipului de obiecte Angajati_o se face utilizând constructorul implicit al
clasei prin precizarea tuturor atributelor sale:

SELECT nume, salariul, angajati_o.calculeaza_statistici (id_angajat)


Total_comenzi,
angajati_o(ID_ANGAJAT,PRENUME, NUME, EMAIL,TELEFON,
DATA_ANGAJARE,ID_FUNCTIE, SALARIUL, COMISION, ID_MANAGER,
ID_DEPARTAMENT).calculeaza_bonus() bonus,
angajati_o(ID_ANGAJAT,PRENUME, NUME, EMAIL,TELEFON,
DATA_ANGAJARE,ID_FUNCTIE, SALARIUL, COMISION, ID_MANAGER,
ID_DEPARTAMENT).calculeaza_venituri_totale() total_venituri,
angajati_o(ID_ANGAJAT,PRENUME, NUME, EMAIL,TELEFON,
DATA_ANGAJARE,ID_FUNCTIE, SALARIUL, COMISION, ID_MANAGER,
ID_DEPARTAMENT).calculeaza_taxe() taxe
FROM angajati_t;
ACADEMIA DE STUDII ECONOMICE BUCUREŞTI
FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ

SISTEME DE BAZE
D E DAT E
-Elemente introductive-

BUCUREŞTI
2019-2020
OBIECTIVUL GENERAL AL
DISCIPLINEI

• Însuşirea de către studenţi a unor noţiuni


fundamentale privind sistemele de baze de date
evoluate, scopul si aplicabilitatea acestora.
CADRE DIDACTICE
TITULAR CURS
• Conf.univ.dr. Vlad Diaconita

– diaconita.vlad@ie.ase.ro

TITULAR SEMINAR
• Lect.univ.dr. Alexandra Florea

– alexandra.florea@ie.ase.ro
STRUCTURĂ SEMINAR
• 3 module
• Modul 1. Oracle Spatial
• Modul 2. PL/SQL extensia obiectuală
• Modul 3. Oracle avansat – APEX
INSTRUMENTE DE LUCRU
• Modul 1. Oracle Spatial
– Sql Developer + BD Oracle ASE
– Conturi predefinite
• Modul 2. PL/SQL extensia obiectuală
– Sql Developer + BD Oracle ASE
– Conturi predefinite
• Modul 3. Oracle avansat – APEX
– Platforma APEX – cont propriu
– www.apex.oracle.com
MODALITATE EVALUARE

• Examen final de tip probă de verificare – 50%

 Subiecte tip grilă

Subiecte practice

• Seminar – 50%

 Proiecte + Activitate desfăşurată la seminar


MODALITATE EVALUARE SEMINAR

• Proiect Oracle Spatial – 30%


– Proiect seminar 5: aplicaţie Oracle Spatial, pe o BD proprie.
• Proiect Pl/Sql OO – 30%
– Proiect seminar 9: aplicaţie cu PL-SQL OO, pe o BD proprie.
• Proiect Oracle avansat APEX – 30%
– Proiect seminar 13: aplicaţie APEX, pe o BD proprie
• Activitate seminar – 10%
• Minim obligatoriu la fiecare proiect:
– o pagină cu: Tema, Descrierea, Schema conceptuală;
– lucrul cu un produs Oracle pe o BD proprie fiecărui student.
• Refacerea unui proiect se poate face în ultimul seminar din semestru. În
acest caz nota maximă va fi 8 (opt).
ACADEMIA DE STUDII ECONOMICE BUCUREŞTI
FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ

RECAPITULARE
LIMBAJELE SQL,
PL/SQL

BUCUREŞTI
2019-2020
SINTAXA COMENZII SELECT

SELECT [DISTINCT] (*/coloana1 [alias], expresii [alias])


FROM tabela1, tabela2, ...
WHERE (conditii, precizarea legaturilor dintre tabele)
GROUP BY nume_tabela.nume_coloana
HAVING (conditii impuse valorilor de grup)
ORDER BY nume_tabela.nume_coloana ASC/DESC;
LIMBAJUL SQL-ORACLE
JONCŢIUNI

Oracle Standard SQL

Joncţiune de egalitate

SELECT t1.a, t2.c SELECT t1.a, t2.c


FROM tabela1 t1, tabela2 t2 FROM tabela1 t1 JOIN tabela2 t2
WHERE t1.b=t2.b; ON t1.b=t2.b;

SELECT t1.a, t2.c


FROM tabela1 t1 NATURAL JOIN tabela2 t2

SELECT t1.a, t2.c


FROM tabela1 t1 JOIN tabela2 t2
USING (b);

3
LIMBAJUL SQL-ORACLE
JONCŢIUNI

Oracle Standard SQL


Joncţiune externă stânga

SELECT t1.a, t2.c SELECT t1.a, t2.c


FROM tabela1 t1, tabela2 t2 FROM tabela1 t1 LEFT JOIN tabela2 t2
WHERE t1.b=t2.b (+); ON t1.b=t2.b;

Joncţiune externă dreapta

SELECT t1.a, t2.c SELECT t1.a, t2.c


FROM tabela1 t1, tabela2 t2 FROM tabela1 t1 RIGHT JOIN tabela2 t2
WHERE t1.b (+)=t2.b; ON t1.b=t2.b;

4
LIMBAJUL SQL-ORACLE
JONCŢIUNI
Oracle Standard SQL
Joncţiune externă completă
SELECT t1.a, t2.c SELECT t1.a, t2.c
FROM tabela1 t1, tabela2 t2 FROM tabela1 t1 FULL JOIN tabela2 t2
WHERE t1.b=t2.b (+) ON t1.b=t2.b;
UNION
SELECT t1.a, t2.c
FROM tabela1 t1, tabela2 t2
WHERE t1.b (+)=t2.b;
Joncţiunea tabelei cu ea însăşi
SELECT t1.a, t2.b SELECT t1.a, t2.b
FROM tabela1 t1, tabela1 t2 FROM tabela1 t1 JOIN tabela1 t2
WHERE t1.a=t2.b; ON t1.a=t2.b;

5
EXERCITII

Afisati pentru fiecare produs comandat denumirea, data comenzii si


valoarea comenzilor pe fiecare zi.
select denumire_produs, data, sum(pret*cantitate)
from produse p, rand_comenzi r, comenzi c
where p.ID_PRODUS=r.ID_PRODUS and
r.NR_COMANDA=c.NR_COMANDA
group by denumire_produs, data;
EXERCITII

select a.nume, a.salariul, d.DENUMIRE_DEPARTAMENT,


case when a.salariul<2000 then 0.1
when a.salariul between 2000 and 5000 then 0.2
else 0.05
end * salariul+salariul majorare
from angajati a, departamente d
where a.ID_DEPARTAMENT=d.ID_DEPARTAMENT;
PL/SQL – PROCEDURAL
LANGUAGE EXTENSION TO SQL
DECLARE (Opţional)
• variabile, cursori, excepţii
BEGIN (Obligatoriu)
• comenzi SQL (asigură accesul la baza de date)
• structuri de programare procedurală PL/SQL
EXCEPTION (Opţional)
• acţiuni ce se execută când apare o eroare
END; (Obligatoriu)
• Tipuri de blocuri PL/SQL:
– Blocuri anonime;
– Funcţii stocate şi funcţii de aplicaţii;
– Proceduri stocate şi proceduri de aplicaţii;
– Pachete;
– Declanşatoare (triggeri) pe baza de date / de aplicaţii.
VARIABILE
• nume_variabila [CONSTANT] TIP_DATA [NOT NULL]
[:= | DEFAULT expresie]
• Atributul %TYPE
variabila tabelă.nume_coloană%TYPE;
sau
variabila1 tip_dată;

--afiseaza numele si prenumele angajatului cu codul 100.


DECLARE
v_nume angajati.nume%TYPE;
v_prenume angajati.prenume%TYPE;
BEGIN
SELECT nume, prenume
INTO v_nume, v_prenume
FROM angajati
WHERE id_angajat = 100;
DBMS_OUTPUT.PUT_LINE('NUMELE ANGAJATULUI ESTE:' || v_nume||'
'||v_prenume);
END;
/
TIPUL RECORD
TYPE nume_record IS RECORD (nume_câmp TIP_DATA [,nume_câmp
TIP_DATA:=|DEFAULT valoare]...);
Variabilă NUME_RECORD;

nume_record.nume_câmp.

NUME_RECORD tabela%ROWTYPE;
CURSORUL ÎN PL/SQL
• Atunci când se execută o comandă SQL, Oracle Server
deschide o zonă de memorie (context area) în care
comanda este executată. Cursorul este un pointer către
această zonă.
• În PL/SQL se utilizează două tipuri de cursoare:
• implicit: declarat pentru toate instrucţiunile PL/SQL de
tip LMD
• explicit: declarat şi gestionat de programator.
CURSORUL EXPLICIT
• se foloseşte pentru a procesa individual fiecare linie (înregistrare)
returnată de o instrucţiune SELECT ce returnează mai multe înregistrări.
• mulţimea înregistrărilor returnate de o instructiune SELECT este numită
mulţime rezultat.
• cursorul păstrează un pointer către linia curentă în cadrul unei mulţimi
rezultat.
• Verificarea stării unui cursor explicit se realizează prin intermediul
următoarelor atribute:
– NUME_CURSOR%ISOPEN;
– NUME_CURSOR%NOTFOUND;
– NUME_CURSOR%FOUND;
– NUME_CURSOR%ROWCOUNT.
PARCURGEREA FOLOSIND OPEN-
LOOP-FECTH-CLOSE
• DECLARE nume_cursor IS SELECT........................;
• OPEN nume_cursor;
• FETCH nume_cursor INTO var1, var2,..............;
• CLOSE nume_cursor;
Exemple:
Să se afişeze lista cu numele şi salariul angajaţilor din departamentul 60 folosind un cursor explicit și trei
variabile scalare:
set serveroutput on open ang_cursor;
declare loop
cursor ang_cursor is select id_angajat, nume, salariul fetch ang_cursor into ang_rec;
from angajati where id_departament=60; exit when ang_cursor%notfound;
--tipul record definit cu %ROWTYPE pt incarcarea dbms_output.put_line('Salariatul '||ang_rec.nume||' are
valorilor cursorului salariul: '||ang_rec.salariul);
ang_rec ang_cursor%rowtype; end loop;
begin close ang_cursor;
dbms_output.put_line('Lista cu salariariile angajatilor end;
din departamentul 60');
PARCURGEREA FOLOSIND FOR-
LOOP
FOR nume_record IN nume_cursor LOOP
--------------------------------------------------------
END LOOP;

Exemplu: Se afişează printr-un ciclu FOR numele şi salariile angajaţilor din departamentul 60:
set serveroutput on
declare
cursor ang_cursor is select id_angajat, nume, salariul from angajati where id_departament=60;
begin
dbms_output.put_line('Lista cu salariariile angajatilor din departamentul 60');
for ang_rec in ang_cursor loop
dbms_output.put_line('Salariatul '||ang_rec.nume||' are salariul: '||ang_rec.salariul);
end loop;
end;/
PARCURGEREA FOLOSIND FOR-
LOOP A UNUI CURSOR INLINE
(ANONIM)
FOR NUME_RECORD IN (SELECT......) LOOP
.....................................................................................
END LOOP;
Exemplu: Să se afişeze suma aferentă salariilor din fiecare departament:
set serveroutput on
declare
begin
dbms_output.put_line('Total salarii pe fiecare departament:');
for dep_rec in
(select d. id_departament dep, sum(a.salariul) sal
from angajati a, departamente d
where a.id_departament=d.id_departament
group by d.id_departament)
loop
dbms_output.put_line('Departamentul '||dep_rec.dep||' are de platit salarii in valoare de: '||dep_rec.sal||' RON');
end loop;
end;
UTILIZAREA CURSORULUI CU
PARAMETRU
CURSOR NUME_CURSOR (PARAMETRU1 TIP_DATA,.....)
IS SELECT .................;
PROCEDURI
Sintaxa pentru crearea unei proceduri:
CREATE [OR REPLACE] PROCEDURE NUME_PROC
[(param1 [IN|OUT|IN OUT] TIP1,
Param2[IN|OUT|IN OUT] TIP2, ....) ]
-- tipul variabilelor este precizat fara dimensiune (ex: NUMBER sau VARCHAR2)
IS|AS
-- zona de declarare a variabilelor utilizate in subprogram
-- NU se utilizeaza DECLARE
BEGIN
----
[EXCEPTION]
------
END [NUME_PROC];

Pentru a sterge procedura:


DROP PROCEDURE NUME_PROC;
Apelul unei proceduri se poate realiza in urmatoarele moduri:
• prin nume dintr-un bloc PL/SQL anonim sau un alt subprogram;
• prin apel direct cu EXECUTE nume_proc sau EXEC nume_proc sau CALL
nume_proc;
• din alt mediu Oracle (Oracle Developer Suite)
PROCEDURI
• Exemplu: Procedura modifica_salariul primeşte doi parametrii: p_id_angajat şi
procent şi majorează cu procentul specificat salariul angajatului cu
id_angajat=p_id_angajat:

CREATE OR REPLACE
PROCEDURE modifica_salariul_procent
(p_id_angajat IN angajati.id_angajat%type, procent IN number)
IS
v_salariul angajati.salariul%type;
BEGIN
Select salariul into v_salariul from angajati where id_angajat=p_id_angajat;
dbms_output.put_line('Angajatul are salariul de '||v_salariul);
Update angajati
Set salariul=salariul*(1+procent/100)
Where id_angajat=p_id_angajat;
Select salariul into v_salariul from angajati where id_angajat=p_id_angajat;
Dbms_output.put_line('Angajatul are acum salariul de '||v_salariul);
END;
FUNCTII
Sintaxa pentru crearea unei functii:
CREATE [OR REPLACE] FUNCTION nume_functie
[(param1 [IN] TIP1,
Param2[IN] TIP2, ....) ]
RETURN TIP_DATA
-- tipul variabilelor este precizat fara dimensiune (ex: NUMBER sau VARCHAR2)
IS|AS
-- zona de declarare a variabilelor utilizate in subprogram
-- nu se utilizeaza DECLARE
BEGIN
----
RETURN VALOARE;
[EXCEPTION]
------
END [NUME_FUNCTIE];

Pentru vizualizarea tipului returnat se utilizeaza:


DESCRIBE nume_functie;

Pentru a sterge functia:


DROP FUNCTION nume_functie;
FUNCTII
Exemplu: Returnează true/false daca salariatul are salariul mai mare/mai mic
sau egal cu salariul mediu si null daca salariatul nu exista

CREATE OR REPLACE FUNCTION verifica_salariul


(p_id_angajat IN angajati.id_angajat%type, p_sal_mediu IN number)
RETURN Boolean
IS
v_salariul angajati.salariul%type;
BEGIN
SELECT salariul into v_salariul from angajati where id_angajat=p_id_angajat;
IF v_salariul > p_sal_mediu then
return true;
ELSE
return false;
end if;
EXCEPTION
WHEN no_data_found THEN
return NULL;
end;
TO DO!
• Afisati pentru fiecare angajat numele, salariul,
denumirea departamentului de care apartine,
valoarea marita a salariului si numarul de comenzi
gestionate de acestia.
Salariul va fi marit astfel:
- Salariul <2000, crestere cu 10%
- Salariul between 2000 and 5000, crestere cu 20%
- Altfel crestere cu 5%
• Să se afişeze pentru fiecare comanda plasata online
data acesteia si lista produsele comandate.
TO DO!

• Create a program to add a new job into the JOBS table.


a. Create a stored procedure called NEW_JOB to enter a new
order into the JOBS table. The procedure should accept
three parameters. The first and second parameters supply a
job ID and a job title. The third parameter supplies the
minimum salary. Use the maximum salary for the new job
as twice the minimum salary supplied for the job ID.
b. Invoke the procedure to add a new job with job ID
'SY_ANAL', job title 'System Analyst', and minimum salary
of 6000.
c. Note the new job ID for use in the next exercise. Commit
the changes.
TO DO!
• In this exercise, create a program to add a new row to the JOB_HISTORY table, for an
existing employee.
a. Create a stored procedure called ADD_JOB_HIST to add a new row into the
JOB_HISTORY table for an employee who is changing his job to the new job ID
('SY_ANAL') that you created in the previous exercise.
The procedure should provide two parameters, one for the employee ID who is
changing the job, and the second for the new job ID. Read the employee ID from
the EMPLOYEES table and insert it into the JOB_HISTORY table. Make the hire
date of this employee as start date and today’s date as end date for this row in the
JOB_HISTORY table. Change the hire date of this employee in the EMPLOYEES
table to today’s date. Update the job ID of this employee to the job ID passed as
parameter (use the 'SY_ANAL' job ID) and salary equal to the minimum salary for
that job ID + 500. Note: Include exception handling to handle an attempt to insert a
nonexistent employee.
b. Execute the procedure with employee ID 106 and job ID 'SY_ANAL' as
parameters.
c. Query the JOB_HISTORY and EMPLOYEES tables to view your changes for
employee 106, and then commit the changes
Lucrul cu date spaţiale în sistem de
coordonate XoY în Oracle Spatial
Date conectare
 Sql Developer

 Username: Nume_MS

 Parola: stud

 hostname: 37.120.250.20

 port: 1521

 Service_name:oracle
 Se va lucra cu tabela MAGAZINE şi în special cu atributul
forma_geom în care sunt stocate date spaţiale.
 Pentru acesta se vor realiza diverse interogări asupra bazei de
date.
 Pentru rezolvarea problemei se vor parcurge paşii descrişi în
continuare.
Pas 1. Crearea tabelei
 Crearea tabelei MAGAZINE, ce va conţine următoarele
campuri:
 cod_magazinVARCHAR2(25) ,
 denumireVARCHAR2(25),
 adresa VARCHAR2(50),
 forma_geom SDO_GEOMETRY
Pas 2. Adăugarea de înregistrări
 Adăugarea de înregistrări în tabela MAGAZINE
 Pentru câmpul de tip SDO_GEOMETRY apar mai mulţi
parametri care au următoarea semnificaţie:
1. Nr de dimensiuni cu care lucrăm
2. Latitudine
3. Longitudine
4. SDO_ELEM_INFO_ARRAY
a) SDO_STARTING_OFFSET
b) SDO_ETYPE,
c) SDO_INTERPRETATION.
Pas 2. Adăugarea de înregistrări
SDO_ETYPE SDO_INTERPRETATION Semnificatie

0 Orice valoare numerică Nu e suportat de Oracle Spatial


1 1 Punct
1 n>1 Cluster cu n puncte
1003 sau 2003 1 Poligon simplu
1003 sau 2003 2 Poligon format din secvenţe circulare de arcuri
de cerc
1003 sau 2003 3 Dreptunghi
1003 sau 2003 4 Cerc
Pas 2. Adăugarea de înregistrări
5. SDO_ORDINATE_ARRAY - are un număr variabil de
parametri, ce reprezintă punctele în funcţie de care se poate
determina o anumită geometrie
INSERT INTO magazineVALUES( INSERT INTO magazineVALUES(
'1‘, 'Libelula','Piata Amzei nr.2', '3‘, 'Magazin pasaj','Piata universitatii',
SDO_GEOMETRY( SDO_GEOMETRY(
2003, -- poligon bidimensional 2003,
NULL, NULL,
NULL, NULL,
SDO_ELEM_INFO_ARRAY(1,1003,3), SDO_ELEM_INFO_ARRAY(1,1003,4), -- un
SDO_ORDINATE_ARRAY(5,2, 9,8) cerc
)); SDO_ORDINATE_ARRAY(7,10, 9,12, 7,14)
INSERT INTO magazineVALUES( ));
'2‘, 'Nufaru','Calea Mosilor nr. 270', INSERT INTO magazineVALUES(
SDO_GEOMETRY( '4‘, 'Farmacia Catena','Piata universitatii',
2003, -- poligon bidimensional SDO_GEOMETRY(
NULL, 2003, -- poligon bidimensional
NULL, NULL,
SDO_ELEM_INFO_ARRAY(1,1003,1), -- un NULL,
poligon SDO_ELEM_INFO_ARRAY(1,1003,3), -- un
SDO_ORDINATE_ARRAY(1,3, 4,2, 3,5, 1,5, dreptunghi
1,3) SDO_ORDINATE_ARRAY(6,11, 7,12)
)); ));
Pas 3. Actualizarea viziunii standard de
metadate
Actualizarea viziunii standard de metadate
USER_SDO_GEOM_METADATA.
 Această operaţie este necesară să se efectueze înainte ca
indexul să fie creat.
 Se realizează o singură dată pentru fiecare nivel (combinaţie
tabelă-coloană, în cazul de faţă magazine - forma_geom). Ea
conţine:
 informaţii despre numele tabelei ce conţine date spaţiale,
 coloana din tabela ce este de tip SDO_GEOMETRY,
 dimensiunile geometriei
 un număr (SRID) care specifică valoarea sistemului de coordonate.
Pas 3. Actualizarea viziunii standard de
metadate
INSERT INTO user_sdo_geom_metadata
(TABLE_NAME,
COLUMN_NAME,
DIMINFO, -- definesc sistemul de coordonate, are mai multi parametri
SRID) –vezi explicatie mai sus, la noi nu e cazul pt ca nu lucram cu long/lat azi.
VALUES (
'magazine',
'forma_geom',
SDO_DIM_ARRAY( -- 20X20 grid
SDO_DIM_ELEMENT('X' , 0, 20, 0.005 ),
SDO_DIM_ELEMENT('Y', 0, 20, 0.005)
),
NULL
);
Pas 4. Crearea indexului spaţial
Crearea indexului spaţial (un index de tip R-arborescent).
 Indexarea spaţială este un mecanism ce ajută la executarea
căutărilor într-o tabelă pe baza unor criterii spaţiale. Un index R-
arborescent aproximează fiecare geometrie cu cel mai mic
dreptunghi care poate conţine geometria (numit MBR – Minimum
Bounding Rectangle). Pentru mai multe geometrii, un index R-
arborescent constă în indexarea ierarhică a dreptunghiurilor
MBR. Acest tip de indecşi este preferat în lucrul cu date spaţiale
deoarece este foarte rapid şi lucrează direct pe date geodezice.
CREATE INDEX nume_index ON nume_tabela(nume_coloana)
INDEXTYPE IS MDSYS.SPATIAL_INDEX;
5. Executarea interogărilor spaţiale.
Acestea folosesc funcţii spaţiale, care se regasesc in pachetul
de functii SDO_GEOM
1. Sa se afiseze in Map View magazinul 4.

2. Să se afişeze intersecţia topologică dintre magazinele “1” şi


“2”, respectiv “3” şi “4”.
(SDO_INTERSECTION(forma_geom1, forma_geom2, 0.005) )

3. Să se afişeze toate suprafeţele magazinelor


(SDO_AREA(forma_geom, 0.005) )
5. Executarea interogărilor spaţiale.
4. Să se afişeze distanţa dintre magazinele ce au codurile 1 şi
2.
(SDO_DISTANCE(forma_geom1,forma_geom2, 0.005))
4. Să se determine dacă există vreo relaţie spaţială între zona
magazinelor ce au codurile 3 şi respectiv 4.
RELATE(forma_geom1, 'anyinteract' ,forma_geom,2 0.005)
5. Să se determine care este suprafata de intersecţie dintre
magazinele ‘3’ şi ‘4’
6. Tema: Sa se afiseze intr-un bloc PL/SQL suprafetele
tuturor magazinelor impreuna cu o trasare a dimensiunii
acestora.
Lucrul cu date spaţiale în sistem de
coordonate latitudinal-longitudinal în
Oracle Spatial
Pas 0
 Obţinerea datelor spaţiale – Google Maps
 Click dreapta pe obiectul cautat pe harta -> “what’s here”

 Atentie! La alegerea obiectivelor folositi toata tara, sau cel putin

1 punct aflat la distanta (ex: cluj, Timisoara etc).


Pas 1. Crearea tabelei spaţiale
CREATE TABLE "CENTRALE"
("ID_CENTRALA" NUMBER PRIMARY KEY,
" ID_EMITENT" VARCHAR2(40),
"DENUMIRE_FIRMA" VARCHAR2(60),
"LOCALITATE" VARCHAR2(40),
"JUDET" VARCHAR2(30),
"LATITUDINE" NUMBER(15,12),
"LONGITUDINE" NUMBER(15,12),
"PUTERE" NUMBER(4,0),
"STATIA" VARCHAR2(50),
"DATA" DATE,
"GEOM" "SDO_GEOMETRY" )
Pas 2. Adăugarea datelor
 ex:
Insert into Centrale
(ID_CENTRALA, ID_EMITENT, DENUMIRE_FIRMA,
LOCALITATE, JUDET, LATITUDINE, LONGITUDINE,
PUTERE, STATIA, DATA, GEOM)
values
(166, 'E.ON Moldova’, 'SC TELESATELIT SRL', 'Sat Dienet
Deal', 'Bacau', 46.327506, 27.06835, 0, 'Racaciuni',
to_date('27-MAR-09','DD-MON-RR'),
MDSYS.SDO_GEOMETRY(2001, 8307,
MDSYS.SDO_POINT_TYPE(27.06835, 46.327506, NULL),
NULL, NULL));)
Pas 3. Actualizarea viziunii standard de
metadate USER_SDO_GEOM_METADATA
INSERT INTO user_sdo_geom_metadata
(TABLE_NAME,
COLUMN_NAME,
DIMINFO,
SRID)
VALUES
('CENTRALE’,
'geom’,
SDO_DIM_ARRAY(
SDO_DIM_ELEMENT('Longitude', -180, 180, 0.5),
SDO_DIM_ELEMENT('Latitude', -90, 90, 0.5)
),
8307
);
Pas 4. Crearea indexului spaţial

CREATE INDEX centrale_spatial_idx


ON centrale(geom)
INDEXTYPE IS MDSYS.SPATIAL_INDEX;
Pas 5. Executarea interogărilor spaţiale

 Să se afişeze distanţa dintre centralele ce au codurile 1 şi 2

in km (standard este in metri). Apoi pentru centralele 10 si


20.
ACADEMIA DE STUDII ECONOMICE BUCUREŞTI
FACULTATEA DE CIBERNETICĂ, STATISTICĂ ŞI INFORMATICĂ ECONOMICĂ

MODUL DE UTILIZARE
A FAC I L I T Ă Ţ I I
OBIECTUALE A
PL/SQL

BUCUREŞTI
2019-2020
PRINCIPALELE CONCEPTE
• Conceptul de baza – obiect - descrie obiecte din lumea reala
• Obiectele sunt caracterizate de
– Atribute – proprietăți
– Metode – operații care caracterizează comportamentul
• Obiectele reprezintă colecţii de atribute care fac referire la aceeaşi
entitate. Fiecare obiect este caracterizat prin:
– numele prin care este referit;
– un identificator unic atribuit de sistem;
– o implementare care este privată;
– o interfaţă care este publică.
• Instanţa unui tip de obiecte reprezintă realizarea acestuia, dată de
valorile atributelor aferente.
PRINCIPALELE CONCEPTE
• O clasă (tip de obiecte) – schema după care este creat un obiect
• Tipurile de obiecte - tipuri de date compuse definite de utilizator,
prin care se definesc structura obiectului împreună cu funcţiile şi
procedurile necesare pentru manipularea datelor:
– variabilele care formează tipul de obiecte poartă denumirea de
atribute sau proprietăţi;
– operaţiile care caracterizează comportamentul obiectului
poartă denumirea de metode.
• Operația prin care este creat un obiect după o schemă precizată de
o clasă – instanțiere
• Nu se poate crea un obiect fără a se declara clasa(schema,tipul)
după care acesta a fost instanțiat
PRINCIPALELE CONCEPTE
• In POO trebuie respectată următoarea ordine
• Crearea claselor (tipurilor)
– Precizarea denumirii atributelor, a tipului de date
suportat,etc
– Precizarea signaturii metodelor componente, a corpului
lor,etc
• Crearea obiectelor
– Doar în momentul instanțierii clasei variabilele definite
de clasă sunt alocate în memorie și pot fi prelucrate de
către metode
– Toate obiectele unei clase suportă doar metode precizate
în definiția clasei
PRINCIPALELE CONCEPTE
• Caracteristicile fundamentale ale obiectelor, care sunt regăsite şi în
PL/SQL sunt:
• Încapsularea: descrierea obiectelor se face astfel încât nu se poate
avea acces din afara obiectului la datele sale;
• Polimorfismul (evidenţiat prin supraîncărcare): diferite obiecte pot
răspunde diferit la aceleaşi mesaje;
• Se referă la metode cu același nume și cu parametri de
intrare/ieșire diferiti
• Compilatorul alege varianta corectă de metodă în funcție de
param. de intrare furnizați
• O metodă poate executa acțiuni diferite în funcție de param.
furnizați
PRINCIPALELE CONCEPTE
• Moştenirea: capacitatea unui obiect de a-şi deriva datele şi
funcţionalitatea din alt obiect.
• Se permite construirea unor clase de bază, cu rolul de a stoca
caracteristici comune unor clase diferite, astfel că aceste
proprietăți nu vor trebui precizate în fiecare clasă în parte
• Moștenirea este posibilă și pe mai multe niveluri
• În urma moștenirii clasa derivată nu copiază propr. clasei de bază
ci acestea îi sunt direct accesibile
• Clasa derivată poate redefini metode ale clasei de bază.
PRINCIPALELE CONCEPTE
• Structura unui tip de obiecte Oracle este asemănătoare cu cea
a pachetelor de subprograme, fiind compusă din două părţi:
• 1. Specificaţiile tipului de obiecte (object type specification):
– indică structura obiectului (setul de proprietăţi ale
acestuia) şi operaţiile (metodele) prin care se defineşte
comportamentul acestuia.
– toate declaraţiile realizate în zona de specificaţii sunt
publice (vizibile din afara tipului de obiecte);
PRINCIPALELE CONCEPTE
• 2. Corpul tipului de obiecte (object type body):
– implementează specificaţiile şi defineşte explicit
metodele;
– se pot realiza orice modificări în corpul tipului de obiecte,
fără să fie necesară modificarea specificaţiilor şi fără a
afecta programele de aplicaţii;
– corpul tipului de obiecte este opţional, fiind necesar numai
în cazul în care au fost declarate diverse metode în
specificaţii.
PRINCIPALELE CONCEPTE
• Restricţii:
• în cadrul secţiunii de definire a specificaţiilor, toate atributele
trebuie declarate înaintea metodelor;
• dacă în cadrul secţiunii de definire a specificaţiilor sunt
declarate numai atribute, corpul tipului de obiecte nu mai
este necesar;
• nu pot fi definite atribute ale obiectelor în corpul tipului de
obiecte;
• toate declaraţiile din zona de specificaţii sunt publice;
• în corpul tipului de obiecte pot fi definite metode private.
• în cadrul sectiunii de definire a specificatiilor NU pot fi
definite constante, exceptii, cursori.
CREAREA UNUI TIP DE OBIECTE
ORACLE
CREATE [OR REPLACE] TYPE nume_tip IS|AS OBJECT
(atribut1 tip_de_dată,
atribut2 tip_de_dată,
......
[MEMBER procedure/function, --declarare metode
MEMBER procedure/function,
…..]
);
CREATE [OR REPLACE] TYPE BODY nume_tip IS|AS
[MEMBER procedure/function, --definirea corpului metodelor
MEMBER procedure/function,
…..]
END;
CREAREA UNUI TIP DE OBIECTE
ORACLE
• La definirea atributelor obiectelor trebuie respectate o serie de
reguli:
– un atribut trebuie să aibă un nume şi un tip de dată;
– tipul de dată ataşat atributului poate fi aproape orice tip de
dată Oracle, cu excepţia tipurilor LONG, LONG ROW,
NCHAR, NCLOB, NVARCHAR2, ROWID, UROWID sau a
tipurilor compuse definite în cadrul pachetelor;
– în partea de specificaţii, un atribut nu poate fi iniţializat şi nu
poate primi restricţia NOT NULL.
CREAREA UNUI TIP DE OBIECTE
ORACLE
• Metodele
– subprograme prin care se observă comportamentul
obiectelor
– se declară în partea de specificaţii a tipului de obiecte
prin cuvântul cheie MEMBER.
• Definirea unei metode se realizează în două etape:
– declararea (în partea de specificaţii a tipului de obiecte),
– definirea extinsă a corpului acesteia (în corpul tipului de
obiecte)
CREAREA UNUI TIP DE OBIECTE
ORACLE
• Regulile care trebuie îndeplinite la definirea unei metode:
– numele unei metode trebuie să fie unic;
– specificaţiile unei metode constau în:
• numele acesteia,
• lista parametrilor
• eventual, tipul de dată returnat (în cazul funcţiilor);
– corpul metodei constă în codul PL/SQL prin care se
descrie comportamentul obiectelor;
– metodele, ca şi subprogramele din cadrul pachetelor, pot fi
supraîncărcate.
MODIFICAREA UNUI TIP DE
OBIECTE ORACLE
• Modificarea atributelor şi metodelor unui tip de obiecte existent
se realizează în PL/SQL prin comanda ALTER, care primeşte
diverse clauze în funcţie de modificarea care se doreşte a se
efectua:
ALTER TYPE tip_obiect
ADD ATTRIBUTE (nume1 tip1, …) CASCADE;

ALTER TYPE tip_obiect


DROP ATTRIBUTE nume1, .. ;
STERGEREA UNUI TIP DE
OBIECTE ORACLE
• Ştergerea unui tip de obiecte se realizează prin comanda
DROP:
– DROP TYPE tip_obiect [ FORCE ];
• Clauza FORCE indică ştegerea tipului de obiecte, chiar dacă
există obiecte care depind de acesta.
• Dacă însă tipul de obiecte a stat la baza creării unei tabele,
clauza FORCE nu va avea efect, fiind necesar ca mai întâi să
se şteargă tabela şi mai apoi tipul.
• În urma creării unui tip de
obiecte, acesta devine vizibil
în schema utilizatorului, după
cum se observă în Figura 2:
EXEMPLIFICĂRI PRACTICE
• Un prim exemplu evidenţiază modul în care se pot crea tipuri
simple de obiecte.
• Astfel, tipul obj_adresa are drept atribute principalele
componente ale unei adrese: strada, numar, cod postal, oras,
id_tara. (tip varchar2, char)
• Metoda conţinută, definită în zona de specificaţii şi detaliată
în corpul tipului de obiecte, are rolul de a recompune adresa
completă pe baza atributelor: (function adresa_completa)
CONSTRUCTORI
• Fiecare tip de obiecte are o metodă constructor, folosită
pentru iniţializarea şi returnarea unei instanţe de tipul
respectiv.
• Constructorul are aceeaşi denumire ca şi tipul de obiecte, iar
parametrii formali ai acestuia au acelaşi tip cu atributele
obiectului
• Exercitiu: realizaţi un bloc Pl/Sql in care sa definiţi o
variabilă de tipul obj_adresă şi sa o iniţializaţi folosind
metoda constructor.
CONSTRUCTORI
• Se pot defini metode constructor proprii, prin supraîncărcarea
constructorului implicit sau definind noi funcţii cu signatura
diferită.
• Constructorul definit de utilizator urmăreşte sintaxa de mai jos, iar
apelul acestuia trebuie făcut, de asemenea, în mod explicit în
cadrul programului:
– CONSTRUCTOR FUNCTION tip_obiect (lista_atribute)
RETURN SELF AS RESULT
• Supraîncărcarea metodelor este o formă de polimorfism şi se
referă la faptul că pot exista mai multe definiţii pentru acelaşi
nume de metodă
CONSTRUCTORI
• Restricţii la supraîncărcarea metodelor:
– pot fi supraîncărcate numai metodele de acelaşi tip (proceduri sau
funcţii);
– nu se pot supraîncărca două metode dacă parametrii formali diferă
numai prin numărul sau prin tipul lor;
– nu se pot supraîncărca două funcţii membru ce diferă numai prin tipul
returnat.
PARAMETRUL SELF
• Metodele de tip MEMBER accepta un parametru implicit numit
SELF, care este o instanta a tipului de obiect.
• Indiferent daca este declarat implicit sau explicit, acesta este
intotdeauna primul parametru transmis unei metode de tip
MEMBER.
• Metodele de tip STATIC nu pot accepta sau referi parametrul
SELF
EXERCITIU
• Completati specificatia si corpul tipului de obiecte
obj_adresa astfel încât metoda constructor să fie
supraîncărcată
– pentru simplificarea exemplificării se considera
drept valoare implicită pentru codul ţarii - RO:
EXERCITIU
• Exemplificati modul de utilizare al celor doua metode
constructor, intr-un bloc PL/SQL.
• Execuţia blocului anterior sa duca la afişarea următoarelor
două instanţieri ale tipului de obiecte creat
– Str.Lunga 10 012531 Brasov RO
– Bd.Unirii 105 012531 Bucuresti RO
OBIECTE NEINIȚIALIZATE
• Până în momentul iniţializării unui obiect prin apelul constructorului, obiectul în sine este
Null (nu doar atributele sale).
• 2 obiecte null nu sunt niciodata egale, rezultatul comparării lor fiind Null. De asemenea
asignarea unui obiect null altui obiect îl va transforma şi pe acesta în null si va trebui
reiniţializat
DECLARE
Adresa obj_adresa;
BEGIN
IF adresa IS NULL THEN DBMS_OUTPUT.PUT_LINE('adresa is NULL #1'); END IF;
IF adresa.strada IS NULL THEN
DBMS_OUTPUT.PUT_LINE('adresa.strada is NULL #1');
END IF;
adresa.strada:='rotunda';
IF adresa IS NULL THEN DBMS_OUTPUT.PUT_LINE('adresa is NULL #2'); END
IF;
IF adresa.strada IS NULL THEN
DBMS_OUTPUT.PUT_LINE('adresa.strada is NULL #2');
END IF;
END;
TABELE BAZATE PE TIPURI DE
DATE
• Odată creată specificaţia obiectului, aceasta poate fi folosită
pentru crearea unei tabele bazată pe tipul de obiecte.
• O linie din tabela de obiecte are un identificator de obiect şi
serveşte ca referinţă la obiectul respectiv.
– CREATE TABLE nume_tabela OF tip_obiect; --
creare tabelă de obiecte
TABELE BAZATE PE TIPURI DE
DATE
• Restricţia de tip NOT NULL şi specificarea valorilor implicite
prin clauza DEFAULT nu pot fi ataşate atributelor unui tip de
obiecte, însă în cazul în care într-o tabelă creată pe baza tipului
este nevoie ca atributele să conţină aceste restricţii ele pot fi
aplicate ulterior, urmând sintaxa:
CREATE TABLE nume_tabela OF tip_obiect
(CONSTRAINT .......... --definire restricţii de integritate
asupra atributelor
);
EXERCITII
• Creati o tabela autentificare pornind de la tipul de obiecte
obj_autentificare.
• Tipul de obiecte obj_autentificare va avea urmatoarele atribute:
– Username VARCHAR2(20),
– parola VARCHAR2(20)
• În plus, celor două atribute ale tabelei li se ataşează restricţii
suplimentare de tip NOT NULL, independente de tipul de obiecte
pornind de la care se realizează crearea tabelei: