Advertisement
Guest User

Untitled

a guest
Jan 16th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. DECLARE
  3. BEGIN
  4.  FOR KOT IN (SELECT PSEUDO FROM KOCURY)
  5.  LOOP
  6.  EXECUTE IMMEDIATE
  7.  'CREATE TABLE TMP_KONTO_' || KOT.PSEUDO ||
  8.  '(NR NUMBER(2) CONSTRAINT ' || KOT.PSEUDO || '_nr_pk PRIMARY KEY,' ||
  9.  'WAGA_MYSZY NUMBER(2) CONSTRAINT ' || KOT.PSEUDO ||'_wa_ch CHECK (waga_myszy BETWEEN 15 AND 20))';
  10.  END LOOP;
  11. END;
  12.  
  13.  
  14. CREATE OR REPLACE PROCEDURE PRZYJMIJ_NA_STAN(PSEUDO KOCURY.PSEUDO%TYPE, DZIEN DATE) IS
  15.   PRAGMA AUTONOMOUS_TRANSACTION;
  16.   TYPE TAB_MYSZY IS TABLE OF MYSZY%ROWTYPE INDEX BY BINARY_INTEGER;
  17.   MYSZKI TAB_MYSZY;
  18.   QUERY VARCHAR2(500);
  19.  
  20.   BEGIN
  21.     QUERY :=
  22.       'SELECT NR, ''' || PSEUDO ||''', NULL, WAGA_MYSZY, ''' || DZIEN || ''', NULL ' ||
  23.         'FROM TMP_KONTO_' || PSEUDO;
  24.  
  25.     EXECUTE IMMEDIATE QUERY
  26.     BULK COLLECT INTO MYSZKI;
  27.  
  28.     FORALL I IN 1..MYSZKI.LAST
  29.     INSERT INTO MYSZY VALUES MYSZKI(I);
  30.  
  31.     QUERY := 'DELETE FROM TMP_KONTO_' || PSEUDO;
  32.     EXECUTE IMMEDIATE QUERY;
  33.  
  34.     COMMIT;
  35.  
  36.   END;
  37.  
  38. INSERT INTO TMP_KONTO_ZERO VALUES (1, 16);
  39. INSERT INTO TMP_KONTO_ZERO VALUES (2, 17);
  40. INSERT INTO TMP_KONTO_ZERO VALUES (3, 18);
  41. COMMIT;
  42.  
  43. SELECT * FROM MYSZY WHERE DATA_ZLOWIENIA = SYSDATE;
  44. CALL PRZYJMIJ_NA_STAN('ZERO', SYSDATE);
  45. SELECT * FROM MYSZY WHERE LOWCA = 'ZERO' AND DATA_ZLOWIENIA > '2018-01-08';
  46.  
  47.  
  48. CREATE OR REPLACE PROCEDURE WYPLATA IS
  49.   PRAGMA AUTONOMOUS_TRANSACTION;
  50.   TYPE TAB_PSEUD IS TABLE OF KOCURY.PSEUDO%TYPE;
  51.   TYPE TAB_LICZB IS TABLE OF NUMBER;
  52.  
  53.   KOTY TAB_PSEUD;
  54.   PENSJE TAB_LICZB;
  55.   ZJEDZONE TAB_LICZB;
  56.  
  57.   NUMERY_MYSZY TAB_LICZB;
  58.   ZJADACZE TAB_PSEUD DEFAULT TAB_PSEUD();
  59.  
  60.   DZIEN DATE DEFAULT SYSDATE;
  61.   SRODA DATE;
  62.   NR NUMBER DEFAULT 0;
  63.   SA_GLODNI BOOLEAN DEFAULT TRUE;
  64.  
  65.   ZLY_DZIEN EXCEPTION;
  66.  
  67.   BEGIN
  68.     SRODA := NEXT_DAY(LAST_DAY(DZIEN) - 7, 'ŚRODA');
  69.  
  70.     IF DZIEN != SRODA THEN
  71.       RAISE ZLY_DZIEN;
  72.     END IF;
  73.  
  74.     SELECT NR_MYSZY
  75.     BULK COLLECT INTO NUMERY_MYSZY
  76.     FROM MYSZY
  77.     WHERE ZJADACZ IS NULL;
  78.  
  79.     SELECT PSEUDO,
  80.       NVL(PRZYDZIAL_MYSZY, 0) + NVL(MYSZY_EXTRA, 0),
  81.       0
  82.     BULK COLLECT INTO KOTY, PENSJE, ZJEDZONE
  83.     FROM KOCURY
  84.     CONNECT BY PRIOR PSEUDO = SZEF
  85.     START WITH SZEF IS NULL
  86.     ORDER BY LEVEL;
  87.  
  88.  
  89.     WHILE NR < NUMERY_MYSZY.LAST AND SA_GLODNI
  90.       LOOP
  91.       FOR I IN 1..KOTY.LAST
  92.       LOOP
  93.         IF ZJEDZONE(I) < PENSJE(I) THEN
  94.           NR := NR + 1;
  95.           ZJADACZE.EXTEND;
  96.           ZJADACZE(NR) := KOTY(I);
  97.         END IF;
  98.         EXIT WHEN NR = NUMERY_MYSZY.LAST;
  99.       END LOOP;
  100.  
  101.       SA_GLODNI := FALSE;
  102.  
  103.       FOR I IN 1..KOTY.LAST
  104.         LOOP
  105.         IF ZJEDZONE(I) < PENSJE(I) THEN
  106.           SA_GLODNI := TRUE;
  107.           EXIT;
  108.         END IF;
  109.       END LOOP;
  110.     END LOOP;
  111.  
  112.     FORALL I IN 1..ZJADACZE.LAST
  113.     UPDATE MYSZY
  114.       SET ZJADACZ = ZJADACZE(I),
  115.         DATA_WYDANIA = DZIEN
  116.     WHERE NR_MYSZY = NUMERY_MYSZY(I);
  117.     COMMIT;
  118.   EXCEPTION
  119.     WHEN ZLY_DZIEN THEN
  120.     DBMS_OUTPUT.PUT_LINE('WYPŁATA POWINNA BYĆ W OSTATNIĄ ŚRODĘ MIESIĄCA!');
  121.   END WYPLATA;
  122.  
  123. SELECT * FROM MYSZY WHERE ZJADACZ IS NULL OR DATA_WYDANIA IS NULL;
  124. CALL WYPLATA();
  125. SELECT * FROM MYSZY WHERE ZJADACZ IS NULL OR DATA_WYDANIA IS NULL;
  126. ROLLBACK;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement