Advertisement
ABuhanovskis

randomizēts apdāvinātāju saraksts

Nov 24th, 2014
282
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 3.67 KB | None | 0 0
  1. -- Visi izlozes dalībnieki
  2. CREATE TABLE izlozes_dalibnieki(
  3. id NUMBER
  4. , vards VARCHAR2(100)
  5. , apdavinajamais NUMBER
  6. );
  7. -- Aizlieguma likumi, kuri dalībnieki nevar apdāvināties savā starpā
  8. CREATE TABLE izlozes_aizliegums(
  9. dalibnieks_1 NUMBER
  10. , dalibnieks_2 NUMBER
  11. );
  12. -- dati
  13. INSERT INTO izlozes_dalibnieki(id,vards) VALUES(1, 'Jānis');
  14. INSERT INTO izlozes_dalibnieki(id,vards) VALUES(2, 'Pēteris');
  15. INSERT INTO izlozes_dalibnieki(id,vards) VALUES(3, 'Kārlis');
  16. INSERT INTO izlozes_dalibnieki(id,vards) VALUES(4, 'Anna');
  17. INSERT INTO izlozes_dalibnieki(id,vards) VALUES(5, 'Zane');
  18. INSERT INTO izlozes_dalibnieki(id,vards) VALUES(6, 'Sintija');
  19. INSERT INTO izlozes_dalibnieki(id,vards) VALUES(7, 'Andris');
  20. INSERT INTO izlozes_dalibnieki(id,vards) VALUES(8, 'Andrejs');
  21. INSERT INTO izlozes_dalibnieki(id,vards) VALUES(9, 'Žanis');
  22. INSERT INTO izlozes_dalibnieki(id,vards) VALUES(10, 'Aija');
  23. INSERT INTO izlozes_dalibnieki(id,vards) VALUES(11, 'Alīna');
  24. INSERT INTO izlozes_dalibnieki(id,vards) VALUES(12, 'Žanna');
  25. INSERT INTO izlozes_dalibnieki(id,vards) VALUES(13, 'Edgars');
  26. INSERT INTO izlozes_dalibnieki(id,vards) VALUES(14, 'Jana');
  27. INSERT INTO izlozes_dalibnieki(id,vards) VALUES(15, 'Dzinatrs');
  28. INSERT INTO izlozes_dalibnieki(id,vards) VALUES(16, 'Kaspars');
  29. INSERT INTO izlozes_dalibnieki(id,vards) VALUES(17, 'Dzintra');
  30. INSERT INTO izlozes_dalibnieki(id,vards) VALUES(18, 'Antra');
  31. INSERT INTO izlozes_dalibnieki(id,vards) VALUES(19, 'Dace');
  32. INSERT INTO izlozes_dalibnieki(id,vards) VALUES(20, 'Sandra');
  33. -- ierobešojumi
  34. INSERT INTO izlozes_aizliegums VALUES(1,2);
  35. INSERT INTO izlozes_aizliegums VALUES(1,3);
  36. INSERT INTO izlozes_aizliegums VALUES(1,6);
  37. INSERT INTO izlozes_aizliegums VALUES(6,7);
  38. INSERT INTO izlozes_aizliegums VALUES(11,19);
  39. INSERT INTO izlozes_aizliegums VALUES(10,20);
  40. -- saglabājam
  41. COMMIT;
  42.  
  43. -- darbības skripts:
  44. -- jābūt ieslēgtam DBMS_OUTPUT
  45. DECLARE
  46.     TYPE dalibnieki_t IS TABLE OF izlozes_dalibnieki%ROWTYPE;
  47.     TYPE aizliegums_t IS TABLE OF izlozes_aizliegums%ROWTYPE;
  48.     dalibnieki dalibnieki_t;
  49.     aizliegumi aizliegums_t;
  50.     TYPE integer_sk_t IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
  51.     gatavie_pari integer_sk_t;
  52.  
  53.     rnd NUMBER;
  54.     isOK BOOLEAN;
  55.     otrs_vards VARCHAR2(100);
  56. BEGIN
  57. -- ielasām atmiņā dalībniekus
  58.     SELECT * BULK COLLECT INTO dalibnieki
  59.     FROM (
  60.         SELECT
  61.         id,vards,apdavinajamais
  62.         FROM izlozes_dalibnieki
  63.         left join izlozes_aizliegums ON id=dalibnieks_1
  64.         GROUP BY id,vards,apdavinajamais,dalibnieks_1
  65.         ORDER BY dalibnieks_1,id
  66.     )
  67.     ;
  68. -- ielasām atmiņā aizliegumus
  69.     SELECT * BULK COLLECT INTO aizliegumi FROM izlozes_aizliegums;
  70. -- apstrādājam sarakstus
  71.     FOR i IN 1..dalibnieki.COUNT LOOP
  72.         LOOP
  73. -- uzģenerējam random skaitli
  74.             rnd:=ROUND(DBMS_RANDOM.VALUE(1,dalibnieki.COUNT));
  75. -- pārbaudām, vai nav pats dāvinātājs
  76.             IF (dalibnieki(i).id!=rnd) THEN
  77.                 isOK:=TRUE;
  78. -- pārbaudām, vai nav ierobežojums
  79.                 FOR cc IN (SELECT * FROM izlozes_aizliegums WHERE dalibnieks_1=dalibnieki(i).id)
  80.                 LOOP
  81. -- ja ir ierobežojums, tad tālāk neko nedarām
  82.                     IF (cc.dalibnieks_2 = rnd) THEN
  83.                         isOK:=FALSE;
  84.                         EXIT;
  85.                     END IF;
  86.                 END LOOP;
  87. -- pārbaudām, vai nav jau piešķirts kādam
  88.                 IF (isOK = TRUE) THEN
  89.                     FOR j IN 1..gatavie_pari.COUNT LOOP
  90.                         IF (gatavie_pari(j) = rnd) THEN
  91.                             isOK:=FALSE;
  92.                             EXIT;
  93.                         END IF;
  94.                     END LOOP;
  95.                 END IF;
  96. -- ja viss ir kārtībā, izdrukājam rezultātu
  97.                 IF (isOK) THEN
  98.                     gatavie_pari(i):=rnd;
  99.                     SELECT vards INTO otrs_vards FROM izlozes_dalibnieki WHERE id=rnd;
  100.                     DBMS_OUTPUT.put_line(dalibnieki(i).vards||' apdāvina '||otrs_vards);
  101.                     EXIT;
  102.                 END IF;
  103.             END IF;
  104.         END LOOP;
  105.     END LOOP;
  106. END;
  107. /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement