Documente Academic
Documente Profesional
Documente Cultură
BEGIN
p1(700, 'Aly' , 'aly@k.ro', SYSDATE, 'economist');
END;
/
SELECT employee_id, last_name, email, hire_date, job_id
FROM emp_***;
ROLLBACK;
2. Să se creeze o procedură stocată care măreşte salariile angajaţilor ce îşi desfăşoară activitatea în
departamentul 10 cu o valoare dată ca parametru (procedură stocată cu parametru de tip IN).
SET SERVEROUTPUT ON
CREATE OR REPLACE PROCEDURE p2_***(val IN NUMBER)
AS
BEGIN
UPDATE emp_***
SET salary=salary+val
WHERE department_id=10;
END;
/
SELECT salary FROM emp_*** WHERE department_id=10;
EXECUTE p2_***(1000);
SELECT salary FROM emp_*** WHERE department_id=10;
ROLLBACK;
3. Să se creeze o procedură stocată care calculează salariul maxim al angajaţilor (procedură
stocată cu parametru de tip OUT).
CREATE OR REPLACE PROCEDURE p3_*** (sal OUT employees.salary%TYPE)
AS
BEGIN
SELECT MAX(salary)
INTO sal
FROM employees;
END;
/
VARIABLE val NUMBER
EXECUTE p3_*** (:val)
PRINT val
4. Să se creeze o procedură stocată care primeşte printr-un parametru codul unui angajat şi
returnează prin intermediul aceluiaşi parametru codul managerului corespunzător acelui angajat
(procedură stocată cu parametru de tip IN OUT).
VARIABLE ang_man NUMBER
BEGIN
:ang_man:=200;
END;
/
PRINT ang_man
CREATE OR REPLACE PROCEDURE p4_*** (nr IN OUT NUMBER)
IS
BEGIN
SELECT manager_id
INTO nr
FROM employees
WHERE employee_id=nr;
END;
/
EXECUTE p4_*** (:ang_man)
PRINT ang_man
5. Să se creeze o funcţie stocată care determină numărul de salariaţi din employees angajaţi în
2000, într-un departament dat ca parametru. Să se apeleze această funcţie:
a. printr-o variabilă de legătură;
b. folosind comanda CALL;
c. printr-o comandă SELECT;
d. într-un bloc PL/SQL.
FUNCTION nr_mgr
RETURN NUMBER IS
v_numar NUMBER(3);
BEGIN
SELECT COUNT(DISTINCT manager_id)INTO v_numar
FROM employees
WHERE department_id = v_dept;
RETURN v_numar;
END nr_mgr;
BEGIN
DBMS_OUTPUT.PUT_LINE('Nr sal din '||v_dept||' este '|| nr_sal);
DBMS_OUTPUT.PUT_LINE('Nr man din '||v_dept||' este '|| nr_mgr);
END;
/
EXECUTE p6_***(80);
7. Să se calculeze recursiv factorialul unui număr dat (recursivitate).
CREATE OR REPLACE FUNCTION factorial_***(n NUMBER)
RETURN INTEGER IS
BEGIN
IF (n=0) THEN
RETURN 1;
ELSE
RETURN n*factorial_***(n-1);
END IF;
END factorial_***;
/
VARIABLE nr NUMBER
EXECUTE :nr := factorial_***(3);
PRINT nr
8. Să se afişeze numele şi salariul angajaţilor al căror salariu este mai mare decât media tuturor
salariilor din tabelul employees.
CREATE OR REPLACE FUNCTION medie_***
RETURN NUMBER IS
rezultat NUMBER;
BEGIN
SELECT AVG(salary)
INTO rezultat
FROM employees;
RETURN rezultat;
END;
/
SELECT last_name,salary
FROM employees
WHERE salary >= medie_***;
Exerciţii
1. Să se creeze o procedură stocată care măreşte salariile angajaţilor care nu au comision din
tabelul emp_*** cu o valoare dată ca parametru.
2. Să se declare o procedură locală prin care să se introducă în tabelul dept_*** o nouă înregistrare.
3. Să se creeze o funcţie stocată care determină numărul de salariaţi care au fost angajaţi după un
salariat al cărui cod este dat ca parametru. Să se apeleze această funcţie într-un bloc PL/SQL.
4. Să se creeze o procedură stocată care pentru un anumită grilă de salarizare (dată ca parametru)
calculează prin intermediul unor funcţii locale numărul de salariaţi care au salariul în grila
respectivă şi media salariilor câştigate de aceştia.
6. Scrieţi o funcţie care să întoarcă, pentru un angajat dat prin id-ul său, comisionul exprimat în $.
Utilizaţi apoi această funcţie într-o comandă SELECT care să întoarcă numele angajaţilor, salariul şi
comisionul în $ al fiecăruia.