Advertisement
Guest User

Ex sgbd

a guest
Feb 17th, 2018
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 6.68 KB | None | 0 0
  1. -- Exercitiul 1
  2. SET serveroutput ON;
  3. CLEAR screen;
  4. accept p_valn PROMPT 'n=';
  5. <<mainblock>>
  6. DECLARE
  7.   v_valn NUMBER := &p_valn;
  8.  
  9.   CURSOR myc(pcn NUMBER) IS
  10.     SELECT *
  11.     FROM employees
  12.     WHERE salary > v_valn;
  13.  
  14. BEGIN
  15.  
  16.   DBMS_OUTPUT.put_line('Ati introdus n=' || v_valn);  
  17.  
  18.   FOR j IN myc(v_valn) LOOP
  19.     IF (j.commission_pct IS NOT NULL OR j.commission_pct > 0) THEN
  20.       DBMS_OUTPUT.put_line(j.last_name || '->' || j.salary);
  21.     END IF;
  22.   END LOOP;
  23. END;
  24.  
  25. -- Exercitiul 2
  26. -- crearea tip de date tablou imbricat
  27. CREATE OR REPLACE TYPE mytabimbri AS TABLE OF NUMBER;
  28.  
  29. -- bloc pentru populare si afisare
  30. SET serveroutput ON;
  31. CLEAR screen;
  32. <<mainblock>>
  33. DECLARE
  34.  
  35.   TYPE mytabidx IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
  36.   v_tabidx mytabidx;                     -- nu are nevoie de ctor
  37.  
  38.   v_tabimbri mytabimbri := mytabimbri(); -- necesita un ctor
  39.   v_idx NUMBER := 0;
  40.   v_aux NUMBER := 0;
  41. BEGIN
  42.  
  43.   -- umplere
  44.   FOR j IN 1..100 LOOP
  45.     v_tabimbri.EXTEND;
  46.     v_tabimbri(v_tabimbri.LAST) := j;
  47.   END LOOP;
  48.  
  49.   -- stergere impare
  50.   v_idx :=  v_tabimbri.FIRST;
  51.   WHILE (v_idx IS NOT NULL) LOOP
  52.     IF v_idx MOD 2 <> 0 THEN
  53.       v_aux := v_idx;
  54.       v_tabimbri.DELETE(v_aux);
  55.     END IF;
  56.     v_idx := v_tabimbri.NEXT(v_idx);
  57.   END LOOP;
  58.  
  59.   -- afisare tablou nested
  60.   DBMS_OUTPUT.put_line('Afisare tablou imbricat');
  61.   v_idx :=  v_tabimbri.FIRST;
  62.   WHILE (v_idx IS NOT NULL) LOOP
  63.       v_tabidx(v_idx) := v_idx;
  64.       DBMS_OUTPUT.put_line(v_idx || ') ' || v_tabimbri.NEXT(v_idx));
  65.       v_idx := v_tabimbri.NEXT(v_idx);
  66.   END LOOP;
  67.  
  68.   -- afisare tablou indexat in ordine inversa
  69.   DBMS_OUTPUT.put_line('Afisare inversa tablou indexat');
  70.   v_idx :=  v_tabidx.LAST;
  71.   WHILE (v_idx IS NOT NULL) LOOP
  72.       DBMS_OUTPUT.put_line(v_idx || ') ' || v_tabidx.NEXT(v_idx));
  73.       v_idx := v_tabidx.PRIOR(v_idx);
  74.   END LOOP;
  75. END;
  76.  
  77. -- Exercitiul 3
  78. CREATE OR REPLACE PROCEDURE myprocrm(p_in_out IN OUT NUMBER) IS
  79.   v_in_param NUMBER := 0;
  80.  
  81.   -- praguri salariale
  82.   c_liminf CONSTANT NUMBER := 3000;
  83.   c_limsup CONSTANT NUMBER := 7000;
  84.  
  85.   -- coeficienti de marire al salariului (20%,15%,10%)
  86.   c_k1 CONSTANT NUMBER := 1.2;
  87.   c_k2 CONSTANT NUMBER := 1.15;
  88.   c_k3 CONSTANT NUMBER := 1.10;
  89.   c_v4 CONSTANT NUMBER := 1000;   -- valoare fixa salariu
  90.  
  91.   v_valid  NUMBER := 0;
  92.   v_sal    NUMBER := 0;
  93.   v_newsal NUMBER := 0;
  94. BEGIN
  95.  
  96.   v_in_param := p_in_out;       -- copie pt val parametrului la input just to be sure
  97.   IF v_in_param IS NULL THEN
  98.     DBMS_OUTPUT.put_line('Parametru de intrare invalid');
  99.     RETURN;
  100.   END IF;
  101.  
  102.   -- verific daca angajatul cu codul specificat exista
  103.   SELECT COUNT(*) INTO v_valid
  104.   FROM employees
  105.   WHERE employee_id = v_in_param;
  106.   IF v_valid = 0 THEN
  107.     DBMS_OUTPUT.put_line('Codul angajatului nu exista');
  108.     RETURN;
  109.   END IF;
  110.  
  111.   SELECT salary INTO v_sal
  112.   FROM employees
  113.   WHERE employee_id = v_in_param;
  114.  
  115.   -- calculare salariu nou
  116.   CASE
  117.     WHEN v_sal < c_liminf THEN
  118.       v_newsal := v_sal * c_k1;   -- 20%
  119.     WHEN v_sal BETWEEN c_liminf AND c_limsup THEN
  120.       v_newsal := v_sal * c_k2;  -- 15%
  121.     WHEN v_sal > c_limsup THEN
  122.       v_newsal := v_sal * c_k3;  -- 10%
  123.     WHEN v_sal IS NULL THEN
  124.       v_newsal := c_v4;          -- hardcoded
  125.   END CASE;
  126.  
  127.   -- salvarea date in parametrul de intrare iesire
  128.   p_in_out := v_newsal;
  129.  
  130.   --dbms_output.put_line('Valoarea veche a salariului este ' || v_sal);
  131.   --dbms_output.put_line('Valoarea noua  a salariului este ' || v_newsal);
  132.  
  133. END myprocrm;
  134.  
  135. -- apelarea procedurii create dintr-un bloc
  136. SET serveroutput ON;
  137. CLEAR screen;
  138. <<mainblock>>
  139. DECLARE
  140.   v_param NUMBER := 100;  
  141. BEGIN
  142.   DBMS_OUTPUT.put_line('Angajatul cu codul ' || v_param || ' are ');
  143.   myprocrm(v_param);
  144.   DBMS_OUTPUT.put_line('valoarea noua a salariului : ' || v_param);
  145. END;
  146.  
  147. -- Exercitiul 4
  148. /* Abordarea ar consta in crearea unui trigger la nivel de linie pe tabelul
  149. employees pe insertie sau update de salariu de tip BEFORE care sa modifice dinamic valorile
  150. in functie de ce regaseste in tabelul jobs pe maxim si minim */
  151. CREATE OR REPLACE
  152. TRIGGER mytrg
  153. BEFORE INSERT OR UPDATE OF salary, job_id
  154. ON employees
  155. FOR EACH ROW
  156. DECLARE
  157.   v_job_id jobs.job_id%TYPE;
  158.  
  159.   v_sal_inserat NUMBER := 0;
  160.   v_minsal NUMBER := 0;
  161.   v_maxsal NUMBER := 0;
  162. BEGIN
  163.  
  164.   -- pp: avand un FK pe job_id -> job_id-ul va fi mereu valid
  165.  
  166.   IF inserting THEN
  167.     SELECT min_salary, max_salary INTO v_minsal, v_maxsal
  168.     FROM jobs
  169.     WHERE job_id = :NEW.job_id;
  170.    
  171.     DBMS_OUTPUT.put_line('Slariul min:'|| v_minsal);
  172.     DBMS_OUTPUT.put_line('Slariul max:'|| v_maxsal);
  173.  
  174.     -- asiguram limitele corespunzatoare
  175.     v_sal_inserat := GREATEST(v_minsal, :NEW.salary);
  176.     v_sal_inserat := LEAST(v_maxsal, v_sal_inserat);
  177.    
  178.     DBMS_OUTPUT.put_line('Salariul nou este ' ||  v_sal_inserat);
  179.    
  180.     -- teoretic in acet moment salariul pentru noua linie inserata se afla
  181.     -- intre limitele intervalului.
  182.     :NEW.salary := v_sal_inserat;
  183.   ELSIF updating('salary') THEN
  184.     SELECT NVL(min_salary, 0), NVL(max_salary, 0) INTO v_minsal, v_maxsal
  185.     FROM jobs
  186.     WHERE job_id = :OLD.job_id;   -- singura diferenta practica fata de mai sus
  187.                                      -- din moment ce in acest job_id-ul este cel vechi
  188.    
  189.     -- asiguram limitele corespunzatoare
  190.     v_sal_inserat := GREATEST(v_minsal, :NEW.salary);
  191.     v_sal_inserat := LEAST(v_maxsal, v_sal_inserat);
  192.    
  193.     DBMS_OUTPUT.put_line('Salariul nou este ' ||  v_sal_inserat);
  194.    
  195.     -- teoretic in acet moment salariul pentru noua linie inserata se afla
  196.     -- intre limitele intervalului.
  197.     :NEW.salary := v_sal_inserat;
  198.   ELSIF updating('job_id') THEN
  199.     -- extrage limite pentru noul job_id
  200.     SELECT NVL(min_salary, 0), NVL(max_salary, 0) INTO v_minsal, v_maxsal
  201.     FROM jobs
  202.     WHERE job_id = :NEW.job_id;
  203.    
  204.     -- asiguram limitele corespunzatoare
  205.     v_sal_inserat := GREATEST(v_minsal, :NEW.salary);
  206.     v_sal_inserat := LEAST(v_maxsal, v_sal_inserat);
  207.    
  208.     DBMS_OUTPUT.put_line('Salariul nou este ' ||  v_sal_inserat);
  209.    
  210.     -- teoretic in acet moment salariul pentru noua linie inserata se afla
  211.     -- intre limitele intervalului.
  212.     :NEW.salary := v_sal_inserat;
  213.   END IF;
  214. END;
  215.  
  216. -- testare pe insertie (teoretic ar trebui sa functioneze si pe update...)
  217. INSERT INTO
  218. employees
  219. VALUES(500, 'RR', 'MM', 'rr0@mm', '123456789', SYSDATE, 'SH_CLERK', 50000, 0.1, 100, 50);
  220. INSERT INTO
  221. employees
  222. VALUES(501, 'RR', 'MM', 'rr1@mm', '123456789', SYSDATE, 'SH_CLERK', 2000, 0.1, 100, 50);
  223. INSERT INTO
  224. employees
  225. VALUES(502, 'RR', 'MM', 'rr2@mm', '123456789', SYSDATE, 'SH_CLERK', 3000, 0.1, 100, 50);
  226.  
  227. ROLLBACK;
  228.  
  229. ALTER TRIGGER DISABLE mytrg;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement