Advertisement
Guest User

Untitled

a guest
May 16th, 2019
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --Creati un bloc prin care sa se adauge stoc in produse cu stoc>0
  2. BEGIN
  3. EXECUTE IMMEDIATE 'ALTER TABLE produse ADD stoc2 NUMBER CHECK (stoc2 > 0)';
  4. END;
  5.  
  6. --Creati un bloc prin care sa se adauge valori si nr de modificari
  7. SET SERVEROUTPUT ON;
  8. BEGIN
  9. UPDATE produse SET stoc2 = (CASE WHEN id_produs IN (SELECT DISTINCT id_produs FROM rand_comenzi) THEN 20 ELSE 30 END);
  10. DBMS_OUTPUT.PUT_LINE('S-au facut '||SQL%ROWCOUNT||' modificari');
  11. END;
  12.  
  13. --Sa se creeze un trigger care sa nu permita comandarea unui produs in cantitate mai mare decat stocul aferent
  14. -- IF :NEW.cantitate > 0 nu este obligatoriu, merge direct cu SELECT stoc2...
  15. CREATE OR REPLACE TRIGGER verifica_stoc
  16. BEFORE INSERT OR UPDATE ON rand_comenzi
  17. FOR EACH ROW
  18. DECLARE
  19. total NUMBER;
  20. BEGIN
  21. IF :NEW.cantitate > 0 THEN SELECT stoc2 INTO total FROM produse WHERE id_produs = :NEW.id_produs;
  22. IF :NEW.cantitate > total THEN RAISE_APPLICATION_ERROR(-20002, 'Stocul nu este suficient');
  23. ELSE UPDATE produse SET stoc2 = stoc2- :NEW.cantitate WHERE id_produs = :NEW.id_produs;
  24. END IF;
  25. END IF;
  26. END;
  27.  
  28. INSERT INTO rand_comenzi VALUES (2380,2211,42,21);
  29.  
  30. INSERT INTO rand_comenzi VALUES (2380,1910,42,19);
  31.  
  32. --Sa se creese o functie care sa returneze numarul de angajati cu salariul mai mare decat media, care fac parte din departamentul al carui id este dat ca parametru
  33. --Exceptii cazul in care nu exista departamentul precum si pe cel in care nu exista angajati in departament
  34. CREATE OR REPLACE FUNCTION sal_med (id IN departamente.id_departament%TYPE)
  35. RETURN NUMBER IS numar_ang angajati.id_angajat%TYPE;
  36. dep departamente.id_departament%TYPE;
  37. e EXCEPTION;
  38. e1 EXCEPTION;
  39. BEGIN
  40. SELECT COUNT(id_angajat) INTO numar_ang FROM angajati WHERE salariul > (SELECT AVG(salariul) FROM angajati) AND id_departament = id;
  41. SELECT COUNT(id_departament) INTO dep FROM departamente WHERE id_departament = id;
  42. IF numar_ang > 0 THEN RETURN numar_ang;
  43. ELSE RAISE e;
  44. END IF;
  45. IF dep = 0 THEN RAISE e1;
  46. END IF;
  47. EXCEPTION WHEN e1 THEN DBMS_OUTPUT.PUT_LINE('Nu exista departamentul');
  48. RETURN -1;
  49. WHEN e THEN DBMS_OUTPUT.PUT_LINE('Nu exista angajati in departament');
  50. RETURN -2;
  51. END;
  52.  
  53. BEGIN
  54. DBMS_OUTPUT.PUT_LINE(sal_med(10));
  55. END;
  56.  
  57. BEGIN
  58. DBMS_OUTPUT.PUT_LINE(sal_med(130));
  59. END;
  60.  
  61. BEGIN
  62. DBMS_OUTPUT.PUT_LINE(sal_med(500));
  63. END;
  64.  
  65. --Creati o procedura care sa afiseze informatii despre primele 3 departamente care au cei mai multi angajati cu salariul mai mare decat media
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement