Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Visi izlozes dalībnieki
- CREATE TABLE izlozes_dalibnieki(
- id NUMBER
- , vards VARCHAR2(100)
- , apdavinajamais NUMBER
- );
- -- Aizlieguma likumi, kuri dalībnieki nevar apdāvināties savā starpā
- CREATE TABLE izlozes_aizliegums(
- dalibnieks_1 NUMBER
- , dalibnieks_2 NUMBER
- );
- -- dati
- INSERT INTO izlozes_dalibnieki(id,vards) VALUES(1, 'Jānis');
- INSERT INTO izlozes_dalibnieki(id,vards) VALUES(2, 'Pēteris');
- INSERT INTO izlozes_dalibnieki(id,vards) VALUES(3, 'Kārlis');
- INSERT INTO izlozes_dalibnieki(id,vards) VALUES(4, 'Anna');
- INSERT INTO izlozes_dalibnieki(id,vards) VALUES(5, 'Zane');
- INSERT INTO izlozes_dalibnieki(id,vards) VALUES(6, 'Sintija');
- INSERT INTO izlozes_dalibnieki(id,vards) VALUES(7, 'Andris');
- INSERT INTO izlozes_dalibnieki(id,vards) VALUES(8, 'Andrejs');
- INSERT INTO izlozes_dalibnieki(id,vards) VALUES(9, 'Žanis');
- INSERT INTO izlozes_dalibnieki(id,vards) VALUES(10, 'Aija');
- INSERT INTO izlozes_dalibnieki(id,vards) VALUES(11, 'Alīna');
- INSERT INTO izlozes_dalibnieki(id,vards) VALUES(12, 'Žanna');
- INSERT INTO izlozes_dalibnieki(id,vards) VALUES(13, 'Edgars');
- INSERT INTO izlozes_dalibnieki(id,vards) VALUES(14, 'Jana');
- INSERT INTO izlozes_dalibnieki(id,vards) VALUES(15, 'Dzinatrs');
- INSERT INTO izlozes_dalibnieki(id,vards) VALUES(16, 'Kaspars');
- INSERT INTO izlozes_dalibnieki(id,vards) VALUES(17, 'Dzintra');
- INSERT INTO izlozes_dalibnieki(id,vards) VALUES(18, 'Antra');
- INSERT INTO izlozes_dalibnieki(id,vards) VALUES(19, 'Dace');
- INSERT INTO izlozes_dalibnieki(id,vards) VALUES(20, 'Sandra');
- -- ierobešojumi
- INSERT INTO izlozes_aizliegums VALUES(1,2);
- INSERT INTO izlozes_aizliegums VALUES(1,3);
- INSERT INTO izlozes_aizliegums VALUES(1,6);
- INSERT INTO izlozes_aizliegums VALUES(6,7);
- INSERT INTO izlozes_aizliegums VALUES(11,19);
- INSERT INTO izlozes_aizliegums VALUES(10,20);
- -- saglabājam
- COMMIT;
- -- darbības skripts:
- -- jābūt ieslēgtam DBMS_OUTPUT
- DECLARE
- TYPE dalibnieki_t IS TABLE OF izlozes_dalibnieki%ROWTYPE;
- TYPE aizliegums_t IS TABLE OF izlozes_aizliegums%ROWTYPE;
- dalibnieki dalibnieki_t;
- aizliegumi aizliegums_t;
- TYPE integer_sk_t IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
- gatavie_pari integer_sk_t;
- rnd NUMBER;
- isOK BOOLEAN;
- otrs_vards VARCHAR2(100);
- BEGIN
- -- ielasām atmiņā dalībniekus
- SELECT * BULK COLLECT INTO dalibnieki
- FROM (
- SELECT
- id,vards,apdavinajamais
- FROM izlozes_dalibnieki
- left join izlozes_aizliegums ON id=dalibnieks_1
- GROUP BY id,vards,apdavinajamais,dalibnieks_1
- ORDER BY dalibnieks_1,id
- )
- ;
- -- ielasām atmiņā aizliegumus
- SELECT * BULK COLLECT INTO aizliegumi FROM izlozes_aizliegums;
- -- apstrādājam sarakstus
- FOR i IN 1..dalibnieki.COUNT LOOP
- LOOP
- -- uzģenerējam random skaitli
- rnd:=ROUND(DBMS_RANDOM.VALUE(1,dalibnieki.COUNT));
- -- pārbaudām, vai nav pats dāvinātājs
- IF (dalibnieki(i).id!=rnd) THEN
- isOK:=TRUE;
- -- pārbaudām, vai nav ierobežojums
- FOR cc IN (SELECT * FROM izlozes_aizliegums WHERE dalibnieks_1=dalibnieki(i).id)
- LOOP
- -- ja ir ierobežojums, tad tālāk neko nedarām
- IF (cc.dalibnieks_2 = rnd) THEN
- isOK:=FALSE;
- EXIT;
- END IF;
- END LOOP;
- -- pārbaudām, vai nav jau piešķirts kādam
- IF (isOK = TRUE) THEN
- FOR j IN 1..gatavie_pari.COUNT LOOP
- IF (gatavie_pari(j) = rnd) THEN
- isOK:=FALSE;
- EXIT;
- END IF;
- END LOOP;
- END IF;
- -- ja viss ir kārtībā, izdrukājam rezultātu
- IF (isOK) THEN
- gatavie_pari(i):=rnd;
- SELECT vards INTO otrs_vards FROM izlozes_dalibnieki WHERE id=rnd;
- DBMS_OUTPUT.put_line(dalibnieki(i).vards||' apdāvina '||otrs_vards);
- EXIT;
- END IF;
- END IF;
- END LOOP;
- END LOOP;
- END;
- /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement