Documente Academic
Documente Profesional
Documente Cultură
AVANSATE
Ex. Se vor crea tabelele EMP si DEPT si se vor insera date (inregistrari) -
https://livesql.oracle.com/apex/livesql/file/content_O5AEB2HE08PYEPTGCFLZU9Y
CV.html
Analizati modelul de date
EMP – PK:
DEPT – PK:
FK:
Tip relatie intre DEPT si EMP:
create table dept( deptno number(2,0), dname varchar2(14), loc varchar2(13),
constraint pk_dept primary key (deptno) );
create table dept( deptno number(2,0) primary key, dname varchar2(14), loc
varchar2(13));
create table emp( empno number(4,0), ename varchar2(10), job varchar2(9), mgr
number(4,0), hiredate date,
sal number(7,2), comm number(7,2), deptno number(2,0),
constraint pk_emp primary key (empno),
constraint fk_deptno foreign key (deptno) references dept (deptno) );
SELECT empno, ename, sal, comm FROM emp WHERE deptno = 10;
CLAUZA GROUP BY
Aceasta clauza imparte tabela in grupuri virtuale de linii. Liniile din fiecare grup
au aceeasi valoare in campul campi (criteriu de grupare). Pentru fiecare grup se
vor efectua operatiile stabilite prin functiile F1, F2,….Fn asupra valorilor din
campurile ce apar ca si argument al acestor functii.
Fj = SUM|MIN|MAX|COUNT|AVG ; j = 1,n
Pentru fiecare department, sa se calculeze numar de
angajati si valoarea totala a salariilor.
1.
echijonctiune
Join extern
SELECT id_personal, nume_personal,
prenume_personal, titlu_proiect,
buget_proiect
FROM personal, proiect
WHERE id_personal = director_proiect (+);
Semnul (+) insoteste campul director_proiect din tabela PROIECT. Acest lucru indica faptul ca, in
tabela PROIECT avem date mai “putine” (directorii de proiect sunt mai putin; nu sunt toti
angajatii).
RIGHT JOIN – in comanda SELECT numele tabelei PERSONAL va fi plasat la dreapta cuvantului
JOIN, deoarece din aceasta tabela urmeaza sa fie afisati toti agajatii, si cei care nu
coordoneaza proiecte.
CELE 3 TIPURI DE PRELUCRARI NU SE POT COMBINA INTR_O SINGURA COMANDA SELECT !!!!!!
SA SE IMPLEMENTEZE URMATOARELE PRELUCRARI CU AJUTORUL
COMENZILOR SQL
Campul id_vanzare NU poate sa apara in comanda, deoarece asupra lui nu este aplicata
nici o functie de tipul SUM, COUNT, MIN, MAX, AVG si nu apare nici in conditia de grupare
BAZE DE DATE
AVANSATE
Sa se afiseze o situatie lunara cu totalul cantitativ si totalul valoric pentru fiecare produs
INSERT INTO prof VALUES (11, 'pop','mircea'); INSERT INTO stud VALUES (1,'st1','st1');
INSERT INTO prof VALUES (12, 'blaga','maria'); INSERT INTO stud VALUES (2,'st2','st2');
INSERT INTO prof VALUES (13, 'avram','mihai'); INSERT INTO stud VALUES (3,'st3','st3');
INSERT INTO stud VALUES (4,'st4','st4');
INSERT INTO discipline VALUES (1,'Retele de calculatoare', 12); INSERT INTO stud VALUES (5,'st5','st5');
INSERT INTO discipline VALUES (2,'Baze de date avansate', 12);
INSERT INTO discipline VALUES (3,'Medii de programare vizuala', 11);
INSERT INTO discipline VALUES (4,'Marketing online', 13);
INSERT INTO evid_note VALUES (1, TO_DATE('20.06.2022','dd.mm.yyyy'), 2, 3, 10);
INSERT INTO evid_note VALUES (2, TO_DATE('20.06.2022','dd.mm.yyyy'), 2, 1, 9);
INSERT INTO evid_note VALUES (3, TO_DATE('20.06.2022','dd.mm.yyyy'), 2, 2, 9);
INSERT INTO evid_note VALUES (4, TO_DATE('20.06.2022','dd.mm.yyyy'), 2, 5, 10);
INSERT INTO evid_note VALUES (5, TO_DATE('24.06.2022','dd.mm.yyyy'), 1, 1, 10);
INSERT INTO evid_note VALUES (6, TO_DATE('26.06.2022','dd.mm.yyyy'), 3, 3, 4);
INSERT INTO evid_note VALUES (7, TO_DATE('30.06.2022','dd.mm.yyyy'), 4, 1, 10);
INSERT INTO evid_note VALUES (8, TO_DATE('30.06.2022','dd.mm.yyyy'), 4, 5, 7);
1. O lista cu studentii care au promovat examenul la disciplina cu id_disc in ordine
descrescatoare a notelor.
2. O lista cu disciplinele si cu media notelor la acestea
3. O lista cu studentii care au obtinut la disciplina cu id_disc = 4 o nota > media
notelor la aceasta disciplina
4. O lista cu studentii si cu mediile acestora.
5. O lista cu disciplinele si numarul de student la examen la fiecare disciplina
6. O lista cu disciplinele la care s-au prezentat la examen cei mai putini studenti.
7. O lista cu profesorii, numarul de discipline predate
8. Urmatoarea situatie: nume profesor, disciplina, nota_min, nota_max
Partea executabila a unui bloc de program
PROCEDURI
ANONIME
FUNCTII
tipareste o linie
O procedura care afiseaza datele unui angajat precizat prin
identificatorul sau.
create or replace procedure p_afis_mm (p_empno number) is
v1 emp.empno%type;
v2 emp.ename%type;
v3 emp.sal%type;
v4 emp.comm%type;
v5 number;
begin
select empno, ename, sal, nvl(comm,0), sal+nvl(comm,0) into v1, v2, v3, v4, v5 from emp
where empno = p_empno;
dbms_output.put_line ('nume '||v1);
dbms_output.put_line ('departament '||v2);
dbms_output.put_line ('salar '||v3);
dbms_output.put_line ('comision '||v4);
dbms_output.put_line ('total '||v5);
end;
/
Apelul procedurii:
begin
p_afis_mm (7839);
end;
/
1.Procedura pafis are definit parametrul p_empno. Acesta se comporta ca si o variabila si permite formularea unor
conditii in codul de program. Paremetrului i se atribuie o valoare in momentul in care procedura se va executa ca
urmare a apelului ei.
Apelul procedurii (si deci executia ei) se realizeaza cu begin pafis (7698); end;.
Deci, p_empno va fi 7698 si pentru acest angajat se va efectua calculul.
- p_empno - parametru formal;
- 7698 - parametru actual.
2.In partea de declaratii a procedurii sunt definite variabilele v1, v2, v3, v4 si v5. Ele sunt locale procedurii, adica au
sens doar in interiorul ei. Pentru variabile valorile se calculeaza/determina in interiorul procedurii, pe cand
parametrul p_empo primeste o valoare (prin echivalentul sau actual) din exteriorul procedurii si stabileste contextul
in care se executa comenzile SQL/instructiunile din interiorul procedurii (in cazul nostru, stabileste angajatul pentru
care se vor efectua prelucrarile).
3.Declaratia (definirea) unei variable presupune precizarea numelui variabilei si a tipului ei. De exemplu,
v1 NUMBER(4);
sau
v1 emp.ename%TYPE; unde %TYPE este un atribut al campului ENAME din tabela EMP si reprezinta tipul
acestui camp.
4. Comanda SELECT contine clauza INTO v1, v2, v3, v4, v5. Rezultatul comenzii SELECT se memoreaza in
variabilele specificate.
Daca angajatul nu exista in tabela EMP, atunci executia procedurii se finalizeaza cu
eroare – No Data Found.
Aceasta este cauzata de executia comenzii SELECT si reprezinta o asa numita
EXCEPTIE, ce trebuie tratata (programata) in partea de EXCEPTION a procedurii.
begin
p_afis_mm (0);
end;
/
BAZE DE DATE
AVANSATE
A FOR i IN c LOOP
instructiuni cu i.camp1, i.camp2,……., i.campn;
alte instructiuni;
END LOOP;
Variabila i are o structura similara cu structura cursorului, adica este data de campurile
care apar in comanda SELECT. In variabila i sunt preluate pe rand liniile din cursor.
B OPEN c;
--se citeste prima linie de date din cursor cu FETCH, iar datele sunt transferate in
--variabilr
FETCH c INTO variabile;
WHILE c%FOUND LOOP Obs. c%FOUND si c%NOTFOUND
sunt atribute ale cursorului c. Ele
instructiuni cu variabilele si alte instructiuni; iau automat valorile TRUE si sau
--se citeste urmatoarea linie din cursor FALSE in timpul executiei unei
FETCH c INTO variabile; comenzi FETCH
END LOOP;
CLOSE c;
C OPEN c;
LOOP
FETCH c INTO variabile;
EXIT WHEN c%NOTFOUND;
instructiuni cu variabilele si alte instructiuni
END LOOP;
CLOSE c;
Var II. Crearea unui obiect de tip Query in baza de date Access si formularea in C# a unui SELECT
asupra acestui Query
A FOR i IN c LOOP
instructiuni cu i.camp1, i.camp2,……., i.campn;
alte instructiuni;
END LOOP;
Variabila i are o structura similara cu structura cursorului, adica este data de campurile
care apar in comanda SELECT. In variabila i sunt preluate pe rand liniile din cursor.
B OPEN c;
--se citeste prima linie de date din cursor cu FETCH, iar datele sunt transferate in
--variabilr
FETCH c INTO variabile;
WHILE c%FOUND LOOP Obs. c%FOUND si c%NOTFOUND
sunt atribute ale cursorului c. Ele
instructiuni cu variabilele si alte instructiuni; iau automat valorile TRUE si sau
--se citeste urmatoarea linie din cursor FALSE in timpul executiei unei
FETCH c INTO variabile; comenzi FETCH
END LOOP;
CLOSE c;
SELECT angajati.cod_angajat,nume, avg(durata), sum(cost_transport * durata*cost_zi)
FROM angajati, deplasari
WHERE angajati.cod_angajat = deplasari.cod_angajat
group by angajati.cod_angajat, nume
ORDER BY nume;
CREATE OR REPLACE PROCEDURE sinteza_deplasari IS
CURSOR c IS SELECT angajati.cod_angajat,nume, avg(durata), sum(cost_transport * durata*cost_zi)
FROM angajati, deplasari
WHERE angajati.cod_angajat = deplasari.cod_angajat
group by angajati.cod_angajat, nume
ORDER BY nume;
vcod number(10); vnume VARCHAR2(40);
vdurata NUMBER(10,2); vcost NUMBER(10,2);
i NUMBER(3); s NUMBER(10);
BEGIN
DBMS_OUTPUT.PUT_LINE ('Nr.crt COD_ANGAJAT NUME ANGAJAT DURATA_MEDIE COST_DEPLASARI');
i:=1; s:=0;
OPEN c;
LOOP
FETCH c INTO vcod,vnume,vdurata,vcost;
EXIT WHEN c%NOTFOUND;
DBMS_OUTPUT.PUT_LINE (i||' '||vcod||' '||vnume||' '||vdurata||' '||vcost);
i:=i+1; s:= s + vcost;
END LOOP;
CLOSE c;
DBMS_OUTPUT.PUT_LINE ('Cost total '||s);
END;
/
CREATE OR REPLACE PROCEDURE sinteza_deplasari_f IS
CURSOR c IS SELECT angajati.cod_angajat,nume, avg(durata), sum(cost_transport * durata*cost_zi)
FROM angajati, deplasari
WHERE angajati.cod_angajat = deplasari.cod_angajat
group by angajati.cod_angajat, nume
ORDER BY nume;
vnume VARCHAR2(40);
vcod number(10);
vdurata NUMBER(10,2); vcost NUMBER(10,2);
vcodf CHAR(10); vnumef CHAR(30); vdurataf CHAR(15); vcostf CHAR(25);
i NUMBER(3); s NUMBER(10);
BEGIN
DBMS_OUTPUT.PUT_LINE ('NR.CRT COD_ANGAJAT NUME ANGAJAT DURATA_MEDIE
COST_DEPLASARI');
i:=1; s:=0;
OPEN c;
LOOP
FETCH c INTO vcod,vnume,vdurata,vcost;
EXIT WHEN c%NOTFOUND;
vcodf := to_char(vcod); vnumef := to_char(vnume); vdurataf := to_char(vdurata); vcostf:= to_char(vcost);
DBMS_OUTPUT.PUT_LINE (i||' '||vcodf||' '||vnumef||' '||vdurataf||' '||vcostf);
i:=i+1; s:= s + vcost;
END LOOP;
CLOSE c;
DBMS_OUTPUT.PUT_LINE ('Cost total '||s);
END;
/
Se introduce un parametru de intrare (localitatea) si se va utiliza parcurgerea cursorului cu
instructiunea FOR I IN c LOOP.
CREATE OR REPLACE PROCEDURE sinteza_deplasari_ff (ploc varchar2) IS
CURSOR c IS SELECT angajati.cod_angajat,nume, avg(durata) as durata_medie, sum(cost_transport * durata*cost_zi) as
costuri
FROM angajati, deplasari
WHERE angajati.cod_angajat = deplasari.cod_angajat AND upper(ploc) = upper(loc_deplasare)
group by angajati.cod_angajat, nume
ORDER BY nume;
vcodf CHAR(10); vnumef CHAR(30); vdurataf CHAR(15); vcostf CHAR(25);
j NUMBER(3); s NUMBER(10);
BEGIN
DBMS_OUTPUT.PUT_LINE ('NR.CRT COD_ANGAJAT NUME ANGAJAT DURATA_MEDIE COST_DEPLASARI');
j:=1; s:=0;
FOR i IN C LOOP
vcodf := to_char(i.cod_angajat); vnumef := to_char(i.nume); vdurataf := to_char(i.durata_medie); vcostf:=
to_char(i.costuri);
DBMS_OUTPUT.PUT_LINE (j||' '||vcodf||' '||vnumef||' '||vdurataf||' '||vcostf);
j:=j+1; s:= s + i.costuri;
END LOOP;
DBMS_OUTPUT.PUT_LINE ('Cost total '||s);
END;
/
SISTEME INFORMATICE
PENTRU ASISTAREA
DECIZIILOR
PROF. UNIV. DR. MIHAELA MUNTEAN
OBIECTE DE TIP TRIGGER
Un trigger (declansatot) este o procedura PL/SQL stocata pe server, care
se execută la apariţia unui eveniment, ce modifică starea anumitor
obiecte din baza de date.
comenzi INSERT, UPDATE, DELETE pe o tabelă;
comenzi INSERT, UPDATE, DELETE pe un
view (cu opţiunea INSTEAD OF);
DECLARE
trigger_variables
BEGIN
trigger_body
END;
comanda INSERT
:OLD = NULL
:NEW = noua valoare se urmeaza a fi inserata;
comanda UPDATE
:OLD = valoarea din tabela inainte de actualizare;
:NEW = valoarea noua ce va fi preluata;
Comanda DELETE
:OLD = valoarea inainte de stergere;
:NEW = NULL
Sa se defineasca un trigger care, ori de cate ori va apare un apartament nou
in oferta imobiliarea, va afiseaza mesajul: