· 9 years ago · Nov 15, 2016, 12:32 AM
1/* 1. U bazi autoradionica: Modificirati tablicu odjel tako da dodate novi atribut najmanjaPlaca
2tipa DOUBLE.
3Napisati proceduru koja će:
4• primiti šifru odjela
5• za zadani odjel izraÄunati plaću radnika koji radi u zadanom odjelu a ima
6najmanju plaću u tom odjelu
7• u novostvoreni atribut najmanjaPlaca unijeti prethodno izraÄunat iznos
8• plaću je potrebno izraÄunati kao umnožak iznosa osnovice i koeficijenta plaće
9Napisati primjer poziva procedure */
10
11ALTER TABLE odjel ADD COLUMN najmanjaPlaca DOUBLE;
12
13DROP PROCEDURE IF EXISTS minimalnaplaca;
14
15DELIMITER //
16CREATE PROCEDURE minimalnaplaca(sifra INT)
17BEGIN
18
19 DECLARE placa DOUBLE;
20
21 SELECT MIN(KoefPlaca*IznosOsnovice) INTO placa
22
23 FROM radnik
24 WHERE sifOdjel = sifra;
25
26 UPDATE odjel
27 SET najmanjaPlaca = placa
28 WHERE sifOdjel = sifra;
29END; //
30DELIMITER ;
31
32
33CALL minimalnaplaca(1);
34
35
36/* 2. U bazi studenti: Napisati funkciju koja će unijeti novog studenta te provjeriti postoji li već
37student sa istim jmbag-om, da li su poštanski brojevi valjani, da datum upisa nije danas ili u
38budućnosti, te da li smjer postoji. U sluÄaju pogreÅ¡ke, vratiti poruku o tome Å¡to se dogodilo.
39Napisati primjer poziva funkcije. */
40DROP FUNCTION IF EXISTS novistudent;
41DELIMITER //
42CREATE FUNCTION novistudent(sjmbag CHAR(10), sime VARCHAR(50), sprezime VARCHAR(50), datum DATE, postprebivanje INT, poststan INT, smjer INT)
43RETURNS VARCHAR(255)
44DETERMINISTIC
45BEGIN
46
47DECLARE error VARCHAR(255) DEFAULT "upisan";
48
49IF sjmbag IN( SELECT studenti.jmbag FROM studenti)
50THEN SET error= "Već postoji student s ovim jmbagom";
51RETURN error;
52END IF;
53
54IF postprebivanje NOT IN( SELECT mjesta.postbr FROM mjesta)
55THEN SET error= "Nije valjan broj mjesta";
56RETURN error;
57END IF;
58
59IF poststan NOT IN( SELECT mjesta.postbr FROM mjesta)
60THEN SET error= "Nije valjan broj mjesta";
61RETURN error;
62END IF;
63
64IF smjer NOT IN( SELECT smjerovi.id FROM smjerovi)
65THEN SET error= "Ne postoji taj smjer";
66RETURN error;
67END IF;
68
69
70IF datum > CURDATE()-1
71THEN SET error= "Nije dobar datum";
72RETURN error;
73END IF;
74
75INSERT INTO studenti SET jmbag = sjmbag,
76ime = sime,
77prezime = sprezime,
78datumUpisa = datum,
79postBrPrebivanje = postprebivanje,
80postBrStanovanja = poststan,
81idSmjer = smjer;
82
83RETURN error;
84
85
86END; //
87DELIMITER ;
88
89
90SELECT novistudent(11111111, 'Testic', 'Testovski', '2007-07-24', 10000, 10000, 1);
91
92
93/* davorovo */
94DROP FUNCTION IF EXISTS fooStudent;
95DELIMITER //
96CREATE FUNCTION fooStudent(jmbagS INT, imeS VARCHAR(50), prezimeS VARCHAR(50), datumS DATE, prebS INT, stanS INT, smjerS INT)
97RETURNS VARCHAR(100)
98DETERMINISTIC
99BEGIN
100 DECLARE broj INT;
101 DECLARE pbr1 INT;
102 DECLARE pbr2 INT;
103 DECLARE ids INT;
104
105 SELECT COUNT(*) INTO ids FROM smjerovi
106 WHERE id = smjerS;
107 SELECT COUNT(*) INTO pbr1 FROM mjesta
108 WHERE postbr = prebS;
109 SELECT COUNT(*) INTO pbr2 FROM mjesta
110 WHERE postbr = stanS;
111 SELECT COUNT(*) INTO broj FROM studenti
112 WHERE jmbag = jmbagS;
113
114 IF datumS >= CURDATE() THEN
115 RETURN "Neispravan datum!";
116 END IF;
117 IF broj != 0 THEN
118 RETURN "Student s istim JMBAG-om vec postoji!";
119 END IF;
120 IF pbr1 = 0 || pbr2 = 0 THEN
121 RETURN "Neispravan postanski broj stanovanja/prebivanja!";
122 END IF;
123 IF ids = 0 THEN
124 RETURN "Neispravan ID smjera!";
125 END IF;
126
127 INSERT INTO studenti (jmbag, ime, prezime, datumUpisa, postBrPrebivanje, postBrStanovanja, idSmjer) VALUES (jmbagS, imeS, prezimeS, datumS, prebS, stanS, smjerS);
128 RETURN "Student upisan!";
129END; //
130DELIMITER ;
131
132
133SELECT fooStudent(4564451, "Marko", "Markovic", "2010-09-28", 10050, 10000, 3);
134
135
136
137/*3. U bazi studenti: Napisati funkciju koja prima naziv smjera. Funkcija mora za sve kolegije sa
138zadanog smjera u atribut opis upisati tekst:
139a. „Lagani kolegij“ – ako je prosjek ocjena na tom kolegiju veći od 3.5
140b. „Težak kolegij“ – ako je prosjek ocjena na tom kolegiju manji ili jednak 3.5
141c. Funkcija vraća broj kolegija kojima je upisala u opis „Težak kolegij“.
142Zadatak je obavezno riješiti koristeći kursore.
143Napisati primjer poziva funkcije.*/
144
145
146DROP FUNCTION IF EXISTS smjerovi;
147DELIMITER //
148CREATE FUNCTION smjerovi(snaziv VARCHAR(100))
149RETURNS VARCHAR(100)
150DETERMINISTIC
151BEGIN
152
153DECLARE dohvaceno INT DEFAULT NULL;
154DECLARE prosjecic DOUBLE(3,2);
155DECLARE brojac, i INT DEFAULT 0;
156DECLARE smrdi INT;
157
158
159
160DECLARE kur CURSOR FOR SELECT kolegiji.id, AVG(ocjene.ocjena) FROM ocjene
161JOIN kolegiji ON ocjene.idKolegij=kolegiji.id
162JOIN smjerovi ON kolegiji.idSmjer=smjerovi.id
163WHERE smjerovi.naziv=snaziv
164GROUP BY kolegiji.id;
165
166OPEN kur;
167
168SELECT FOUND_ROWS() INTO dohvaceno;
169
170WHILE i<dohvaceno DO
171
172FETCH kur INTO smrdi,prosjecic;
173
174IF prosjecic > 3.5 THEN
175
176UPDATE kolegiji
177SET kolegiji.opis="Lagani kolegij"
178WHERE kolegiji.id=smrdi;
179
180ELSE
181
182UPDATE kolegiji
183SET kolegiji.opis="Težak kolegij"
184WHERE kolegiji.id=smrdi;
185
186SET brojac=brojac+1;
187
188END IF;
189SET i=i+1;
190
191END WHILE;
192CLOSE kur;
193
194RETURN brojac;
195
196END; //
197DELIMITER ;
198
199SELECT smjerovi("smjer informatika");
200
201
202
203/* 4. U bazi autoradionica: Napisati proceduru koja će koristeći proceduru iz prvog zadatka
204popuniti u tablici odjel atribut najmanjaPlaca. Procedura prima podatak o županiji te
205popunjava atribut najmanjaPlaca iskljuÄivo za odjele koji se odnose na radnika iz zadane
206županije.
207Zadatak je obavezno riješiti koristeći kursore.
208
209Ako za određeni odjel procedura ne uspije pronaći zapis (pogreška NOT FOUND), potrebno je
210problem riješiti koristeći odgovarajući handler. Procedura vraća broj dohvaćenih i broj
211obrađenih zapisa.
212Napisati primjer poziva procedure*/
213
214
215DROP PROCEDURE IF EXISTS minimalnaplacazupanija;
216
217DELIMITER //
218CREATE PROCEDURE minimalnaplacazupanija(sifrazupanije INT,OUT obradenizahtjevi INT, OUT brojdohvacenih INT)
219BEGIN
220
221 DECLARE placa DOUBLE;
222DECLARE flag BOOL;
223DECLARE idodjelica INT;
224
225 DECLARE kursoric CURSOR FOR SELECT odjel.sifOdjel
226 FROM odjel
227 JOIN radnik ON odjel.sifOdjel = radnik.sifOdjel
228 JOIN mjesto ON radnik.pbrStan = mjesto.pbrMjesto
229 JOIN zupanija ON mjesto.sifZupanija = zupanija.sifZupanija
230 WHERE zupanija.sifZupanija = sifrazupanije;
231
232 DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag=TRUE;
233
234 SET flag = FALSE;
235 SET brojdohvacenih=0;
236 SET obradenizahtjevi=0;
237
238 OPEN kursoric;
239 SELECT FOUND_ROWS() INTO brojdohvacenih;
240
241 petlja:LOOP
242
243 FETCH kursoric INTO idodjelica;
244
245 IF flag=TRUE THEN
246 LEAVE petlja;
247 END IF;
248
249 CALL minimalnaplaca(idodjelica);
250 SET obradenizahtjevi = obradenizahtjevi + 1;
251
252 END LOOP;
253 CLOSE kursoric;
254
255
256END; //
257DELIMITER ;
258
259
260CALL minimalnaplacazupanija(21, @a, @b);
261SELECT @a AS obradeno, @b AS dohvaceni;
262
263
264/* 5. U bazi studenti: Napisati funkciju koja će primiti naziv smjera. Funkcija mora svim studentima
265sa zadanog smjera postaviti datum upisa na 1.9.2016. Funkcija vraća broj obrađenih zapisa..
266Zadatak je potrebno riješiti koristeći kursore i odgovarajuće handlere.
267Napisati primjer poziva funkcije*/
268
269
270
271DROP FUNCTION IF EXISTS smjeroviupis;
272DELIMITER //
273CREATE FUNCTION smjeroviupis(snaziv VARCHAR(100))
274RETURNS VARCHAR(100)
275DETERMINISTIC
276BEGIN
277
278DECLARE sjmbag CHAR(10);
279DECLARE obradenih INT DEFAULT 0;
280DECLARE flag BOOL;
281
282DECLARE c CURSOR FOR SELECT studenti.jmbag
283 FROM studenti
284 JOIN smjerovi ON studenti.idSmjer = smjerovi.id
285 WHERE smjerovi.naziv = snaziv;
286
287DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag=TRUE;
288
289SET flag = FALSE;
290
291OPEN c;
292petlja:LOOP
293
294 IF flag=TRUE THEN
295 LEAVE petlja;
296 END IF;
297
298 FETCH c INTO sjmbag;
299
300 UPDATE studenti
301 SET datumUpisa = '2016-09-01'
302 WHERE jmbag = sjmbag;
303
304 SET obradenih=obradenih+1;
305
306 END LOOP;
307
308 CLOSE c;
309
310
311RETURN obradenih;
312
313END; //
314DELIMITER ;
315
316
317SELECT smjeroviupis("smjer informatika");
318
319
320
321/* 6. U bazi studenti: Napisati proceduru koja će primiti naziv županije i broj N. Procedura mora za
322sva mjesta u zadanoj županiji ispisati:
323a. Naziv mjesta
324b. „Velik broj nastavnika“ – ako u tom mjestu stanuje više od N nastavnika
325c. „Mali broj nastavnika“ – ako u tom mjestu stanuje N ili manje nastavnika
326Napisati primjer poziva procedure.
327*/
328
329DROP PROCEDURE IF EXISTS proceduralnazupanija;
330
331DELIMITER //
332CREATE PROCEDURE proceduralnazupanija(IN nazivzupanije VARCHAR(100) , IN N INT)
333BEGIN
334
335 DECLARE flag BOOL;
336 DECLARE mjestonaziv VARCHAR(50);
337 DECLARE broj INT DEFAULT 0;
338
339 DECLARE c CURSOR FOR SELECT mjesta.nazivMjesto, COUNT(nastavnici.jmbg)
340 FROM nastavnici
341 JOIN mjesta ON nastavnici.postBr = mjesta.postbr
342 JOIN zupanije ON mjesta.idZupanija = zupanije.id
343 WHERE zupanije.nazivZupanija = nazivzupanije
344 GROUP BY mjesta.nazivMjesto;
345
346 DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag=TRUE;
347
348 SET flag = FALSE;
349
350 DROP TEMPORARY TABLE IF EXISTS tmp;
351 CREATE TEMPORARY TABLE tmp (naziv VARCHAR(50), stanje VARCHAR(50));
352
353 OPEN c;
354
355 petlja:LOOP
356
357 FETCH c INTO mjestonaziv, broj;
358
359 IF flag=TRUE THEN
360 LEAVE petlja;
361 END IF;
362
363
364 IF broj > N THEN
365 INSERT INTO tmp(naziv, stanje) VALUES (mjestonaziv, "Velik broj nastavnika");
366 ELSE
367 INSERT INTO tmp(naziv, stanje) VALUES (mjestonaziv, "Mali broj nastavnika");
368 END IF;
369
370
371 END LOOP;
372 CLOSE c;
373SELECT * FROM tmp;
374
375END; //
376DELIMITER ;
377
378
379CALL proceduralnazupanija("Grad Zagreb", 17);
380
381
382
383
384/* 7. U bazi studenti: Napisati proceduru koja će studenta sa ocjenom 1 iz nekog kolegija
385kopirati u privremenu tablicu s atributima (opisUsmenog, ime, prezime, jmbag).
386U atribut opisUsmenog napisati "Usmeni iz: X, Y, Z..." XYZ su kolegiji iz kojih student ima
387barem jednu jedinicu.
388Napisati primjer poziva procedure. */
389
390
391DROP PROCEDURE IF EXISTS proceduralnistudenti;
392
393DELIMITER //
394CREATE PROCEDURE proceduralnistudenti()
395BEGIN
396
397 DECLARE flag BOOL;
398 DECLARE ime, prezime,knaziv VARCHAR(50);
399 DECLARE jj CHAR(10);
400
401 DECLARE broj INT DEFAULT 0;
402
403 DECLARE c CURSOR FOR SELECT DISTINCT studenti.ime, studenti.prezime, studenti.jmbag, kolegiji.naziv
404 FROM studenti
405 JOIN ocjene ON studenti.jmbag=ocjene.jmbagStudent
406 JOIN kolegiji ON ocjene.idKolegij=kolegiji.id
407 WHERE ocjene.ocjena=1;
408
409 DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag=TRUE;
410
411 SET flag = FALSE;
412
413 DROP TEMPORARY TABLE IF EXISTS tmp;
414 CREATE TEMPORARY TABLE tmp (opisUsmenog VARCHAR(50), ime VARCHAR(50), prezime VARCHAR(50), jmbag CHAR(10));
415
416 OPEN c;
417
418 petlja:LOOP
419
420 FETCH c INTO ime, prezime, jj, knaziv;
421
422 IF flag=TRUE THEN
423 LEAVE petlja;
424 END IF;
425
426 IF jj NOT IN(SELECT tmp.jmbag FROM tmp) THEN
427 INSERT INTO tmp(opisUsmenog, ime,prezime,jmbag) VALUES (CONCAT("usmeni iz:", knaziv), ime, prezime, jj) ;
428 ELSE
429 UPDATE tmp
430 SET opisUsmenog = CONCAT(opisUsmenog, ", ", knaziv)
431 WHERE jmbag = jj;
432 END IF;
433
434 END LOOP;
435 CLOSE c;
436SELECT * FROM tmp;
437
438END; //
439DELIMITER ;
440
441CALL proceduralnistudenti();
442
443
444
445/* 8. U bazi autoradionica: Napisati proceduru koja će ispisati podatke klijenta (ime, prezime i
446šifru), te uz njega ispisati iznos popusta koji je taj klijent ostvario. Popust se dodjeljuje po
447slijedećem principu:
448- 5% popusta za do 10 sati kvara,
449- 10% popusta za 11 do 20 sati kvara,
450- 15% popusta za 21 do 30 sati kvara,
451- 20% popusta za 31 do 40 sati kvara.
452Potrebno je koristiti kursor, handler i privremenu tablicu. Ispisati samo one klijente koji imaju
453pravo na popust. Osigurat da po završetku procedure privremena tablica više nije dostupna.
454Napisati primjer poziva procedure. */
455
456
457DROP PROCEDURE IF EXISTS radionicapopusti;
458
459DELIMITER //
460CREATE PROCEDURE radionicapopusti()
461BEGIN
462
463 DECLARE flag BOOL;
464 DECLARE ime, prezime VARCHAR(50);
465 DECLARE ss INT;
466 DECLARE sumica DOUBLE;
467
468 DECLARE broj INT DEFAULT 0;
469
470 DECLARE c CURSOR FOR SELECT klijent.imeKlijent, klijent.prezimeKlijent, klijent.sifKlijent, SUM(satiKvar)
471 FROM klijent
472 NATURAL JOIN nalog
473 NATURAL JOIN kvar
474 GROUP BY klijent.imeKlijent, klijent.prezimeKlijent, klijent.sifKlijent;
475
476
477 DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag=TRUE;
478
479 SET flag = FALSE;
480
481 DROP TEMPORARY TABLE IF EXISTS tmp;
482 CREATE TEMPORARY TABLE tmp (ime VARCHAR(50), prezime VARCHAR(50), sifra CHAR(10), iznospopusta VARCHAR(10) );
483
484 OPEN c;
485
486 petlja:LOOP
487
488 FETCH c INTO ime, prezime, ss, sumica;
489
490 IF flag=TRUE THEN
491 LEAVE petlja;
492 END IF;
493
494 IF sumica <=10 THEN
495 INSERT INTO tmp(ime,prezime,sifra,iznospopusta) VALUES (ime,prezime,ss,"5%");
496 END IF;
497
498 IF sumica <=20 AND sumica >=11 THEN
499 INSERT INTO tmp(ime,prezime,sifra,iznospopusta) VALUES (ime,prezime,ss,"10%");
500 END IF;
501 IF sumica <=30 AND sumica >=21 THEN
502 INSERT INTO tmp(ime,prezime,sifra,iznospopusta) VALUES (ime,prezime,ss,"15%");
503 END IF;
504 IF sumica <=40 AND sumica >=31 THEN
505 INSERT INTO tmp(ime,prezime,sifra,iznospopusta) VALUES (ime,prezime,ss,"20%");
506 END IF;
507
508
509 END LOOP;
510 CLOSE c;
511SELECT * FROM tmp;
512 DROP TEMPORARY TABLE IF EXISTS tmp;
513
514END; //
515DELIMITER ;
516
517CALL radionicapopusti();
518
519
520
521/* 9. U bazi studenti: Potrebno je tablici studenti dodati novi atribut prosjecnaOcjena.
522Napisati proceduru koja će pomoću kursora i handlera svim studentima izraÄunati
523njihovu prosjeÄnu ocjenu te ju upisat u novokreirani atribut. Ukoliko student nema nijednu ocjenu
524potrebno je upisati vrijednost 'NEOCJENJEN' (obratiti pažnju na
525tip podatka atributa prosjecnaOcjena). Procedura treba ispisat broj dohvaćenih
526podataka, te broj neocijenjenih studenata.
527Napisati primjer poziva procedure.*/
528
529ALTER TABLE studenti DROP COLUMN prosjecnaOcjena;
530ALTER TABLE studenti ADD COLUMN prosjecnaOcjena VARCHAR(50);
531
532DROP PROCEDURE IF EXISTS STUDAVG;
533
534DELIMITER //
535CREATE PROCEDURE STUDAVG()
536BEGIN
537
538
539DECLARE flag BOOL;
540
541 DECLARE prosjecic DOUBLE;
542 DECLARE sjmbag CHAR(10);
543 DECLARE neoc,DOH INT DEFAULT 0;
544
545 DECLARE c CURSOR FOR SELECT studenti.jmbag, AVG(ocjene.ocjena)
546 FROM studenti
547 LEFT JOIN ocjene ON studenti.jmbag=ocjene.jmbagStudent
548 GROUP BY studenti.jmbag;
549
550
551
552 DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag=TRUE;
553
554 SET flag = FALSE;
555
556 OPEN c;
557 SELECT FOUND_ROWS() INTO doh;
558 petlja:LOOP
559
560 FETCH c INTO sjmbag, prosjecic;
561
562 IF flag=TRUE THEN
563 LEAVE petlja;
564 END IF;
565
566
567 IF prosjecic IS NOT NULL THEN
568 UPDATE studenti
569 SET prosjecnaOcjena = prosjecic
570 WHERE studenti.jmbag=sjmbag;
571
572 ELSE
573 UPDATE studenti
574 SET prosjecnaOcjena = "NEOCIJENJEN"
575 WHERE jmbag = sjmbag;
576
577
578
579 SET neoc = neoc + 1;
580 END IF;
581 END LOOP;
582 CLOSE c;
583
584 SELECT doh AS Dohvaceni, neoc AS Neocijenjeni;
585END; //
586DELIMITER ;
587
588
589
590CALL STUDAVG();
591
592
593
594
595/* u bazi radionica: Napisati funkciju koja prima dvije šifre radnika. Ti radnici trebaju zamijeniti odjele i svoje već
596preuzete naloge.
597
598Potrebno je ažurirati naloge sukladno planu kao i šifre odjela kojima radnici priapdaju
599
600Funkcija vraća sljedeću poruku: Radnik IME_Prezime je zamijenio dojel s radnikom ime_prezime
601te njihovih br_naloga naloga
602
603Zadatak je potrebno riješiti s kursorom
604
605Napisati primjer poziva funkcije.*/
606
607DROP FUNCTION IF EXISTS fooRadnici;
608DELIMITER //
609CREATE FUNCTION fooRadnici(sif1 INT, sif2 INT)
610RETURNS VARCHAR(50)
611DETERMINISTIC
612BEGIN
613 DECLARE trenutni_sifra, trenutni_odj, drugi, temp INT;
614 DECLARE ime1, prez1, ime2, prez2 VARCHAR(50);
615 DECLARE flag BOOL;
616 DECLARE kur CURSOR FOR SELECT radnik.sifRadnik, radnik.imeRadnik, radnik.prezimeRadnik, radnik.sifOdjel FROM radnik
617 JOIN nalog ON radnik.sifRadnik = nalog.sifRadnik
618 JOIN odjel ON radnik.sifOdjel = odjel.sifOdjel
619 WHERE nalog.sifRadnik = sif1
620 OR nalog.sifRadnik = sif2;
621 DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag = TRUE;
622 SELECT imeRadnik INTO ime1 FROM radnik
623 WHERE sifRadnik= sif1;
624 SELECT imeRadnik INTO ime2 FROM radnik
625 WHERE sifRadnik= sif2;
626
627 OPEN kur;
628
629 petlja:LOOP
630 FETCH kur INTO trenutni_sifra, ime1, prez1, trenutni_odj;
631 IF flag = TRUE THEN
632 LEAVE petlja;
633 END IF;
634 IF trenutni_sifra = sif1 THEN
635 SELECT sifOdjel INTO drugi FROM radnik
636 WHERE sifRadnik = sif2;
637 SELECT sifOdjel INTO temp FROM radnik
638 WHERE sifRadnik = sif1;
639 UPDATE radnik
640 SET sifOdjel = drugi
641 WHERE sifRadnik = trenutni_sifra;
642 UPDATE radnik
643 SET sifOdjel = temp
644 WHERE sifRadnik = sif2;
645 ELSE
646 SELECT sifOdjel INTO drugi FROM radnik
647 WHERE sifRadnik = sif1;
648 SELECT sifOdjel INTO temp FROM radnik
649 WHERE sifRadnik = sif2;
650 UPDATE radnik
651 SET sifOdjel = drugi
652 WHERE sifRadnik = trenutni_sifra;
653 UPDATE radnik
654 SET sifOdjel = temp
655 WHERE sifRadnik = sif1;
656
657 END IF;
658 END LOOP;
659 CLOSE kur;
660 RETURN CONCAT("Radnik ", ime1, " je zamijenjen s ", ime2);
661END; //
662DELIMITER ;
663
664
665/* Ispisati radnike kojima je datum izvršenom naloga unutar zadnjih n godina,
666n je ono što se unosi u proceduru, ako ima 2 ili više sati kvara veći od pros sati kvara
667onda povećaju njegov koeficijent za 0,7 i ispisati u tmp table te promjenjene*/
668
669DELIMITER //
670CREATE PROCEDURE blic(IN godina INT)
671BEGIN
672 DECLARE avgKvar,koef FLOAT DEFAULT 0;
673 DECLARE flag BOOL DEFAULT FALSE;
674 DECLARE sif,sati,broj INT;
675
676 DECLARE curl1 CURSOR FOR SELECT radnik.sifRadnik,COUNT(kvar.satiKvar),radnik.KoefPlaca FROM kvar
677 JOIN nalog ON kvar.sifKvar=nalog.sifKvar
678 JOIN radnik ON nalog.sifRadnik=radnik.sifRadnik
679 WHERE YEAR(nalog.datPrimitkaNalog)>=YEAR(CURDATE())-godina
680 AND satiKvar>avgKvar
681 GROUP BY radnik.sifRadnik;
682
683 DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag=TRUE;
684
685 SELECT AVG(satiKvar) INTO avgKvar FROM kvar;
686
687 OPEN curl1;
688 DROP TEMPORARY TABLE IF EXISTS tmp;
689 CREATE TEMPORARY TABLE tmp(sifra INT,koefPlacePrije FLOAT,koefPlacePoslije FLOAT);
690 petlja:LOOP
691 IF flag=TRUE THEN LEAVE petlja;
692 END IF;
693 FETCH curl1 INTO sif,sati,koef;
694 IF sati>=2 THEN
695 INSERT INTO tmp VALUES(sif,koef,koef*1.3);
696 END IF;
697 END LOOP;
698 SELECT * FROM tmp;
699END;//
700DELIMITER ;