Download as pdf or txt
Download as pdf or txt
You are on page 1of 8

Laborator 5

FILTRARI, GRUPARI, SUBINTEROGARI, ALIAS, PROCEDURI

1. TABELELE INITIALE
Crearea tabelelor se regaseste in script.
2. INSERAREA DATELOR

Popularea tabelelor cu date se face se realizeaza


in ordinea „parinti”  „copii”.
Trebuie respectata ordinea si tipul campurilor.
BEGIN
....
Pentru a adauga datele mai rapid, instructiunile au fost
incadrate intr-o procedura.
Instructiunile se regasesc in script.
END;
/
3. EXEMPLE DE INTEROGARI PE DIVERSE TIPURI DE DATE
- Filtrarea pe camp de tip VARCHAR – este CASE SENSITIVE
SELECT empno, ename, deptno
FROM emp
WHERE ename = 'blake';
SELECT empno, ename, deptno
FROM emp
WHERE UPPER(ename) = 'BLAKE';
SELECT empno, ename, deptno
FROM emp
WHERE LOWER(ename) = 'blake';
SELECT *
FROM emp
WHERE ename LIKE 'A%' OR ename LIKE 'M%'
ORDER BY 2;
SELECT *
FROM emp
WHERE deptno IN (10,20)
ORDER BY 8;
SELECT *
FROM emp
WHERE deptno NOT IN (10,20)
ORDER BY 8;
SELECT *
FROM emp
WHERE hiredate BETWEEN TO_DATE ('01/01/1981', 'dd/mm/yyyy') AND TO_DATE('28/02/1982','dd/mm/yyyy')
ORDER BY 5;
- Implicarea in calcule a campurilor NULL
SELECT ename, job, sal, comm, sal+comm
FROM emp;
SELECT ename, job, sal, comm, sal+NVL(comm,0) AS sal_tot
FROM emp;
- Exemplu de conditie de filtrare care poate fi utilizata atat in WHERE cat si in HAVING
SELECT emp.deptno, loc,dname, COUNT(empno) AS nr_ang
FROM emp, dept
WHERE emp.deptno=dept.deptno AND emp.deptno<>10
GROUP BY emp.deptno,loc,dname
ORDER BY nr_ang DESC;
SELECT emp.deptno, loc,dname, COUNT(empno) AS nr_ang
FROM emp, dept
WHERE emp.deptno=dept.deptno
GROUP BY emp.deptno,loc,dname
HAVING emp.deptno<>10
ORDER BY 4 DESC;
SELECT emp.deptno, loc,dname, COUNT(empno) AS nr_ang
FROM emp, dept
WHERE emp.deptno=dept.deptno
GROUP BY emp.deptno,loc,dname
HAVING COUNT(empno)>5
ORDER BY nr_ang DESC;
- Utilizarea campului de legatura din tabela mai „bogata”,adica acolo unde campul acesta este cheie primara
SELECT emp.deptno, loc,dname, COUNT(empno) AS nr_ang
FROM emp, dept
WHERE emp.deptno(+)=dept.deptno
GROUP BY emp.deptno,loc,dname
ORDER BY 1;

SELECT dept.deptno, loc,dname, COUNT(empno) AS nr_ang


FROM emp, dept
WHERE emp.deptno(+)=dept.deptno
GROUP BY dept.deptno,loc,dname
ORDER BY 1;
- Rotujirea mediei atunci cand ea este afisata
SELECT loc, MIN(sal+NVL(comm,0)) AS minim, AVG(sal+NVL(comm,0)) AS medie
FROM emp,dept
WHERE emp.deptno=dept.deptno
GROUP BY loc
ORDER BY 3;
SELECT loc, MIN(sal+NVL(comm,0)) AS minim, ROUND(AVG(sal+NVL(comm,0)),2) AS medie
FROM emp,dept
WHERE emp.deptno=dept.deptno
GROUP BY loc
ORDER BY 3;
4. EXEMPLE DE SUBINTEROGARI - IN CLAUZA HAVING SAU IN CLAUZA WHERE
Selectarea departamentelor care au cel mai mic numar de angajati
SELECT dept.deptno, dname, COUNT(empno) AS Total
FROM emp INNER JOIN dept ON emp.deptno=dept.deptno
GROUP BY dept.deptno, dname
HAVING COUNT(empno)=(SELECT MIN(COUNT(empno))
FROM emp
GROUP BY deptno)
;
Calculul salariului mediu si apoi persoanele care au salariul mai mare salariul mediu, ORDONATE DESCRESCATOR
SELECT ROUND(AVG(sal+NVL(comm,0)),2) AS salariu_mediu
FROM emp;
SELECT dept.deptno,empno,ename,job,dname,sal+NVL(comm,0) AS salariu
FROM emp INNER JOIN dept ON emp.deptno=dept.deptno
WHERE sal+NVL(comm,0)>=(SELECT AVG(sal+NVL(comm,0))
FROM emp)
ORDER BY 6 DESC;
Folosirea lui RANK
SELECT dept.deptno,empno,ename,job,dname,sal+NVL(comm,0) AS salariu,
RANK() OVER(ORDER BY sal+NVL(comm,0) DESC) AS Top
FROM emp INNER JOIN dept ON emp.deptno=dept.deptno
WHERE sal+NVL(comm,0)>=(SELECT AVG(sal+NVL(comm,0))
FROM emp)
;
SELECT dept.deptno,empno,ename,job,dname,sal+NVL(comm,0) AS salariu,
RANK() OVER(ORDER BY sal+NVL(comm,0) DESC, empno) AS Top
FROM emp INNER JOIN dept ON emp.deptno=dept.deptno
WHERE sal+NVL(comm,0)>=(SELECT AVG(sal+NVL(comm,0))
FROM emp)
;
SELECT dept.deptno,empno,ename,job,dname,sal+NVL(comm,0) AS salariu,
RANK() OVER(ORDER BY sal+NVL(comm,0) DESC, empno) AS Top
FROM emp INNER JOIN dept ON emp.deptno=dept.deptno
WHERE sal+NVL(comm,0)>=(SELECT AVG(sal+NVL(comm,0))
FROM emp)
AND ROWNUM<=4
;

5. ALIASURILE („poreclele”) tabelelor

Se pot utiliza pentru a simplifica scrierea unor interogari complexe in care sunt implicate mai multe tabele
Legatura intre aliasuri si denumirea tabelelor se realizeaza O SINGURA DATA, in clauza FROM, aliasurile putand fi
utilizate oriunde in SELECT, atat inainte cat si dupa FROM
SELECT empno, ename, a.deptno, dname
FROM emp a, dept b
WHERE a.deptno=b.deptno;
Acelasi lucru cu INNER JOIN

SELECT empno, ename, a.deptno, dname


FROM emp a INNER JOIN dept b ON a.deptno=b.deptno;

Folosind aliasuri nu mai trebuie acordata atentie situatiei in care campul apare in mai multe tabele, putandu-se folosi
denumirea tabelului la fiecare camp ales in SELECT.
Acest aspect ajuta in special in instructiunele SELECT mai complexe, in care sunt implicate date din mai multe tabele.
Instructiunea de mai sus se poate scrie si astfel.
SELECT a.empno, a.ename, a.deptno, b.dname
FROM emp a INNER JOIN dept b ON a.deptno=b.deptno;

Un alt mare avantaj al utilizarii aliasurilor este posibilitatea scrierii de interogari de tip SELF JOIN adica de stabilire a
unei legaturi dintre un tabel si el insusi.

PORNIND DE LA SEMNIFICATIA INFORMATIONALA IDENTICA A COLOANELOR empno si mgr, ambele referindu-se la


codul unui persoane, vazute insa din ipostaza de angajat (codul de pe coloana empno), respectiv al managerului
caruia angajatul este subordonat (codul de pe coloana mgr), putem construi o lista a angajatilor la care putem „alipi”
datele referitoare la managerii carora le sunt subordonati.

SELECT e.empno AS ID_Angajat, e.ename AS Nume_Angajat, e.job AS Job_Angajat, e.mgr AS ID_Sef,


m.ename AS Nume_sef, m.job AS Functie_sef
FROM emp e INNER JOIN emp m ON e.mgr = m.empno;
--pentru a vedea si pe KING
SELECT e.empno AS ID_Angajat, e.ename AS Nume_Angajat, e.job AS Job_Angajat, e.mgr AS ID_Sef,
m.ename AS Nume_sef, m.job AS Functie_sef
FROM emp e LEFT JOIN emp m ON e.mgr = m.empno;
6. PROCEDURI NESTOCATE (ANONIME). PROCEDURI STOCATE.
Punctul de plecare sunt interogarile !!!!.
In exemplele din acest seminar interogarea returneaza doar o valoare sau un singur rand de valori.
SELECT e.empno AS ID_angajat, e.ename AS Nume_Angajat, e.job AS Job_Angajat,
e.mgr AS Id_Sef, m.ename AS Nume_sef, m.job AS Functie_sef
FROM emp e INNER JOIN emp m ON e.mgr = m.empno
WHERE e.mgr=7698;
- Numarul de subordonati
SELECT COUNT(e.empno) AS nrsubordonati, e.mgr AS Id_Sef, m.ename AS Nume_sef, m.job AS Functie_sef
FROM emp e INNER JOIN emp m ON e.mgr = m.empno
WHERE e.mgr=7698
GROUP BY e.mgr, m.ename, m.job;

SELECT COUNT(e.empno) AS nrsubordonati


FROM emp e INNER JOIN emp m ON e.mgr = m.empno
WHERE e.mgr=7698
GROUP BY e.mgr, m.ename, m.job;
In cazul procedurilor, afisarea trebuie activata. Instructiunea este:
SET SERVEROUTPUT ON;
OBS: Procedurile vor creste in complexitate
- Procedura nestocata, cu afisarea unei singure informatii.
DECLARE
v_nr_sbd NUMBER;
BEGIN
SELECT COUNT(e.empno) INTO v_nr_sbd
FROM emp e INNER JOIN emp m ON e.mgr = m.empno
WHERE e.mgr=7698
GROUP BY e.mgr, m.ename, m.job;
DBMS_OUTPUT.PUT_LINE ('Numarul de subordonati este '||v_nr_sbd);
END;
/
- Procedura nestocata, cu afisarea mai multor informatii.
Este necesara declararea unei variabile pentru fiecare informatie afisata.
DECLARE
v_nr_sbd NUMBER;
v_cod_mgr emp.mgr%TYPE;
v_nume_mgr emp.ename%TYPE;
v_fct_mgr emp.job%TYPE;

