Documente Academic
Documente Profesional
Documente Cultură
6. Clasa CAngajati are următoarea implementare prin crearea tipului de obiecte Angajati_o şi a tabelei
obiect asociate:
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
8. Implementarea metodelor din clase se realizează în corpul tipului de obiecte (object type body) al
fiecărui tip în parte.
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:
SISTEME DE BAZE
D E DAT E
-Elemente introductive-
BUCUREŞTI
2019-2020
OBIECTIVUL GENERAL AL
DISCIPLINEI
– 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
Subiecte practice
• Seminar – 50%
RECAPITULARE
LIMBAJELE SQL,
PL/SQL
BUCUREŞTI
2019-2020
SINTAXA COMENZII SELECT
Joncţiune de egalitate
3
LIMBAJUL SQL-ORACLE
JONCŢIUNI
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
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];
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];
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
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;