Professional Documents
Culture Documents
Lab 05
Lab 05
1. TABELELE INITIALE
Crearea tabelelor se regaseste in script.
2. INSERAREA DATELOR
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
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.
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.
EXECUTE afis_sbd_p(7698);
EXECUTE afis_sbd_p(7566);
EXECUTE afis_sbd_p(7839);
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);
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;
END;
/
EXECUTE afis_sbd_p_err(7839);
EXECUTE afis_sbd_p_err(7200);
EXECUTE afis_sbd_p_err(7499);
DECLARE
codpersoana NUMBER;
BEGIN
codpersoana := &dati_codul_persoanei;
afis_sbd_p_err(codpersoana);
END;
/