BEGIN
SELECT COUNT(e.empno),e.mgr,m.ename,m.job INTO v_nr_sbd,v_cod_mgr,v_nume_mgr,v_fct_mgr
FROM emp e INNER JOIN emp m ON e.mgr = m.empno
WHERE e.mgr=7698
GROUP BY e.mgr, m.ename, m.job;
DBMS_OUTPUT.PUT_LINE ('Cod manager '||v_cod_mgr);
DBMS_OUTPUT.PUT_LINE ('Nume manager '||v_nume_mgr);
DBMS_OUTPUT.PUT_LINE ('Functie manager '||v_fct_mgr);
DBMS_OUTPUT.PUT_LINE ('Numar subordonati '||v_nr_sbd);
END;
/
- Transformarea procedurii anterioare in procedura stocata.
CREATE OR REPLACE PROCEDURE afis_sbd IS
v_nr_sbd NUMBER;
v_cod_mgr emp.mgr%TYPE;
v_nume_mgr emp.ename%TYPE;
v_fct_mgr emp.job%TYPE;
BEGIN
SELECT COUNT(e.empno),e.mgr,m.ename,m.job INTO v_nr_sbd,v_cod_mgr,v_nume_mgr,v_fct_mgr
FROM emp e INNER JOIN emp m ON e.mgr = m.empno
WHERE e.mgr=7698
GROUP BY e.mgr, m.ename, m.job;
DBMS_OUTPUT.PUT_LINE ('Cod manager '||v_cod_mgr);
DBMS_OUTPUT.PUT_LINE ('Nume manager '||v_nume_mgr);
DBMS_OUTPUT.PUT_LINE ('Functie manager '||v_fct_mgr);
DBMS_OUTPUT.PUT_LINE ('Numar subordonati '||v_nr_sbd);
END;
/
Procedura se compileaza si se stocheaza iar pentru executarea ei este nevoie de instructiunea
EXECUTE afis_sbd;
- Transformarea procedurii anterioare in procedura stocata cu parametru
CREATE OR REPLACE PROCEDURE afis_sbd_p (p_cod NUMBER) IS
v_nr_sbd NUMBER;
v_cod_mgr emp.mgr%TYPE;
v_nume_mgr emp.ename%TYPE;
v_fct_mgr emp.job%TYPE;
BEGIN
SELECT COUNT(e.empno),e.mgr,m.ename,m.job INTO v_nr_sbd,v_cod_mgr,v_nume_mgr,v_fct_mgr
FROM emp e INNER JOIN emp m ON e.mgr = m.empno
WHERE e.mgr=p_cod
GROUP BY e.mgr, m.ename, m.job;
DBMS_OUTPUT.PUT_LINE ('Cod manager '||v_cod_mgr);
DBMS_OUTPUT.PUT_LINE ('Nume manager '||v_nume_mgr);
DBMS_OUTPUT.PUT_LINE ('Functie manager '||v_fct_mgr);
DBMS_OUTPUT.PUT_LINE ('Numar subordonati '||v_nr_sbd);
END;
/
Parametrul se precizeaza in denumirea procedurii iar in corpul procedurii el se poate utiliza in filtrari, calcule.

In instructiunea de executare e necesara precizarea valorii parametrului;


aceasta permite executarea procedurii pentru orice manager.

EXECUTE afis_sbd_p(7698);
EXECUTE afis_sbd_p(7566);
EXECUTE afis_sbd_p(7839);

- Transformarea procedurii anterioare pentru tratarea erorii de negasire a datelor

La comunicarea unui cod gresit, fie ca nu exista (7200), fie ca nu are functie de manager (7499) apare eroarea de
mai jos.

EXECUTE afis_sbd_p(7200);

EXECUTE afis_sbd_p(7499);

Aceasta eroare se gestioneaza in partea de EXCEPTION a procedurii.


CREATE OR REPLACE PROCEDURE afis_sbd_p_err (p_cod NUMBER) IS
v_nr_sbd NUMBER;
v_cod_mgr emp.mgr%TYPE;
v_nume_mgr emp.ename%TYPE;
v_fct_mgr emp.job%TYPE;

BEGIN
SELECT COUNT(e.empno),e.mgr,m.ename,m.job INTO v_nr_sbd,v_cod_mgr,v_nume_mgr,v_fct_mgr
FROM emp e INNER JOIN emp m ON e.mgr = m.empno
WHERE e.mgr=p_cod
GROUP BY e.mgr, m.ename, m.job;

DBMS_OUTPUT.PUT_LINE ('Cod manager '||v_cod_mgr);


DBMS_OUTPUT.PUT_LINE ('Nume manager '||v_nume_mgr);
DBMS_OUTPUT.PUT_LINE ('Functie manager '||v_fct_mgr);
DBMS_OUTPUT.PUT_LINE ('Numar subordonati '||v_nr_sbd);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE ('Angajat inexistent sau nu are functie de manager !!');

END;
/

EXECUTE afis_sbd_p_err(7839);

EXECUTE afis_sbd_p_err(7200);

EXECUTE afis_sbd_p_err(7499);

Apelarea procedurii stocate dintr-o alta procedura anonima


Nu mai apare EXECUTE

DECLARE
codpersoana NUMBER;
BEGIN
codpersoana := &dati_codul_persoanei;

afis_sbd_p_err(codpersoana);
END;
/

You might also like