DELIMITER $$ DROP PROCEDURE IF EXISTS `testDB`.`popuni_tabele` $$ CREATE PROCEDURE `testDB`.`popuni_tabele` (IN p_broj_korisnika INT, OUT p_poruka VARCHAR(255)) LANGUAGE SQL NOT DETERMINISTIC MODIFIES SQL DATA SQL SECURITY DEFINER COMMENT 'Ova procedura sluzi za popunjavanje tabela ''korisnici'' i ''transakcije'' ' BEGIN -- deklaracija potrebnih varijabli DECLARE v_counter INT DEFAULT 0; DECLARE v_broj_transakcija INT DEFAULT 0; DECLARE v_oduzmi_id INT; DECLARE v_dodaj_id INT; DECLARE v_iznos DOUBLE(10,2); DECLARE nema_vise_redova BOOLEAN DEFAULT false; DECLARE cur_korisnici CURSOR FOR SELECT k1.id AS oduzmi, k2.id AS dodaj FROM korisnici k1, korisnici k2 WHERE k1.id <> k2.id; DECLARE continue HANDLER FOR SQLSTATE '02000' SET nema_vise_redova = true; DECLARE exit HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SET p_poruka = 'Unos prekinut zbog SQLExceptiona'; END; -- oznacimo pocetak transakcije START TRANSACTION; -- petlja_za_unos_podataka WHILE v_counter < p_broj_korisnika DO -- povecaj brojac za 1 SET v_counter = v_counter + 1; INSERT INTO korisnici (id, ime, prezime, iznos, email) VALUES ( NULL, CONCAT('ime_', v_counter), CONCAT('prezime_', v_counter), RAND() * (10/RAND()) * 1000, CONCAT('email', MOD(v_counter, 5), '@domena', MOD(v_counter, 7), '.com') ); END WHILE; -- otvori cursor sa korisnicima OPEN cur_korisnici; -- otvori petlju sa korisnicima petlja_sa_korisnicima: LOOP -- pokupi vrijednosti iz cursora FETCH cur_korisnici INTO v_oduzmi_id, v_dodaj_id; -- ako cursor ne sadrzi vise redova, zavrsi sa petljom IF nema_vise_redova THEN LEAVE petlja_sa_korisnicima; END IF; -- povecaj brojac transakcija za 1 SET v_broj_transakcija = v_broj_transakcija + 1; SET v_iznos = RAND() * (MOD(v_broj_transakcija, 33) + 10); -- necemo vrsiti provjeru koliko je trenutni korisnikov iznos, -- nego cemo samo unijesti podatke radi demonstracije funkcionisanja: UPDATE korisnici SET iznos = iznos - v_iznos WHERE id = v_oduzmi_id; UPDATE korisnici SET iznos = iznos + v_iznos WHERE id = v_dodaj_id; -- unesi transakciju u tabelu INSERT INTO transakcije(id, ovome_oduzmi, ovome_dodaj, iznos, opis_transakcije) VALUES (NULL, v_oduzmi_id, v_dodaj_id, v_iznos, CONCAT('Transakcija broj ', v_broj_transakcija)); -- zatvori petlju sa korisnicima END LOOP petlja_sa_korisnicima; CLOSE cur_korisnici; -- potvrdimo unos i oznacimo kao kraj transakcije COMMIT; -- sastavimo OUT poruku SET p_poruka = CONCAT('Broj unesenih korisnika: ', v_counter, '; Broj obavljenih transakcija: ', v_broj_transakcija); -- prikazimo sadrzaj poruke: SELECT p_poruka; END $$ DELIMITER ;