Advertisement
Guest User

Untitled

a guest
Jan 18th, 2020
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- Pętla od 1 stycznia 2004 do 19 stycznia 2020
  2. DECLARE
  3.     data_pocz DATE := TO_DATE('2004-01-01'); -- pierwszy dzień prowadzenia ewidencji
  4.     data_konc DATE := TO_DATE('2020-01-19'); -- ostatni dzień prowadzenia ewidencji
  5.     data_akt DATE;
  6.     ile_miesiecy NUMBER := MONTHS_BETWEEN(data_konc, data_pocz);
  7.     ostatnia_sroda DATE;
  8.     ile_dni NUMBER;
  9.     srednia_spozycia NUMBER;
  10.  
  11.     wylosowana_data_upolowania DATE;
  12.     wylosowana_waga NUMBER;
  13.     id_myszy NUMBER := 1;
  14.     id_myszy_niewyd NUMBER := 1;  -- id ostatniej niewydanej myszy
  15.  
  16.     TYPE o_kocie IS RECORD (pseudo KOCURY.pseudo%TYPE, przydzial KOCURY.przydzial_myszy%TYPE);
  17.     TYPE tab_kotkow IS TABLE OF o_kocie INDEX BY BINARY_INTEGER;
  18.     kotki tab_kotkow;
  19.  
  20.     TYPE tab_myszek IS TABLE OF MYSZY%ROWTYPE INDEX BY BINARY_INTEGER;
  21.     upolowane_myszki tab_myszek;
  22. BEGIN
  23.     EXECUTE IMMEDIATE 'TRUNCATE TABLE MYSZY';
  24.     data_akt := data_pocz;
  25.  
  26.     -- Dla każdego miesiąca
  27.     FOR i IN 1..ile_miesiecy LOOP
  28.  
  29.         ostatnia_sroda := NEXT_DAY(LAST_DAY(data_akt) - INTERVAL '7' DAY,'WEDNESDAY');
  30.         ile_dni := EXTRACT(DAY FROM ostatnia_sroda);
  31.         kotki.DELETE;
  32.         srednia_spozycia := 0;
  33.  
  34.         -- Pobranie kotow
  35.         SELECT pseudo, przydzial_myszy + NVL(myszy_extra, 0) BULK COLLECT INTO kotki FROM KOCURY WHERE w_stadku_od <= data_akt;
  36.  
  37.         -- Wyliczenie sredniej
  38.         FOR i IN 1..kotki.COUNT LOOP
  39.             srednia_spozycia := srednia_spozycia + kotki(i).przydzial;
  40.         END LOOP;
  41.         srednia_spozycia := srednia_spozycia / kotki.COUNT;
  42.  
  43.         -- Dla każdego kota zapisanego do stada w aktualnym miesiącu...
  44.         FOR i IN 1..kotki.COUNT LOOP
  45.             -- Wygeneruj odpowiednią liczbę myszy upolowanych
  46.             FOR j IN 1..CEIL(srednia_spozycia) LOOP
  47.                 wylosowana_data_upolowania := data_akt + FLOOR(DBMS_RANDOM.VALUE(1, ile_dni)) - 1;  -- ile dni ma dodac do daty początkowej (1 dnia miesiąca)
  48.                 wylosowana_waga := FLOOR(DBMS_RANDOM.VALUE(10, 16));  -- wylosuje [1; 15]
  49.                 IF wylosowana_data_upolowania <= data_konc THEN
  50.                     upolowane_myszki(id_myszy).nr_myszy := id_myszy;
  51.                     upolowane_myszki(id_myszy).lowca := kotki(i).pseudo;
  52.                     upolowane_myszki(id_myszy).waga_myszy := wylosowana_waga;
  53.                     upolowane_myszki(id_myszy).data_zlowienia := wylosowana_data_upolowania;
  54.                     id_myszy := id_myszy + 1;
  55.                 END IF;
  56.             END LOOP;
  57.         END LOOP;
  58.  
  59.         -- Nadchodzi dzień wypłat
  60.         IF ostatnia_sroda <= data_konc THEN
  61.             -- Dla każdego kota zapisanego do stada w aktualnym miesiącu...
  62.             FOR i IN 1..kotki.COUNT LOOP
  63.                 -- ... dodaj tyle myszek, ile ten kot ma przydzialonych myszy
  64.                 FOR p IN 1..kotki(i).przydzial LOOP
  65.                     upolowane_myszki(id_myszy_niewyd).zjadacz := kotki(i).pseudo;
  66.                     upolowane_myszki(id_myszy_niewyd).data_wydania := ostatnia_sroda;
  67.                     id_myszy_niewyd := id_myszy_niewyd + 1;
  68.                 END LOOP;
  69.             END LOOP;
  70.         END IF;
  71.  
  72.         data_akt := ADD_MONTHS(data_pocz, i);
  73.     END LOOP;
  74.  
  75.     -- Wstawienie mysz upolowanych
  76.     FORALL i IN 1..upolowane_myszki.COUNT SAVE EXCEPTIONS
  77.         INSERT INTO MYSZY(nr_myszy, lowca, zjadacz, waga_myszy, data_zlowienia, data_wydania) VALUES (upolowane_myszki(i).nr_myszy, upolowane_myszki(i).lowca, upolowane_myszki(i).zjadacz, upolowane_myszki(i).waga_myszy, upolowane_myszki(i).data_zlowienia, upolowane_myszki(i).data_wydania);
  78.     COMMIT;
  79.     DBMS_OUTPUT.PUT_LINE('Wstawiono myszy: ' || upolowane_myszki.COUNT);
  80. END;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement