Advertisement
Guest User

tema3SQL

a guest
Oct 25th, 2018
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. A
  2. Creati o noua tabela, SPION, cu o coloana numerica (pentru care definiti o secventa) si o
  3. coloana text.
  4. Creati diversi declansatori pentru cele patru posibilitati urmatoare: Declansator inainte
  5. nivel comanda, declansator inainte nivel linie, declansator dupa nivel comanda, declansator
  6. dupa nivel linie; ei vor inregistra IN tabela SPION numarul urmator generat de secventa,
  7. precum si textul potrivit situatiei: " inainte nivel comanda ", " inainte nivel linie ", " dupa
  8. nivel comanda ", " dupa nivel linie ".
  9. Creati un script cu instrutiuni LMD care prodvoaca declansarea acestor declansatori si, IN
  10. acelasi timp, inregistrati IN tabela SPION.
  11. Analizati continutul tabelei SPION.
  12. CREATE TABLE SPION (
  13. id NUMBER,
  14. comentariu VARCHAR2);
  15.  
  16.  
  17. CREATE SEQUENCE spion_sq
  18. MINVALUE 1
  19. START WITH 1
  20. INCREMENT BY 1;
  21.  
  22. CREATE OR REPLACE TRIGGER spion_trigger_before
  23. before INSERT OR UPDATE OR DELETE ON emp
  24. BEGIN
  25.     INSERT INTO spion VALUES(spion_sq.NEXTVAL,'inainte nivel comanda');
  26. END;
  27.  
  28. CREATE OR REPLACE TRIGGER spion_trigger_before_niv_linie
  29. before INSERT OR UPDATE OR DELETE ON emp FOR each ROW
  30. BEGIN
  31.     INSERT INTO spion VALUES(spion_sq.NEXTVAL,'inainte nivel linie');
  32. END;
  33. CREATE OR REPLACE TRIGGER spion_trigger_after
  34. after INSERT OR UPDATE OR DELETE ON emp
  35. BEGIN
  36.     INSERT INTO spion VALUES(spion_sq.NEXTVAL,'dupa nivel comanda');
  37. END;
  38.  
  39. CREATE OR REPLACE TRIGGER spion_trigger_after_niv_linie
  40. after INSERT OR UPDATE OR DELETE ON emp FOR each ROW
  41. BEGIN
  42.     INSERT INTO spion VALUES(spion_sq.NEXTVAL,'dupa nivel linie');
  43. END;
  44.  
  45. B
  46. Creati un declansator care semnaleaza momentul cand se inregistreaza un comision pentru
  47. un angajat care nu este "salesman".
  48.  
  49. CREATE OR REPLACE TRIGGER com_salesman
  50. before INSERT OR UPDATE ON emp FOR each ROW
  51. WHEN (NEW.comm IS NOT NULL AND UPPER(old.job) <> 'SALESMAN')
  52. BEGIN
  53.   dbms_output.put_line('se va inregistra un nou comision pentru un angajat de tip salesman');
  54. END;
  55.  
  56. C
  57. Creaţi o procedură PL/SQL pentru calcularea şi afişarea sumei salariilor la un departament,
  58. al cărui nume este citit de la tastatură. Lansaţi procedura sub SQLPlus.
  59.  
  60. CREATE OR REPLACE PROCEDURE sum_ang_dep IS
  61. v_nume emp.ename%TYPE:=&name;
  62. v_sal emp.sal%TYPE;
  63. BEGIN
  64.     SELECT SUM(e.sal) INTO v_sal FROM emp e inner join dept d ON e.deptno = d.deptno WHERE d.dname=v_nume GROUP BY d.deptno;
  65.     dbms_output.put_line('suma salariilor de la departamenul '||v_nume||' este '||v_sal);
  66. END;
  67.  
  68. D
  69. Creaţi un bloc PL/SQL pentru afişarea sumei salariilor la un departament, al cărui nume
  70. este citit de la tastatură. Utilizaţi pentru acest calcul, o funcţie definită local, la nivelul
  71. blocului.
  72. DECLARE
  73.   v_nume dept.dname%TYPE :=&name;
  74.   v_sal  emp.sal%TYPE;
  75.   FUNCTION fnc_sum_sal_dep(nume IN emp.ename%TYPE) RETURN emp.sal%TYPE AS
  76.     sal emp.sal%TYPE;
  77.   BEGIN
  78.     SELECT SUM(sal)
  79.       INTO sal
  80.       FROM emp e
  81.      inner join dept d
  82.         ON e.deptno = d.deptno
  83.      WHERE d.dname = v_nume
  84.      GROUP BY d.deptno;
  85.     RETURN sal;
  86.   END fnc_sum_sal_dep;
  87. BEGIN
  88.   dbms_output.put_line('suma salariilor de la departamenul ' || v_nume ||
  89.                        ' este ' || fnc_sum_sal_dep(v_nume));
  90. END;
  91.  
  92.  
  93.  
  94. E
  95. Creaţi un bloc PL/SQL pentru afişarea celui mai mic salariu mediu înre două departamente
  96. ale căror nume sunt citite de la tastatură. Utilizaţi pentru calculul salariului mediu o funcţie
  97. definită local, la nivelul blocului.
  98. DECLARE
  99.   v_dept1 dept.dname%TYPE := &dept1;
  100.   v_sal1  emp.sal%TYPE;
  101.   v_sal2  emp.sal%TYPE;
  102.   v_dept2 dept.dname%TYPE := &dept2;
  103.   FUNCTION fnc_sal_med(dept IN dept.dname%TYPE) RETURN emp.sal%TYPE AS
  104.     sal emp.sal%TYPE;
  105.   BEGIN
  106.     SELECT AVG(e.sal)
  107.       INTO sal
  108.       FROM emp e
  109.      inner join dept d
  110.         ON e.deptno = d.deptno
  111.      WHERE d.dname = dept
  112.      GROUP BY d.deptno;
  113.     RETURN sal;
  114.   END fnc_sal_med;
  115. BEGIN
  116.   v_sal1 := fnc_sal_med(v_dept1);
  117.   v_sal2 := fnc_sal_med(v_dept2);
  118.   IF (v_sal1 < v_sal2) THEN
  119.     dbms_output.put_line(v_dept1 || ' ' || v_sal1);
  120.   ELSE
  121.     dbms_output.put_line(v_dept2 || ' ' || v_sal2);
  122.   END IF;
  123. END;
  124.  
  125. F
  126. Repetaţi problema precedentă, utilizând IN loc de funcţie, o procedură care transmite
  127. rezultatul printr-un parametru de ieşire.
  128. DECLARE
  129.     v_dept1 dept.dname%TYPE:='SALES';
  130.     v_sal1 emp.sal%TYPE;
  131.     v_sal2 emp.sal%TYPE;
  132.     v_dept2 dept.dname%TYPE:='ACCOUNTING';
  133.     PROCEDURE proc_sum_sal_med(dept IN dept.dname%TYPE, sal OUT emp.sal%TYPE) AS
  134.     BEGIN
  135.         SELECT AVG(e.sal) INTO sal FROM emp e inner join dept d ON e.deptno = d.deptno WHERE d.dname=dept GROUP BY d.deptno;
  136.     END proc_sum_sal_med;
  137. BEGIN
  138.     proc_sum_sal_med(v_dept1,v_sal1);
  139.     proc_sum_sal_med(v_dept2,v_sal2);
  140.     IF(v_sal1<v_sal2) THEN
  141.         dbms_output.put_line(v_dept1||' '||v_sal1);
  142.     ELSE
  143.         dbms_output.put_line(v_dept2||' '||v_sal2);
  144.     END IF;
  145. END;
  146.  
  147. G
  148. Craţi un bloc PL/SQL pentru afişarea angajaţilor cu salariul superior salariului mediu din
  149. departamentul lor. Utilizaţi pentru calculul salariului mediu o funcţie definită local, la
  150. nivelul blocului.
  151.  
  152. DECLARE
  153.   v_sal emp.sal%TYPE;
  154.   CURSOR dept_cursor IS
  155.     SELECT * FROM dept;
  156.   CURSOR ang_curso(v_sal emp.sal%TYPE, v_deptno emp.deptno%TYPE) IS
  157.     SELECT * FROM emp WHERE sal > v_sal AND deptno = v_deptno;
  158.   FUNCTION fnc_sal_med(dept IN dept.deptno%TYPE) RETURN emp.sal%TYPE AS
  159.     sal emp.sal%TYPE;
  160.   BEGIN
  161.     SELECT AVG(e.sal) INTO sal FROM emp e WHERE e.deptno = dept;
  162.     RETURN sal;
  163.   END fnc_sal_med;
  164. BEGIN
  165.   FOR v_dept IN dept_cursor LOOP
  166.     v_sal := fnc_sal_med(v_dept.deptno);
  167.     dbms_output.put_line('departament: '||v_dept.dname||' sal: '||v_sal);
  168.     FOR ang IN ang_curso(v_sal,v_dept.deptno) LOOP
  169.          dbms_output.put_line(ang.ename||' '||ang.sal);
  170.     END LOOP;
  171.   END LOOP;
  172. END;
  173.  
  174. H
  175. Repetaţi problema precedentă, utilizând IN loc de funcţie, o procedură care transmite
  176. rezultatul printr-un parametru de ieşire.
  177.  
  178. DECLARE
  179.   v_sal emp.sal%TYPE;
  180.   CURSOR dept_cursor IS
  181.     SELECT * FROM dept;
  182.   CURSOR ang_curso(v_sal emp.sal%TYPE, v_deptno emp.deptno%TYPE) IS
  183.     SELECT * FROM emp WHERE sal > v_sal AND deptno = v_deptno;
  184.   PROCEDURE proc_sal_med(dept IN dept.deptno%TYPE, sal OUT emp.sal%TYPE) AS
  185.     BEGIN
  186.         SELECT AVG(e.sal) INTO sal FROM emp e WHERE e.deptno=dept;
  187.     END proc_sal_med;
  188. BEGIN
  189.   FOR v_dept IN dept_cursor LOOP
  190.     proc_sal_med(v_dept.deptno,v_sal);
  191.     dbms_output.put_line('departament: '||v_dept.dname||' sal: '||v_sal);
  192.     FOR ang IN ang_curso(v_sal,v_dept.deptno) LOOP
  193.          dbms_output.put_line(ang.ename||' '||ang.sal);
  194.     END LOOP;
  195.   END LOOP;
  196. END;
  197.  
  198. I
  199. Creaţi o funcţie PL/SQL pentru calculul salariului mediu a tuturor angajaţilor şi apoi, cu o
  200. comandă SQL, afişaţi TOţi angajaţii care au salariul mai mic decât media.
  201.  
  202. CREATE OR REPLACE FUNCTION sal_med_ang RETURN emp.sal%TYPE IS
  203.     v_sal emp.sal%TYPE;
  204. BEGIN
  205.     SELECT AVG(sal) INTO v_sal FROM emp;
  206.     RETURN v_sal;
  207. END;
  208. SELECT * FROM emp WHERE sal<sal_med_ang();
  209. J
  210. Creaţi un pachet pentru gestiunea angajaţilor, cu următoarele posibilităţi:
  211. - o funcţie care controlează existenţa unui angajat în tabela emp, plecând de la codul lui
  212. - o procedură de eliminare a unui angajat
  213. - o procedură cu doi parametri care măreşte salariul unui angajat (prevedeţi o excepţie
  214. pentru absenţa angajatului şi pentru valoarea 0 a sumei cu care se măreşte salariul; în acest
  215. caz, angajatul va primi salariul mediu).
  216. Creaţi un script pentru validarea acestor subprograme.
  217.  
  218. CREATE OR REPLACE PACKAGE gest_ang IS
  219.     FUNCTION exist_emp(v_empno_param emp.empno%TYPE) RETURN VARCHAR2;
  220.     PROCEDURE delete_emp(v_empno emp.empno%TYPE);
  221.     PROCEDURE encrase_sal(v_empno emp.empno%TYPE, v_marire NUMBER);
  222. END gest_ang;
  223.  
  224. CREATE OR REPLACE PACKAGE BODY gest_ang IS
  225.  
  226.   FUNCTION exist_emp(v_empno_param emp.empno%TYPE) RETURN VARCHAR2 IS
  227.         v_empno emp.empno%TYPE;
  228.     BEGIN
  229.         SELECT empno INTO v_empno FROM emp WHERE empno=v_empno_param;
  230.     dbms_output.put_line('v_empno =['||v_empno||']');
  231.         IF SQL%ROWCOUNT = 0 THEN
  232.             RETURN 'Angajatul nu exista!';
  233.         ELSE
  234.             RETURN 'Angajatul exista!';
  235.         END IF;
  236.     END exist_emp;
  237.    
  238.     PROCEDURE delete_emp(v_empno emp.empno%TYPE) IS
  239.     BEGIN
  240.         DELETE FROM emp WHERE empno=v_empno;
  241.     EXCEPTION
  242.         WHEN OTHERS THEN   
  243.             dbms_output.put_line('A aparut o eroare in timpul executiei!');
  244.     END;
  245.    
  246.   PROCEDURE encrase_sal(v_empno emp.empno%TYPE, v_marire NUMBER) IS
  247.     e_ang_not_found EXCEPTION;
  248.     v_emp emp%ROWTYPE;
  249.     v_marire_sal NUMBER :=v_marire;
  250.   BEGIN
  251.     SELECT * INTO v_emp FROM emp WHERE empno=v_empno;
  252.     IF SQL%ROWCOUNT = 0 THEN
  253.       RAISE e_ang_not_found;
  254.     END IF;
  255.     IF(v_marire = 0) THEN
  256.       SELECT AVG(sal) INTO v_marire_sal FROM emp;
  257.     END IF;
  258.     UPDATE emp SET sal=(sal + v_marire_sal) WHERE empno=v_empno;
  259.   EXCEPTION
  260.     WHEN e_ang_not_found THEN
  261.       dbms_output.put_line('nu exista angajatul cu codul '||v_empno);
  262.     WHEN OTHERS THEN
  263.       dbms_output.put_line('a aparut o eroare in timpul executiei');
  264.   END;
  265. END gest_ang;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement