Advertisement
Guest User

Untitled

a guest
Jan 16th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 4.99 KB | None | 0 0
  1. ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
  2.  
  3. DROP TABLE Myszy;
  4.  
  5. DECLARE
  6.     dmlCommand VARCHAR2(1024);
  7.     PRAGMA AUTONOMOUS_TRANSACTION;
  8. BEGIN
  9.     dmlCommand :=
  10.     'CREATE TABLE Myszy
  11.    (
  12.        nr_myszy NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY CONSTRAINT my_pk PRIMARY KEY,
  13.        lowca VARCHAR2(15) CONSTRAINT my_lo_fk REFERENCES Kocury(pseudo),
  14.        zjadacz VARCHAR2(15) CONSTRAINT my_zj_fk REFERENCES Kocury(pseudo),
  15.        waga_myszy NUMBER(2) CONSTRAINT my_wm_ck CHECK(waga_myszy BETWEEN 2 AND 10),
  16.        data_zlowienia DATE,
  17.        data_wydania DATE
  18.    )';
  19.     EXECUTE IMMEDIATE dmlCommand;
  20.     COMMIT;
  21. END;
  22.  
  23.  
  24. CREATE OR REPLACE PROCEDURE dopiszMyszy(kot Kocury.PSEUDO%TYPE, ile NUMBER) AS
  25.     TYPE TabelaMyszyNowe IS TABLE OF Myszy%ROWTYPE INDEX BY BINARY_INTEGER;
  26.     myszyNowe TabelaMyszyNowe;
  27.     aktualnaOstatniaSroda DATE := NEXT_DAY(LAST_DAY(SYSDATE) - 7, 'WED');
  28. BEGIN
  29.     FOR i IN 1..ile
  30.         LOOP
  31.             myszyNowe(i).lowca := kot;
  32.             myszyNowe(i).zjadacz := NULL;
  33.             myszyNowe(i).waga_myszy := DBMS_RANDOM.VALUE(2, 10);
  34.             myszyNowe(i).data_zlowienia := SYSDATE;
  35.             myszyNowe(i).data_wydania := aktualnaOstatniaSroda;
  36.         END LOOP;
  37.  
  38.         FORALL i IN 1..myszyNowe.COUNT
  39.             INSERT INTO Myszy(lowca, zjadacz, waga_myszy, data_zlowienia, data_wydania)
  40.             VALUES (myszyNowe(i).lowca, myszyNowe(i).zjadacz, myszyNowe(i).waga_myszy, myszyNowe(i).data_zlowienia, myszyNowe(i).data_wydania);
  41. END dopiszMyszy;
  42.  
  43. CREATE OR REPLACE PROCEDURE przygotujWyplate(dataWyplaty IN DATE DEFAULT SYSDATE) AS
  44.     i NUMBER := 1;
  45.     TYPE kotZWyplata IS RECORD (
  46.         pseudo Kocury.PSEUDO%TYPE,
  47.         zjada NUMBER
  48.     );
  49.     TYPE TabelaWyplatyDlaKotow IS TABLE OF kotZWyplata INDEX BY BINARY_INTEGER;
  50.     wyplaty TabelaWyplatyDlaKotow;
  51. BEGIN
  52.     FOR kot IN (SELECT pseudo, NVL(przydzial_myszy, 0) + NVL(myszy_extra, 0) zjada
  53.                 FROM kocury
  54.                 WHERE w_stadku_od < dataWyplaty
  55.                 START WITH szef IS NULL
  56.                 CONNECT BY PRIOR pseudo = szef
  57.                 ORDER BY LEVEL DESC)
  58.     LOOP
  59.         wyplaty(i).pseudo := kot.pseudo;
  60.         wyplaty(i).zjada := kot.zjada;
  61.         i := i + 1;
  62.     END LOOP;
  63.  
  64.     FORALL i IN 1..wyplaty.COUNT
  65.         UPDATE Myszy
  66.         SET zjadacz = wyplaty(i).pseudo
  67.         WHERE zjadacz IS NULL AND ROWNUM <= wyplaty(i).zjada;
  68. END przygotujWyplate;
  69.  
  70.  
  71. DECLARE
  72.     dataObecna DATE := '2004-01-01';
  73.     poczatekMiesiaca DATE := dataObecna;
  74.     dataKoncowa DATE := '2017-01-15';
  75.     ileWpisanychMyszy NUMBER;
  76.     maxUpolowan NUMBER;
  77.     aktualnaOstatniaSroda DATE := NEXT_DAY(LAST_DAY(poczatekMiesiaca) - 7, 'WED');
  78.     TYPE TabelaMyszyNowe IS TABLE OF Myszy%ROWTYPE INDEX BY BINARY_INTEGER;
  79.     myszyNowe TabelaMyszyNowe;
  80.     TYPE kotIleUpolowal IS RECORD (
  81.         pseudo Kocury.PSEUDO%TYPE,
  82.         upolowal NUMBER
  83.     );
  84.     TYPE TabelaKotyIleUpolowali IS TABLE OF kotIleUpolowal INDEX BY BINARY_INTEGER;
  85.     kotyIPolowania TabelaKotyIleUpolowali;
  86.     tmp NUMBER;
  87. BEGIN
  88.     WHILE aktualnaOstatniaSroda <= dataKoncowa
  89.     LOOP
  90.         SELECT SUM(NVL(przydzial_myszy,0) + NVL(myszy_extra,0)), AVG(NVL(przydzial_myszy,0) + NVL(myszy_extra,0))
  91.         INTO ileWpisanychMyszy, maxUpolowan
  92.         FROM Kocury
  93.         WHERE w_stadku_od < aktualnaOstatniaSroda;
  94.  
  95.         EXECUTE IMMEDIATE 'SELECT pseudo, 0 FROM Kocury WHERE w_stadku_od <= :aktualnaOstatniaSroda' BULK COLLECT INTO kotyIPolowania
  96.         USING aktualnaOstatniaSroda;
  97.  
  98.         FOR i IN 1..ileWpisanychMyszy
  99.         LOOP
  100.             tmp := DBMS_RANDOM.VALUE(1, kotyIPolowania.COUNT);
  101.             IF kotyIPolowania.NEXT(tmp) IS NOT NULL
  102.                 THEN tmp := kotyIPolowania.NEXT(tmp);
  103.             ELSE
  104.                 tmp := kotyIPolowania.FIRST;
  105.             END IF;
  106.             myszyNowe(i).lowca := kotyIPolowania(tmp).pseudo;
  107.             myszyNowe(i).zjadacz := NULL;
  108.             myszyNowe(i).waga_myszy := DBMS_RANDOM.VALUE(2, 10);
  109.             myszyNowe(i).data_zlowienia := poczatekMiesiaca + DBMS_RANDOM.VALUE(0, EXTRACT(DAY FROM aktualnaOstatniaSroda));
  110.             myszyNowe(i).data_wydania := aktualnaOstatniaSroda;
  111.             IF kotyIPolowania(tmp).upolowal + 1 > maxUpolowan
  112.                 THEN IF kotyIPolowania.COUNT > 1
  113.                         THEN kotyIPolowania.DELETE(tmp);
  114.                      END IF;
  115.                 ELSE kotyIPolowania(tmp).upolowal := kotyIPolowania(tmp).upolowal + 1;
  116.             END IF;
  117.         END LOOP;
  118.  
  119.         FORALL i IN 1..myszyNowe.COUNT
  120.             INSERT INTO Myszy(lowca, zjadacz, waga_myszy, data_zlowienia, data_wydania)
  121.             VALUES (myszyNowe(i).lowca, myszyNowe(i).zjadacz, myszyNowe(i).waga_myszy, myszyNowe(i).data_zlowienia, myszyNowe(i).data_wydania);
  122.  
  123.         przygotujWyplate(aktualnaOstatniaSroda);
  124.  
  125.         poczatekMiesiaca := ADD_MONTHS(poczatekMiesiaca, 1);
  126.         aktualnaOstatniaSroda := NEXT_DAY(LAST_DAY(poczatekMiesiaca) - 7, 'WED');
  127.     END LOOP;
  128. END;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement