Advertisement
Guest User

Untitled

a guest
Apr 18th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 2.74 KB | None | 0 0
  1. --sa se creeze un trigger care sa se declanseze inainte de modificarea salariului unui angajat si care sa afiseze un mesaj
  2. SET SERVEROUTPUT ON
  3. CREATE OR REPLACE TRIGGER modificare_salariu
  4. BEFORE UPDATE OF salariul ON angajati
  5. BEGIN
  6.     DBMS_OUTPUT.PUT_LINE('OK');
  7. END;
  8.  
  9. UPDATE angajati
  10. SET salariul = salariul-100
  11. WHERE id_departament = 80;
  12.  
  13. --sa se creeze un trigger care sa se declanseze inainte de modificarea salariului unui angajat si care sa afiseze un mesaj
  14. CREATE OR REPLACE TRIGGER modificare_salariu
  15. BEFORE UPDATE OF salariul ON angajati
  16. FOR EACH ROW
  17. BEGIN
  18.     DBMS_OUTPUT.PUT_LINE(:OLD.salariul||' '||:NEW.salariul);
  19. END;
  20.  
  21. UPDATE angajati
  22. SET salariul = salariul-100
  23. WHERE id_departament = 80;
  24.  
  25. --sa se construiasca un trigger care sa se declanseze in momentul adaugarii unui angajat nou sau la modificarea salariului unui angajat existent
  26. --si care sa impiedice specificarea unui salariu care nu se afla in limitele indicate de sal_min & sal_max din tabela functii
  27. CREATE OR REPLACE TRIGGER adauga_ang
  28. BEFORE UPDATE OF salariul OR INSERT ON angajati
  29. FOR EACH ROW
  30. DECLARE
  31. v_sal_min functii.salariu_min%TYPE;
  32. v_sal_max functii.salariu_max%TYPE;
  33. BEGIN
  34. SELECT salariu_min, salariu_max INTO v_sal_min, v_sal_max FROM functii WHERE id_functie = :NEW.id_functie;
  35. IF :NEW.salariul NOT BETWEEN v_sal_min AND v_sal_max
  36. THEN RAISE_APPLICATION_ERROR(-20001, 'out of range!');
  37. END IF;
  38. END;
  39.  
  40. UPDATE angajati
  41. SET salariul = salariul+100000
  42. WHERE id_angajat = 100;
  43.  
  44. --sa se construiasca un trgger care sa se declanseze doar atunci cand se incearca marirea salariului unui angajat cu o vechime mai mica de 20 de ani
  45. CREATE OR REPLACE TRIGGER respecta_vechimea
  46. BEFORE UPDATE OF salariul ON angajati
  47. FOR EACH ROW
  48.  
  49. BEGIN
  50. IF :NEW.salariul > :OLD.salariul AND (SYSDATE- :NEW.data_angajare)/365 > 10
  51. THEN RAISE_APPLICATION_ERROR(-20002, 'Angajatul are o vechime mai mare de 20 de ani!');
  52. END IF;
  53. END;
  54.  
  55.  
  56. UPDATE angajati
  57. SET salariul = salariul-100
  58. WHERE id_angajat = 100;
  59.  
  60. --construiti un trigger prin care: in momentul modificarii functiei unui angajat se va adauga automat o inregistrare niua in tabela istoric_functii
  61.     --daca angajatul nu si-a mai schimbat functia anterior, data de inceput pt. functia noua va fi data angajarii, iar cea de sfarsit, data curenta
  62.     --daca angajatul si-a mai schimbat functia in trecut, data de inceput va fi ultima data de sfarsit pentru o functie detinuta anterior
  63. --in momentul stergerii unui angajat, se vor sterge toate referirile despre angajat din tabela istoric functii
  64.  
  65. CREATE OR REPLACE TRIGGER update_istoric_functii
  66. AFTER UPDATE OF id_functie OR DELETE ON angajati
  67. FOR EACH ROW
  68. DECLARE
  69. nr NUMBER;
  70. BEGIN
  71.     SELECT COUNT(id_angajat) INTO nr FROM istoric_functii WHERE id_angajat = :NEW.id_angajat
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement