· 8 years ago · Dec 07, 2017, 12:24 PM
1/* 4. Napisz procedurę, która przyjmując w parametrach wejściowych dostępny budżet
2oraz zawód, dla którego ma odbyć się wypłata, drukuje tabelę z informacją
3(’********abc’, wypłacono), gdzie abc to trzy ostatnie cyfry PESELu. Wypłata
4ma miejsce tylko wtedy, gdy każdemu o danym zawodzie można wypłacić jego
5pensję. Procedura może mieć dostęp jedynie do jednego wiersza na raz, tzn.
6 niprzegląda całej tabli wykonując operację dla jednego pracownika. Wykorzystaj
7transakcje. */
8DROP PROCEDURE IF EXISTS wyplata;
9
10DELIMITER $$
11CREATE PROCEDURE wyplata(budzet float, zawod1 varchar(30))
12
13BEGIN
14 DECLARE peselzmienna varchar(11);
15 DECLARE done INT DEFAULT 0;
16 DECLARE pensja1 float;
17DECLARE tranzakcja INT;
18DECLARE i INT;
19
20DECLARE kursor CURSOR FOR
21(SELECT pensja FROM pracownicy WHERE pracownicy.zawod=zawod1);
22
23 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
24OPEN kursor;
25SET done = 0;
26SET AUTOCOMMIT=0;
27SET i =0;
28SET tranzakcja = (SELECT COUNT(pensja) FROM pracownicy WHERE pracownicy.zawod=zawod1);
29
30 CREATE TEMPORARY TABLE wynik ( pesel varchar(11), wyplacono varchar(11));
31
32 START TRANSACTION;
33
34 myloop: LOOP
35
36 FETCH kursor INTO pensja1;
37
38 IF done THEN
39 SET done = 0;
40 LEAVE myloop;
41 END IF;
42
43 IF pensja1 <= budzet THEN
44
45 SET budzet = budzet - pensja1 ;
46 SET i = i + 1 ;
47 SET peselzmienna = (SELECT Replace(pracownicy.PESEL, Left(pracownicy.PESEL, 8), "********") AS PESEL FROM pracownicy WHERE pensja=pensja1 ) ;
48
49
50 INSERT INTO wynik ( `pesel` , `wyplacono`) VALUES(peselzmienna, 'wyplacono');
51
52 END IF;
53
54 END LOOP;
55IF i = tranzakcja THEN COMMIT;
56ELSE ROLLBACK;
57END IF;
58
59CLOSE kursor;
60SELECT * FROM wynik;
61DROP TABLE wynik;
62END $$
63DELIMITER ;