Advertisement
Guest User

Untitled

a guest
Nov 21st, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 5.93 KB | None | 0 0
  1. CREATE OR REPLACE PACKAGE employee_p AS
  2.     CURSOR get_workday_employees
  3.     IS
  4.     SELECT * FROM workday ;    
  5.    
  6.     CURSOR get_employees
  7.     IS
  8.     SELECT * FROM employees;    
  9.    
  10.        
  11.    
  12.     PROCEDURE overtimeAndLatenessAccount;
  13.    
  14.     PROCEDURE Out_Screen(TOSC IN VARCHAR2);
  15. END employee_p;
  16.  
  17. CREATE OR REPLACE PACKAGE BODY employee_p AS
  18. PROCEDURE overtimeAndLatenessAccount    
  19. IS
  20.     counter_1 NUMBER DEFAULT 0;
  21.     counter_2 NUMBER DEFAULT 0;
  22.  
  23.     lateness_from_emp NUMBER ;
  24.     overtime_from_emp NUMBER ;
  25.     lateness_calc NUMBER DEFAULT 0;
  26.     overtime_calc NUMBER DEFAULT 0;
  27.    
  28.     salary_from_emp NUMBER;
  29.     min_salary_in_dept NUMBER;
  30.     sum_lateness NUMBER;
  31.    
  32.     A NUMBER DEFAULT 0;
  33.     B NUMBER DEFAULT 0;
  34.     C NUMBER DEFAULT 0;
  35.    
  36. BEGIN
  37.  
  38.     FOR n IN get_workday_employees LOOP        
  39.         DBMS_OUTPUT.enable;
  40.         SELECT lateness INTO lateness_from_emp FROM employees e WHERE e.id=n.id_employee;
  41.         SELECT overtime INTO overtime_from_emp FROM employees e WHERE e.id=n.id_employee;
  42.         SELECT salary INTO salary_from_emp FROM employees WHERE id=n.id_employee;
  43.         SELECT MIN(salary) INTO min_salary_in_dept FROM employees WHERE id_department=(SELECT id_department FROM employees WHERE id=n.id_employee);
  44.      
  45.        
  46.         IF n.skud=1 THEN
  47.             counter_1:=counter_1 + 1;
  48.         END IF;
  49.         IF n.skud=2 THEN
  50.             counter_2:=counter_2 + 1;
  51.         END IF;
  52.        
  53.         IF counter_1 = 1 AND n.skud=1 THEN
  54.             IF (TO_NUMBER(TO_CHAR(n.date_in_out, 'HH24'))*60+TO_NUMBER(TO_CHAR(n.date_in_out, 'MI')))>540 THEN
  55.                 lateness_calc := lateness_calc +(TO_NUMBER(TO_CHAR(n.date_in_out, 'HH24'))*60+TO_NUMBER(TO_CHAR(n.date_in_out, 'MI')))-540;
  56.             ELSE
  57.                 overtime_calc := overtime_calc + 540 - (TO_NUMBER(TO_CHAR(n.date_in_out, 'HH24'))*60+TO_NUMBER(TO_CHAR(n.date_in_out, 'MI')));
  58.             END IF;
  59.         ELSIF counter_1 = 2 AND n.skud=1  THEN
  60.             IF (TO_NUMBER(TO_CHAR(n.date_in_out, 'HH24'))*60+TO_NUMBER(TO_CHAR(n.date_in_out, 'MI')))>840 THEN
  61.                 lateness_calc := lateness_calc +(TO_NUMBER(TO_CHAR(n.date_in_out, 'HH24'))*60+TO_NUMBER(TO_CHAR(n.date_in_out, 'MI')))-840;
  62.             ELSE
  63.                 overtime_calc := overtime_calc + 840 - (TO_NUMBER(TO_CHAR(n.date_in_out, 'HH24'))*60+TO_NUMBER(TO_CHAR(n.date_in_out, 'MI')));
  64.             END IF;
  65.         END IF;
  66.         IF counter_2 = 1  AND n.skud=2  THEN
  67.             IF (TO_NUMBER(TO_CHAR(n.date_in_out, 'HH24'))*60+TO_NUMBER(TO_CHAR(n.date_in_out, 'MI')))<780 THEN
  68.                 lateness_calc := lateness_calc+ 780-(TO_NUMBER(TO_CHAR(n.date_in_out, 'HH24'))*60+TO_NUMBER(TO_CHAR(n.date_in_out, 'MI')));
  69.             ELSE
  70.                 overtime_calc := overtime_calc + (TO_NUMBER(TO_CHAR(n.date_in_out, 'HH24'))*60+TO_NUMBER(TO_CHAR(n.date_in_out, 'MI')))-780;
  71.             END IF;
  72.         ELSIF counter_2 = 2  AND n.skud=2  THEN
  73.             IF (TO_NUMBER(TO_CHAR(n.date_in_out, 'HH24'))*60+TO_NUMBER(TO_CHAR(n.date_in_out, 'MI')))<1080 THEN
  74.                 lateness_calc := lateness_calc+1080-(TO_NUMBER(TO_CHAR(n.date_in_out, 'HH24'))*60+TO_NUMBER(TO_CHAR(n.date_in_out, 'MI')));
  75.             ELSE
  76.                 overtime_calc := overtime_calc + (TO_NUMBER(TO_CHAR(n.date_in_out, 'HH24'))*60+TO_NUMBER(TO_CHAR(n.date_in_out, 'MI')))-1080;
  77.             END IF;
  78.         END IF;                                      
  79.                
  80.         IF counter_1=2 THEN
  81.             counter_1 := 0;
  82.            
  83.         END IF;
  84.         IF counter_2=2 THEN
  85.             counter_2 := 0;
  86.  
  87.            
  88.             DBMS_OUTPUT.put_line(n.id_employee);
  89.  
  90.             IF (lateness_from_emp-lateness_calc)<=60 THEN
  91.                 A := ROUND(ABS(lateness_from_emp-lateness_calc)/10,0)*0.05;
  92.                 DBMS_OUTPUT.put_line('A');
  93.  
  94.                 DBMS_OUTPUT.put_line(A);
  95.             END IF;
  96.             IF (lateness_from_emp-lateness_calc)>60 THEN
  97.                 A := 0.5;
  98.                 DBMS_OUTPUT.put_line('A');
  99.  
  100.                 DBMS_OUTPUT.put_line(A);                
  101.             END IF;
  102.             IF (overtime_from_emp+overtime_calc)>=60 THEN
  103.                 A := ROUND((overtime_from_emp+overtime_calc)/60,0)*1.1;                
  104.                 DBMS_OUTPUT.put_line('A');
  105.  
  106.                 DBMS_OUTPUT.put_line(A);
  107.             END IF;
  108.            
  109.             IF salary_from_emp=min_salary_in_dept THEN
  110.                 B := 500;
  111.                 DBMS_OUTPUT.put_line('B');
  112.  
  113.                 DBMS_OUTPUT.put_line(B);
  114.             ELSE
  115.                 B := 200;
  116.                 DBMS_OUTPUT.put_line('B');
  117.  
  118.                 DBMS_OUTPUT.put_line(B);
  119.             END IF;
  120.             --ЗАРПЛАТА=OKLAD + OKLAD*A + B + C
  121.             UPDATE employees
  122.             SET lateness=lateness_from_emp-lateness_calc, overtime=overtime_from_emp+overtime_calc,
  123.             payment=salary_from_emp+salary_from_emp*A+B
  124.             WHERE id=n.id_employee;
  125.            
  126.             lateness_calc := 0;                  
  127.             overtime_calc := 0;
  128.          END IF;
  129.     END LOOP;
  130.    
  131.     FOR n IN get_employees LOOP        
  132.         SELECT SUM(lateness) INTO sum_lateness FROM employees WHERE id_department=(SELECT id_department FROM employees WHERE id=n.id);
  133.         DBMS_OUTPUT.put_line(n.id);
  134.  
  135.         SELECT payment INTO salary_from_emp FROM employees WHERE n.id=id;
  136.         IF sum_lateness=0 THEN
  137.             C := 300;
  138.             DBMS_OUTPUT.put_line('C');
  139.  
  140.             DBMS_OUTPUT.put_line(C);
  141.         END IF;
  142.        
  143.         DBMS_OUTPUT.put_line('БЕЗ С:');
  144.  
  145.         DBMS_OUTPUT.put_line(salary_from_emp);
  146.        
  147.         UPDATE employees
  148.         SET payment=salary_from_emp+C
  149.         WHERE id=n.id;
  150.         C := 0;
  151.     END LOOP;
  152.  
  153. END overtimeAndLatenessAccount;
  154.    
  155. PROCEDURE Out_Screen(TOSC IN VARCHAR2)
  156. IS
  157.  
  158. BEGIN
  159.  
  160. DBMS_OUTPUT.enable;
  161. DBMS_OUTPUT.put_line(TOSC);
  162.  
  163. END Out_Screen;
  164.    
  165. END employee_p;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement