· 8 years ago · Nov 29, 2017, 12:56 PM
1/* privremena tablica ha ya */
2
3CREATE TEMPORARY TABLE priv LIKE klijent;
4
5
6/* nez */
7
8DELIMITER $$
9DROP PROCEDURE IF EXISTS klasificirajKvar $$
10CREATE PROCEDURE klasificirajKvar (IN zadaniOdjel VARCHAR(50))
11BEGIN
12 DECLARE kraj INT DEFAULT 0;
13 DECLARE sif, br INT DEFAULT NULL;
14 DECLARE naziv VARCHAR(50) DEFAULT NULL;
15 DECLARE k CURSOR FOR SELECT sifKvar, nazivKvar FROM kvar WHERE sifOdjel = (SELECT sifOdjel FROM odjel WHERE nazivOdjel = zadaniOdjel);
16 DECLARE CONTINUE HANDLER FOR NOT FOUND SET kraj = 1;
17 OPEN k;
18 vrti:LOOP
19 FETCH k INTO sif, naziv;
20 IF kraj = 1 THEN LEAVE vrti;
21 END IF;
22 SELECT COUNT(*) INTO br FROM nalog WHERE sifKvar = sif;
23 IF br >= 20 THEN
24 SELECT naziv, br, 'Äesto';
25 ELSEIF (br > 0 AND br < 20) THEN
26 SELECT naziv, br, 'povremeno';
27 ELSE
28 SELECT naziv, br, 'nikad';
29 END IF;
30 END LOOP;
31 CLOSE k;
32END; $$
33DELIMITER ;
34CALL klasificirajKvar('Mehanika');
35
36
37/* isto, ali privremena tablica */
38
39DELIMITER %%
40DROP PROCEDURE IF EXISTS klasificirajKvar %%
41CREATE PROCEDURE klasificirajKvar (IN zadaniOdjel VARCHAR(50))
42BEGIN
43 DECLARE kraj INT DEFAULT 0;
44 DECLARE sif, br INT DEFAULT NULL;
45 DECLARE naziv VARCHAR(50) DEFAULT NULL;
46 DECLARE k CURSOR FOR SELECT sifKvar, nazivKvar FROM kvar WHERE sifOdjel = (SELECT sifOdjel FROM odjel WHERE nazivOdjel = zadaniOdjel);
47 DECLARE CONTINUE HANDLER FOR NOT FOUND SET kraj = 1;
48 /* here */
49 DROP TEMPORARY TABLE IF EXISTS klasificiraniKvarovi;
50 CREATE TEMPORARY TABLE klasificiraniKvarovi (nazivKvar VARCHAR(50), brNaloga INT, uÄestalost VARCHAR(20));
51 /* */
52 OPEN k;
53 vrti:LOOP
54 FETCH k INTO sif, naziv;
55 IF kraj = 1 THEN LEAVE vrti;
56 END IF;
57 SELECT COUNT(*) INTO br FROM nalog WHERE sifKvar = sif;
58 IF br >= 20 THEN
59 /* tu */
60 INSERT INTO klasificiraniKvarovi VALUES (naziv, br, 'Äesto');
61 /* */
62 ELSEIF (br > 0 AND br < 20) THEN
63 /* tu */
64 INSERT INTO klasificiraniKvarovi VALUES (naziv, br, 'povremeno');
65 /* */
66 ELSE
67 /* tu */
68 INSERT INTO klasificiraniKvarovi VALUES (naziv, br, 'nikad');
69 /* */
70 END IF;
71 END LOOP;
72 CLOSE k;
73 /* tu */
74 SELECT * FROM klasificiraniKvarovi;
75 /* */
76END; %%
77DELIMITER ;
78CALL klasificirajKvar('Mehanika');
79
80
81/* f koja će ispisati koliko radnika stanuje u zadanom mjestu
82potrebno ispisati i popis tih radnika
83mjesto zadati preko poštanskog broja */
84
85DELIMITER $$
86DROP FUNCTION IF EXISTS nadiRadnike $$
87CREATE FUNCTION nadiRadnike (ulaz INT) RETURNS INT
88DETERMINISTIC
89BEGIN
90 DECLARE kraj, br1, br2 INT DEFAULT 0;
91 DECLARE sif INT DEFAULT NULL;
92 DECLARE ime, prez VARCHAR(50) DEFAULT NULL;
93 DECLARE k CURSOR FOR SELECT sifRadnik, imeRadnik, prezimeRadnik FROM radnik WHERE pbrStan = ulaz;
94 DECLARE CONTINUE HANDLER FOR NOT FOUND SET kraj = 1;
95 DROP TEMPORARY TABLE IF EXISTS radniciIzMjesta;
96 CREATE TEMPORARY TABLE radniciIzMjesta (sif INT, imeR VARCHAR(50), prezimeR VARCHAR(50));
97 OPEN k;
98 SELECT FOUND_ROWS() INTO br1;
99
100 vrti:LOOP
101 FETCH k INTO sif, ime, prez;
102 IF kraj = 1 THEN LEAVE vrti;
103 END IF;
104 INSERT INTO radniciIzMjesta VALUES (sif, ime, prez);
105 END LOOP;
106 CLOSE k;
107 RETURN (SELECT COUNT(*) FROM radniciIzMjesta);
108END; $$
109DELIMITER ;
110
111SELECT nadiRadnike(31000);
112
113
114/* isto, ali procedura */
115
116DELIMITER $$
117DROP PROCEDURE IF EXISTS nadiRadnike $$
118CREATE PROCEDURE nadiRadnike (IN ulaz INT)
119BEGIN
120 DECLARE kraj, br1, br2 INT DEFAULT 0;
121 DECLARE sif INT DEFAULT NULL;
122 DECLARE ime, prez VARCHAR(50) DEFAULT NULL;
123 DECLARE k CURSOR FOR SELECT sifRadnik, imeRadnik, prezimeRadnik FROM radnik WHERE pbrStan = ulaz;
124 DECLARE CONTINUE HANDLER FOR NOT FOUND SET kraj = 1;
125 DROP TEMPORARY TABLE IF EXISTS radniciIzMjesta;
126 CREATE TEMPORARY TABLE radniciIzMjesta (sif INT, imeR VARCHAR(50), prezimeR VARCHAR(50));
127 OPEN k;
128 SELECT FOUND_ROWS() INTO br1;
129
130 vrti:LOOP
131 FETCH k INTO sif, ime, prez;
132 IF kraj = 1 THEN LEAVE vrti;
133 END IF;
134 INSERT INTO radniciIzMjesta VALUES (sif, ime, prez);
135 END LOOP;
136 CLOSE k;
137 SELECT * FROM radniciIzMjesta;
138END; $$
139DELIMITER ;
140
141CALL nadiRadnike(31000);
142
143
144/* f koja ima ulaz pbr INT
145nad tablicom radnik umanjuje koefplaca za 1 za sve zapise kod kojih je pbrstan isto kak i ulaz
146vraća 1
147treba koristiti kursor*/
148
149DELIMITER //
150DROP FUNCTION IF EXISTS smanjiKoef //
151CREATE FUNCTION smanjiKoef (pbr INT) RETURNS INT
152DETERMINISTIC
153BEGIN
154 DECLARE sif INT DEFAULT NULL;
155 DECLARE koef DECIMAL(6, 2) DEFAULT NULL;
156 DECLARE kraj INT DEFAULT 0;
157 DECLARE kursor CURSOR FOR
158 SELECT koefPlaca, sifRadnik FROM radnik WHERE pbrStan = pbr;
159 DECLARE CONTINUE HANDLER FOR NOT FOUND SET kraj = 1;
160 OPEN kursor;
161 petlja:LOOP FETCH kursor INTO koef, sif;
162 IF kraj = 1 THEN LEAVE petlja;
163 END IF;
164 SET koef = koef - 1;
165 UPDATE radnik SET koefPlaca = koef WHERE sifRadnik = sif;
166 END LOOP;
167 CLOSE kursor;
168 RETURN 1;
169END; //
170DELIMITER ;
171
172SELECT smanjiKoef(21000);
173
174
175/* nez */
176
177DELIMITER //
178DROP PROCEDURE IF EXISTS promakni //
179CREATE PROCEDURE promakni()
180BEGIN
181 DECLARE n INT DEFAULT 0;
182 DECLARE kraj BOOL DEFAULT FALSE;
183 DECLARE sif, odj INT DEFAULT NULL;
184 DECLARE kursor CURSOR FOR SELECT sifRadnik, sifOdjel FROM radnik;
185 DECLARE CONTINUE HANDLER FOR NOT FOUND SET kraj = TRUE;
186
187 OPEN kursor;
188 vrti:LOOP
189 FETCH kursor INTO sif, odj;
190 IF kraj = TRUE THEN LEAVE vrti;
191 END IF;
192 UPDATE radnik SET sifOdjel = odj + 1 WHERE radnik.sifRadnik = sif;
193 SET n = n + 1;
194 END LOOP;
195 CLOSE kursor;
196 SELECT n;
197END; //
198DELIMITER ;
199
200CALL promakni();
201
202
203/* tablici radnik dodati brNaloga postavljen na -1
204procedura koja će upisati kolko je naloga radnik obradio */
205
206ALTER TABLE radnik ADD brNaloga INT DEFAULT -1;
207DROP PROCEDURE IF EXISTS brojiNaloge;
208DELIMITER //
209CREATE PROCEDURE brojiNaloge()
210BEGIN
211 DECLARE kraj BOOL DEFAULT FALSE;
212 DECLARE sifra, n INT DEFAULT NULL;
213 DECLARE dohvaceno, obradeno INT DEFAULT 0;
214 DECLARE k CURSOR FOR SELECT sifRadnik FROM radnik;
215 DECLARE CONTINUE HANDLER FOR NOT FOUND SET kraj = TRUE;
216
217 OPEN k;
218 SELECT FOUND_ROWS() INTO dohvaceno;
219 vrti:LOOP
220 FETCH k INTO sifra;
221 IF kraj = TRUE THEN LEAVE vrti;
222 END IF;
223 SELECT COUNT(*) INTO n FROM nalog NATURAL JOIN radnik WHERE sifRadnik = sifra;
224 UPDATE radnik SET brNaloga = n WHERE sifRadnik = sifra;
225 SET obradeno = obradeno + 1;
226 END LOOP;
227 CLOSE k;
228 SELECT obradeno AS obradeno_zapisa;
229END; //
230DELIMITER ;
231CALL brojiNaloge();
232
233
234/* edit proÅ¡li na naÄin da se upiÅ¡e vrijednost brNaloga samo ako je veća od 10 */
235
236ALTER TABLE radnik ADD brNaloga INT DEFAULT -1;
237DROP PROCEDURE IF EXISTS brojiNaloge;
238DELIMITER //
239CREATE PROCEDURE brojiNaloge(IN kv VARCHAR(50))
240BEGIN
241 DECLARE kraj BOOL DEFAULT FALSE;
242 DECLARE sifra, n INT DEFAULT NULL;
243 DECLARE dohvaceno, obradeno INT DEFAULT 0;
244 DECLARE k CURSOR FOR SELECT radnik.sifRadnik FROM radnik
245 JOIN nalog ON radnik.sifRadnik = nalog.sifRadnik
246 JOIN kvar ON nalog.sifKvar = kvar.sifKvar WHERE nazivKvar = kv;
247 DECLARE CONTINUE HANDLER FOR NOT FOUND SET kraj = TRUE;
248
249 OPEN k;
250 SELECT FOUND_ROWS() INTO dohvaceno;
251 vrti:LOOP
252 FETCH k INTO sifra;
253 IF kraj = TRUE THEN LEAVE vrti;
254 END IF;
255 SET autocommit = 0;
256 START TRANSACTION;
257 SELECT COUNT(*) INTO n FROM nalog NATURAL JOIN radnik WHERE sifRadnik = sifra;
258 UPDATE radnik SET brNaloga = n WHERE sifRadnik = sifra;
259 IF n < 10 THEN ROLLBACK;
260 ELSE COMMIT;
261 END IF;
262 SET autocommit = 0;
263 END LOOP;
264 CLOSE k;
265 SELECT obradeno AS obradeno_zapisa;
266END; //
267DELIMITER ;
268CALL brojiNaloge('Zamjena blatobrana');
269/* nešt nije dobro, nez kaj */
270
271
272/* caps prvo slovo u rijeÄi, rijeÄ ide posle -.":_ ; */
273
274DELIMITER $$
275DROP FUNCTION IF EXISTS caps $$
276CREATE FUNCTION caps (tekst VARCHAR(1024)) RETURNS VARCHAR(1024)
277DETERMINISTIC
278BEGIN
279 DECLARE i INT DEFAULT 1;
280 DECLARE trenutni, prethodni CHAR(1);
281 DECLARE izlaz VARCHAR(1024) DEFAULT tekst;
282 WHILE i <= CHAR_LENGTH(tekst) DO
283 SET trenutni = SUBSTRING(tekst, i - 1, 1);
284 CASE i
285 WHEN 1 THEN SET prethodni = ' ';
286 ELSE SET prethodni = SUBSTRING(tekst, i - 1, 1);
287 END CASE;
288 IF prethodni IN (' ', ':') THEN SET izlaz = INSERT(izlaz, i, 1, UPPER(trenutni));
289 END IF;
290 SET i = i + 1;
291 END WHILE;
292 SET tekst = izlaz;
293 RETURN izlaz;
294END; $$
295DELIMITER ;
296SET @ulaz = 'Ovo je neki tekst za caps rijeÄi';
297CALL caps(@ulaz);
298SELECT @ulaz;
299
300SELECT caps('Ovo je neki tekst za capss rijeÄi koji treba odraditi');
301/* greška negde, neda mi se slagati xd */