Documente Academic
Documente Profesional
Documente Cultură
Laborator 5 - Cursori Expliciţi
Laborator 5 - Cursori Expliciţi
Atribute cursor
Cursori cu parametru
Cursori de tip FOR
Cursori multipli
1. Afişaţi salariul mediu al reprezentanţilor de vânzări din cadrul tabelei ANGAJATI
DECLARE
v_functie angajati.job_id%TYPE:='SA_REP';
v_salariu_mediu NUMBER(15);
BEGIN
SELECT AVG(salary) INTO v_salariu_mediu
FROM angajati
DBMS_OUTPUT.PUT_LINE(' salariul mediu pentru functia ' || v_functie || ' este '||
v_salariu_mediu);
END;
2. Afişaţi numele, prenumele şi salariul reprezentanţilor de vânzări. Se vor utiliza variabile scalare
pentru fiecare element ce trebuie afişat din cadrul fiecărei linii returnate. La finalul listei se va
afişa şi salariul lor mediu
DECLARE
CURSOR angajati_cursor IS
v_nume angajati.last_name%TYPE;
v_prenume angajati.first_name%TYPE;
v_salariu angajati.salary%TYPE;
v_salariu_mediu NUMBER(10);
BEGIN
OPEN angajati_cursor;
LOOP
END LOOP;
CLOSE angajati_cursor;
DBMS_OUTPUT.PUT_LINE('');
3. Pe exemplul anterior, testaţi toate atributele cursorului – %ISOPEN, %NOTFOUND, %FOUND,
%ROWCOUNT – în etape diferite din ciclul de viaţă al cursorului
DECLARE
CURSOR sa_rep_cursor IS
FROM angajati
v_nume angajati.last_name%TYPE;
v_prenume angajati.first_name%TYPE;
v_salariu_mediu angajati.salary%TYPE;
BEGIN
SELECT AVG(salary)
OPEN sa_rep_cursor;
END IF;
LOOP
END LOOP;
CLOSE sa_rep_cursor;
4. Rezolvaţi problema de la punctul anterior prin utilizarea variabilelor tip înregistrare
DECLARE
v_salariu_mediu employees.salary%TYPE;
CURSOR c_employees IS
SELECT *
FROM employees
v_employees c_employees%ROWTYPE;
BEGIN
OPEN c_employees;
LOOP
END LOOP;
CLOSE c_employees;
SELECT AVG(salary)
INTO v_salariu_mediu
FROM employees
DECLARE
v_functia angajati.job_id%TYPE:='SA_REP';
v_salar_mediu angajati.salary%TYPE;
CURSOR c_angajati IS
WHERE job_id=v_functia;
BEGIN
LOOP
END LOOP;
FROM angajati
WHERE job_id=v_functia;
END;
6. Dar dacă nu utilizaţi în mod explicit cursori cu nume, ci folosiţi o subinterogare?
DECLARE
v_salariu_mediu angajati.salary%TYPE;
BEGIN
SELECT AVG(salary)
LOOP
END LOOP;
END;
DECLARE
v_median_wage employees.salary%TYPE;
v_job_id employees.job_id%TYPE:='SA_REP';
WHERE job_id=p_job_id;
BEGIN
END LOOP;
SELECT AVG(salary) INTO v_median_wage FROM employees
WHERE job_id=v_job_id;
END;
8. Modificaţi exemplul anterior prin adăugarea unui nou parametru. Cel de-al doilea (p_vechime)
se referă la vechimea angajaţului la actualul loc de muncă. Astfel, va trebui să afişaţi angajaţii
ce ocupă o anumită funcţie şi au vechime de cel mult valoarea lui p_vechime (ex. 7 ani)
DECLARE
FROM angajati
salariu_mediu NUMBER(8,2);
v_first_name angajati.first_name%TYPE;
v_last_name angajati.last_name%TYPE;
v_salary angajati.salary%TYPE;
BEGIN
SELECT AVG(SALARY)
INTO salariu_mediu
FROM angajati
LOOP
DBMS_OUTPUT.PUT_LINE('Angajatul ' || v_first_name || ' ' || v_last_name || ' are un salariu de ' ||
v_salary || ', media este de: ' || salariu_mediu || ' si ocupa functia de ' || v_function );
END LOOP;
CLOSE rep_vanzari;
9. Cu ajutorul unui cursor multiplu se va parcurge tabela pentru fiecare funcţie, iar în cadrul
acesteia angajaţii vor fi afişaţi alfabetic după nume, apoi prenume. Începutul unei noi funcţii va fi
marcat vizual corespunzător, la finalul fiecăreia apărând informaţii statistice precum salariul
mediu lunar şi fondul de salarii lunar al fiecărei funcţii. Funcţiile vor fi trecute în ordine alfabetică
DECLARE
CURSOR fct_cursor IS select distinct job_id from angajati order by 1;
CURSOR ang_cursor (p_functie VARCHAR2) IS select * from angajati order by last_name,
first_name;
v_sal NUMBER(9,2);
v_nr INT;
BEGIN
FOR v_fct IN fct_cursor
LOOP
DBMS_OUTPUT.PUT_LINE('---'||v_fct.job_id);
v_nr:=0;
v_sal:=0;
FOR v_ang in ang_cursor(v_fct.job_id)
LOOP
v_nr:=v_nr+1;
v_sal:=v_sal+v_ang.salary;
DBMS_OUTPUT.PUT_LINE(v_nr||'. '||v_ang.last_name || ' '|| v_ang.first_name||': '||
v_ang.salary);
END LOOP;
DBMS_OUTPUT.PUT_LINE('Salariu mediu: '||ROUND(v_sal/v_nr,2));
END LOOP;
END;
10. Realizaţi un cursor care să permită scădere cu 5% a salariului vânzătorilor, inclusiv a şefului
lor. Rezolvarea trebuie să ţină cont că e posibil să interacţioneze operaţiunile mai multor
utilizatori asupra aceluiaşi set de date. În caz de concurenţă se va aştepta 5 secunde.
DECLARE
v_salary angajati.salary%TYPE;
CURSOR sal_cursor IS
SELECT salary FROM angajati
BEGIN
OPEN sal_cursor;
LOOP
END LOOP;
CLOSE sal_cursor;
END;
DECLARE
CURSOR vanzatori_cursor IS
rec_vanzatori vanzatori_cursor%ROWTYPE;
BEGIN
OPEN vanzatori_cursor;
LOOP
END LOOP;
CLOSE vanzatori_cursor;
END;