· 8 years ago · Dec 07, 2017, 02:20 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;
17 DECLARE ideks varchar(11);
18DECLARE tranzakcja INT;
19DECLARE i INT;
20
21DECLARE kursor CURSOR FOR
22(SELECT pensja, pesel FROM pracownicy WHERE pracownicy.zawod=zawod1);
23
24 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
25OPEN kursor;
26SET done = 0;
27SET AUTOCOMMIT=0;
28SET i =0;
29SET tranzakcja = (SELECT COUNT(pensja) FROM pracownicy WHERE pracownicy.zawod=zawod1);
30
31 CREATE TEMPORARY TABLE wynik ( pesel varchar(11), wyplacono varchar(11));
32
33 START TRANSACTION;
34
35 myloop: LOOP
36
37 FETCH kursor INTO pensja1, ideks;
38
39 IF done THEN
40 SET done = 0;
41 LEAVE myloop;
42 END IF;
43
44 IF pensja1 <= budzet THEN
45
46 SET budzet = budzet - pensja1 ;
47 SET i = i + 1 ;
48 SET peselzmienna = (SELECT Replace(pracownicy.PESEL, Left(pracownicy.PESEL, 8), "********") AS PESEL FROM pracownicy WHERE pesel=ideks ) ;
49
50
51 INSERT INTO wynik ( `pesel` , `wyplacono`) VALUES(peselzmienna, 'wyplacono');
52
53 END IF;
54
55 END LOOP;
56IF i = tranzakcja THEN COMMIT;
57ELSE ROLLBACK;
58END IF;
59
60CLOSE kursor;
61SELECT * FROM wynik;
62DROP TABLE wynik;
63END $$
64DELIMITER ;
65
66 CALL wyplata(300, 'reporter' );