Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Pętla od 1 stycznia 2004 do 19 stycznia 2020
- DECLARE
- data_pocz DATE := TO_DATE('2004-01-01'); -- pierwszy dzień prowadzenia ewidencji
- data_konc DATE := TO_DATE('2020-01-19'); -- ostatni dzień prowadzenia ewidencji
- data_akt DATE;
- ile_miesiecy NUMBER := MONTHS_BETWEEN(data_konc, data_pocz);
- ostatnia_sroda DATE;
- ile_dni NUMBER;
- srednia_spozycia NUMBER;
- wylosowana_data_upolowania DATE;
- wylosowana_waga NUMBER;
- id_myszy NUMBER := 1;
- id_myszy_niewyd NUMBER := 1; -- id ostatniej niewydanej myszy
- TYPE o_kocie IS RECORD (pseudo KOCURY.pseudo%TYPE, przydzial KOCURY.przydzial_myszy%TYPE);
- TYPE tab_kotkow IS TABLE OF o_kocie INDEX BY BINARY_INTEGER;
- kotki tab_kotkow;
- TYPE tab_myszek IS TABLE OF MYSZY%ROWTYPE INDEX BY BINARY_INTEGER;
- upolowane_myszki tab_myszek;
- BEGIN
- EXECUTE IMMEDIATE 'TRUNCATE TABLE MYSZY';
- data_akt := data_pocz;
- -- Dla każdego miesiąca
- FOR i IN 1..ile_miesiecy LOOP
- ostatnia_sroda := NEXT_DAY(LAST_DAY(data_akt) - INTERVAL '7' DAY,'WEDNESDAY');
- ile_dni := EXTRACT(DAY FROM ostatnia_sroda);
- kotki.DELETE;
- srednia_spozycia := 0;
- -- Pobranie kotow
- SELECT pseudo, przydzial_myszy + NVL(myszy_extra, 0) BULK COLLECT INTO kotki FROM KOCURY WHERE w_stadku_od <= data_akt;
- -- Wyliczenie sredniej
- FOR i IN 1..kotki.COUNT LOOP
- srednia_spozycia := srednia_spozycia + kotki(i).przydzial;
- END LOOP;
- srednia_spozycia := srednia_spozycia / kotki.COUNT;
- -- Dla każdego kota zapisanego do stada w aktualnym miesiącu...
- FOR i IN 1..kotki.COUNT LOOP
- -- Wygeneruj odpowiednią liczbę myszy upolowanych
- FOR j IN 1..CEIL(srednia_spozycia) LOOP
- 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)
- wylosowana_waga := FLOOR(DBMS_RANDOM.VALUE(10, 16)); -- wylosuje [1; 15]
- IF wylosowana_data_upolowania <= data_konc THEN
- upolowane_myszki(id_myszy).nr_myszy := id_myszy;
- upolowane_myszki(id_myszy).lowca := kotki(i).pseudo;
- upolowane_myszki(id_myszy).waga_myszy := wylosowana_waga;
- upolowane_myszki(id_myszy).data_zlowienia := wylosowana_data_upolowania;
- id_myszy := id_myszy + 1;
- END IF;
- END LOOP;
- END LOOP;
- -- Nadchodzi dzień wypłat
- IF ostatnia_sroda <= data_konc THEN
- -- Dla każdego kota zapisanego do stada w aktualnym miesiącu...
- FOR i IN 1..kotki.COUNT LOOP
- -- ... dodaj tyle myszek, ile ten kot ma przydzialonych myszy
- FOR p IN 1..kotki(i).przydzial LOOP
- upolowane_myszki(id_myszy_niewyd).zjadacz := kotki(i).pseudo;
- upolowane_myszki(id_myszy_niewyd).data_wydania := ostatnia_sroda;
- id_myszy_niewyd := id_myszy_niewyd + 1;
- END LOOP;
- END LOOP;
- END IF;
- data_akt := ADD_MONTHS(data_pocz, i);
- END LOOP;
- -- Wstawienie mysz upolowanych
- FORALL i IN 1..upolowane_myszki.COUNT SAVE EXCEPTIONS
- 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);
- COMMIT;
- DBMS_OUTPUT.PUT_LINE('Wstawiono myszy: ' || upolowane_myszki.COUNT);
- END;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement