· 9 years ago · Nov 28, 2016, 08:32 AM
11.
2Napisati transakciju koja će kvaru s nazivom kvara Uštimavanje pokretnog krova promijeniti
3vrijednost satiKvara na 1. Potrebno je opozvati promjene koje je transakcija uÄinila
4
5
6
7SELECT * FROM kvar WHERE nazivKvar="Uštimavanje pokretnog krova"
8SET autocommit=0;
9BEGIN;
10UPDATE kvar
11SET satiKvar=1
12WHERE nazivKvar="Uštimavanje pokretnog krova";
13ROLLBACK;
14SET autocommit=0;
15
16SELECT * FROM kvar WHERE nazivKvar="Uštimavanje pokretnog krova"
17________________________________________________________________________________________
182.
19Napisati transakciju koja će kvaru s nazivom kvara 'Uštimavanje pokretnog krova' promijeniti
20vrijednost satiKvara na 3, te nakon toga obrisati sve kvarove Äija je vrijednost atributa
21satiKvar veća od 3. Potrebno je opozvati naredbu brisanja.
22
23SET autocommit =0;
24BEGIN;
25UPDATE kvar
26SET satiKvar=3
27WHERE nazivKvar="Uštimavanje pokretnog krova";
28COMMIT;
29DELETE FROM kvar WHERE satiKvar >3;
30ROLLBACK;
31SET autocommit=1;
32________________________________________________________________________________________
333.
34Napisati transakciju koja će unijeti novi zapis u relaciju i promijeniti podatke: u tablicu nalog
35unijeti podatke 1152, 31, 334, 2011-11-1, 2, 7 te tome nalogu naknadno promijeniti
36prioritetNalog na 1. Potrebno je potvrditi sve promjene.
37
38SET autocommit=0;
39BEGIN;
40INSERT INTO nalog VALUES('1152','31','334','2011-11-1','2','7');
41UPDATE nalog
42SET prioritetNalog=1 WHERE sifKlijent=1152 AND sifkvar=31 AND sifRadnik=334;
43COMMIT;
44SET autocommit=1;
45________________________________________________________________________________________
464.
47Napisati transakciju koja će radniku sa šifrom 277 smanjiti koeficijent plaće za 0.5, a radniku
48sa šifrom 313 povećati za isti iznos. Potvrditi da se promjena stvarno nije dogodila.
49
50SET autocommit=0;
51BEGIN;
52UPDATE radnik
53SET KoefPlaca=KoefPlaca-0.5 WHERE sifRadnik=277;
54UPDATE radnik
55SET KoefPlaca=KoefPlaca+0.5 WHERE sifRadnik=313;
56ROLLBACK;
57SET autocommit=1;
58_______________________________________________________________________________________
595.
60Napisati proceduru koja će za kvar sa zadanom šifrom, preko parametara vratiti naziv kvara.
61Potrebno je napisati primjer poziva procedure te ispisa rezultata
62
63DROP PROCEDURE IF EXISTS ispisKvara;
64DELIMITER //
65CREATE PROCEDURE ispisKvara(IN sifra INT,OUT naziv VARCHAR(50))
66 BEGIN
67 SELECT nazivKvar INTO naziv FROM kvar WHERE sifKvar=sifra;
68 END //
69DELIMITER ;
70
71SET @naziv="ništa";
72CALL ispisKvara(21,@naziv);
73SELECT @naziv;
74______________________________________________________________________________________
756.
76Napisati proceduru koja za zadani naziv županije, preko parametra vraća iznos najmanje i
77najveće plaće radnika koji živi u toj županiji. Potrebno je napisati primjer poziva PROCEDURE te
78ispisa rezultata.
79
80DROP PROCEDURE IF EXISTS placa;
81DELIMITER //
82CREATE PROCEDURE placa(IN zup VARCHAR(30),OUT najmanja INT,OUT najveca INT)
83 BEGIN
84 SELECT MIN(KoefPlaca*IznosOsnovice),MAX(KoefPlaca*IznosOsnovice) INTO najmanja,najveca FROM radnik
85 JOIN mjesto ON radnik.pbrStan=mjesto.pbrMjesto
86 JOIN zupanija ON mjesto.sifZupanija=zupanija.sifZupanija
87 WHERE nazivZupanija=zup;
88 END //
89DELIMITER ;
90
91SET @min=0,@max=0;
92CALL placa("Grad Zagreb",@min,@max);
93SELECT @min,@max;
94_____________________________________________________________________________________
957.
96Napisati proceduru koja zadanom kvaru povećava vrijednost atributa satiKvar za zadanu
97vrijednost. Procedura prima dva ulazna parametra: naziv kvara i broj sati (za koji će se uvećati
98vrijednost atributa satiKvar). Potrebno je napisati primjer poziva procedure.
99
100DROP PROCEDURE IF EXISTS kvar;
101DELIMITER //
102CREATE PROCEDURE kvar(IN naziv VARCHAR(50),IN brS INT)
103 BEGIN
104 UPDATE kvar
105 SET satiKvar=satiKvar+brS WHERE nazivKvar=naziv;
106 END //
107DELIMITER ;
108SELECT satiKvar FROM kvar WHERE nazivKvar ="Popravak radilice";
109CALL kvar("Popravak radilice",-3);
110____________________________________________________________________________________
1118.
112Napisati proceduru koja će primiti šifru kvara te preko iste varijable za zadani kvar vratiti
113vrijednost atributa satiKvar. Potrebno je napisati primjer poziva PROCEDURE te ispisa rezultata.
114
115DROP PROCEDURE IF EXISTS satkvar;
116DELIMITER //
117CREATE PROCEDURE satkvar(INOUT sif INT)
118 BEGIN
119 SELECT satiKvar INTO sif FROM kvar WHERE sifKvar=sif;
120 END //
121DELIMITER ;
122SET @var = 5;
123CALL satkvar(@var);
124SELECT @var;
125___________________________________________________________________________________
1269.
127Napisati proceduru koja će ispisati sve kvarove Äija je vrijednost atributa satiKvar veća od
128prosjeÄne vrijednosti satServisa iz tablice rezervacija na zadani dan u tjednu. Procedura preko
129parametra prima oznaku dana u tjednu. Potrebno je napisati primjer poziva procedure.
130
131DROP PROCEDURE IF EXISTS servis;
132DELIMITER //
133CREATE PROCEDURE servis(IN dan VARCHAR(2))
134 BEGIN
135 SELECT * FROM kvar WHERE satiKvar >
136 (SELECT AVG(satServis) FROM rezervacija WHERE datVrstaDan=dan);
137 END //
138DELIMITER ;
139
140CALL servis("SR")
141____________________________________________________________________________________
14210.
143Napisati proceduru koja će obrisati sve radnike u zadanom odjelu. Odjel je potrebno zadati
144preko njegovog imena (odjel.nazivOdjel). Potrebno je napisati primjer poziva procedure te
145ispisa rezultata
146
147DROP PROCEDURE IF EXISTS brisanje;
148DELIMITER //
149CREATE PROCEDURE brisanje(IN naziv VARCHAR(50))
150 BEGIN
151 UPDATE radnik
152 SET sifOdjel=0 WHERE sifOdjel
153 IN(SELECT sifOdjel FROM odjel WHERE nazivOdjel=naziv);
154 END //
155DELIMITER ;
156CALL brisanje("Limarija");
157___________________________________________________________________________________
15811.
159Modificirajte tablicu zupanija tako da dodate novi atribut brojMjesta tipa INT. Napišite
160proceduru koja prima šifru županije te popunjava atribut brojMjesta podatkom koliko se
161mjesta nalazi u toj županiji. Potrebno je napisati primjer poziva procedure.
162
163ALTER TABLE zupanija ADD COLUMN brojMjesta INT;
164
165DROP PROCEDURE IF EXISTS brM;
166DELIMITER //
167CREATE PROCEDURE brM(IN sifra INT)
168 BEGIN
169 DECLARE tmp INT DEFAULT 0;
170 SELECT COUNT(*) INTO tmp FROM mjesto WHERE sifZupanija=sifra;
171 UPDATE zupanija
172 SET brojMjesta=tmp WHERE sifZupanija=sifra;
173 END //
174DELIMITER ;
175
176CALL brM(2);
177___________________________________________________________________________________
17812.
179Modificirajte tablicu nalog tako da dodate novi atribut razlikaNalog tipa INT. Napisati
180proceduru koja prima šifru klijenta, šifru kvara i datum primitka naloga te u atribut
181razlikaNalog upisuje kolika je razlika između predviđenog trajanja za popravak kvara
182(satiKvar iz tablice kvar) i ostvarenih sati rada za popravak kvara po tom nalogu
183(ostvareniSatiRada). Potrebno je napisati primjer poziva PROCEDURE te ispisa rezultata.
184
185ALTER TABLE nalog ADD COLUMN razlikaNalog INT;
186
187DROP PROCEDURE IF EXISTS razlika;
188DELIMITER //
189CREATE PROCEDURE razlika(IN sifK INT,IN sifkvar INT,IN datum DATE)
190 BEGIN
191 DECLARE razlika,prvi,drugi INT DEFAULT NULL;
192 SELECT ostvareniSatiRada INTO prvi FROM nalog WHERE
193 sifKlijent=sifK AND sifKvar=sifkvar AND datPrimitkaNalog=datum;
194 SELECT satikvar INTO drugi FROM kvar WHERE sifKvar=sifkvar GROUP BY sifkvar;
195 SET razlika=prvi-drugi;
196 UPDATE nalog
197 SET razlikaNalog=razlika WHERE sifKvar=sifkvar AND sifKlijent=sifK AND datPrimitkaNalog=datum;
198 END //
199DELIMITER ;
200
201SELECT * FROM nalog
202CALL razlika('1272','31','2005-09-06')
203___________________________________________________________________________________
20413.
205Napisati funkciju koja vraća broj klijenata na Äijim je nalozima radio radnik (Å¡ifra radnika je
206ulazni parametar). Potrebno je napisati primjer poziva funkcije.
207
208DROP FUNCTION IF EXISTS brojK;
209DELIMITER //
210CREATE FUNCTION brojK(sifra INT) RETURNS INT
211 BEGIN
212 RETURN(SELECT DISTINCT COUNT(sifKlijent) FROM nalog WHERE sifRadnik=sifra);
213 END //
214DELIMITER ;
215SELECT brojK(481);
216__________________________________________________________________________________
21714.
218Napisati funkciju koja za zadanog radnika vraća koliko je klijenata registriralo vozilo u županiji
219u kojoj radi zadani radnik. Å ifru radnika funkcija mora primiti preko globalne varijable.
220Potrebno je napisati primjer poziva funkcije.
221
222DROP FUNCTION IF EXISTS radnik;
223DELIMITER //
224CREATE FUNCTION radnik(sifra INT)RETURNS INT
225 BEGIN
226 RETURN(
227 SELECT COUNT(klijent.sifKlijent) FROM nalog
228 JOIN klijent ON nalog.sifKlijent=klijent.sifKlijent
229 JOIN mjesto m1 ON klijent.pbrReg=m1.pbrMjesto
230 JOIN radnik ON nalog.sifRadnik=radnik.sifRadnik
231 JOIN mjesto m2 ON radnik.pbrStan=m2.pbrMjesto
232 WHERE radnik.sifRadnik=sifra AND m1.sifZupanija=m2.sifZupanija);
233 END //
234DELIMITER ;
235SET @var=142;
236SELECT radnik(@var);
237__________________________________________________________________________________
23815.
239Napisati funkciju koja generira jedinstveni identifikator klijenta. Funkcija prima šifru klijenta i
240vraća identifikator u obliku 'iprezime123' pri Äemu je:
241i – prvo slovo imena
242prezime – prezime klijenta
243Napredne baze podataka
2443 Priprema za prvi međuispit
245123 – posljednje tri brojke iz godine rođenja klijenta
246
247DROP FUNCTION IF EXISTS identifikator;
248DELIMITER //
249CREATE FUNCTION identifikator(id INT) RETURNS VARCHAR(30)
250 BEGIN
251 RETURN(SELECT CONCAT(LEFT(imeKlijent,1),prezimeKlijent,SUBSTR(jmbgKlijent,5,3)) FROM klijent WHERE sifKlijent=id);
252 END //
253DELIMITER ;
254
255SELECT identifikator(1139);
256__________________________________________________________________________________
25716.
258Napisati funkciju koja broji koliko je naloga zaprimljeno u posljednjih mjesec dana. Ako nije
259zaprimljen ni jedan nalog, funkcija mora vratiti -1 (inaÄe vraća broj naloga).
260
261DROP FUNCTION IF EXISTS brNalog;
262DELIMITER //
263CREATE FUNCTION brNalog() RETURNS INT
264 BEGIN
265 RETURN(SELECT COUNT(*) FROM nalog WHERE datPrimitkaNalog >= DATE_SUB(CURDATE(),INTERVAL 1 MONTH));
266 END //
267DELIMITER ;
268
269SELECT brNalog();
270_________________________________________________________________________________
27117.
272Napisati funkciju za unos novoga kvara u tablicu kvar. Ako se unosi kvar sa postojećom
273šifrom, potrebno je novom kvaru pridijeliti novu šifru i ispisati odgovarajuću poruku: Unijeli
274ste podatke o novom kvaru. Automatski mu je pridijeljena nova šifra novasifra. Ako se unosi
275kvar s korektnom šifrom, potrebno je vratiti poruku: Unijeli ste podatke o kvaru i dodijelili mu
276šifru novasifra. Potrebno je napisati primjer poziva funkcije i ispisa rezultata.
277
278DROP FUNCTION IF EXISTS unoskvar;
279DELIMITER //
280CREATE FUNCTION unoskvar(sifra INT) RETURNS VARCHAR(300)
281 BEGIN
282 DECLARE tmp INT DEFAULT 0;
283 SELECT MAX(sifkvar)+1 INTO tmp FROM kvar;
284 IF(sifra NOT IN (SELECT sifKvar FROM kvar))THEN
285 INSERT INTO kvar (sifKvar) VALUES(sifra);
286 RETURN(CONCAT('Unijeli ste podatke o novom kvaru i dodijelili mu šifru ',sifra));
287
288 ELSE
289 INSERT INTO kvar(sifKvar) VALUES(tmp);
290 RETURN(CONCAT('Unijeli ste podatke o novom kvaru. Automatski mu je pridijeljena nova šifra ',tmp));
291 END IF ;
292 END //
293DELIMITER ;
294 SELECT unoskvar(41);
295__________________________________________________________________________________
29618.OVAJ ZAD NIJE RJEÅ EN U POTPUNOSTI!!!
297Napisati funkciju koja će kapitalizirati prvo slovo svake rijeÄi u danom tekstu. Pretpostavite da
298rijeÄ poÄinje nakon nekog od sljedećih znakova: ' ', '&', '''', '_', '?', ';', ':', '!', ',', '-', '/', '(', '.'
299Potrebno je napisati primjer poziva funkcije i ispisa rezultata.
300
301DROP FUNCTION IF EXISTS capital;
302DELIMITER //
303CREATE FUNCTION capital(tekst VARCHAR(300)) RETURNS VARCHAR(300)
304 BEGIN
305 DECLARE tmp,result VARCHAR(300);
306 DECLARE flag BOOLEAN DEFAULT TRUE;
307 DECLARE counter INT DEFAULT 1;
308 DECLARE duzina INT;
309 SET tmp='';
310 SET duzina=LENGTH(tekst);
311 WHILE counter<duzina DO
312 IF (flag)THEN
313 SET result= CONCAT(tekst,UPPER(LEFT(tekst,1)));
314 SET flag = FALSE;
315
316 ELSE
317 SET tmp=LEFT(tekst,1);
318
319 IF tmp LIKE (' ', '&', '''', '_', '?', ';', ':', '!', ',', '-', '/', '(', '.') THEN
320 SET flag=TRUE;
321 END IF ;
322 SET result= CONCAT(result,tmp);
323 END IF ;
324 SET counter=counter+1;
325 END WHILE;
326 RETURN result;
327 END //
328DELIMITER ;
329
330SELECT capital('ocemo peticu iz matematike,hrvatskog');
331SELECT @result;
332___________________________________________________________________________________
33319.
334Napisati funkciju koja za ulazni parametar prima ulaznu varijablu pbr tipa integer. Funkcija
335nad tablicom radnik umanjuje vrijednost atributa KoefPlaca za 1 za sve zapise kod kojih je
336pbrStan jednak ulaznoj varijabli (pbr). Funkcija vraća broj 1. Zadatak je potrebno riješiti
337pomoću kursora.
338
339DROP FUNCTION IF EXISTS umanjivanje;
340DELIMITER //
341CREATE FUNCTION umanjivanje(pbr INT) RETURNS INT
342 BEGIN
343 DECLARE sif INT;
344 DECLARE error INT DEFAULT 0;
345 DECLARE kur CURSOR FOR SELECT sifradnik FROM radnik WHERE pbrStan=pbr;
346 DECLARE CONTINUE HANDLER FOR NOT FOUND
347 SET error=1;
348 OPEN kur;
349 petlja:LOOP
350 FETCH kur INTO sif;
351 IF error=1 THEN
352 LEAVE petlja;
353 END IF;
354 UPDATE radnik
355 SET koefPlaca=koefPlaca-1.00 WHERE sifradnik=sif;
356 END LOOP;
357 CLOSE kur;
358 RETURN 1;
359 END //
360DELIMITER ;
361
362SELECT * FROM radnik
363
364SELECT umanjivanje(10000);
365___________________________________________________________________________________
36620.
367Napisati proceduru koja će sve radnike promaknuti u viši odjel (odjel veći za 1 od trenutnog
368odjela). Procedura vraća broj promaknutih radnika. Obavezno je koristiti kursore.
369
370DROP PROCEDURE IF EXISTS promak;
371DELIMITER //
372CREATE PROCEDURE promak(OUT counter INT)
373 BEGIN
374
375 DECLARE sif INT;
376 DECLARE flag BOOL DEFAULT FALSE;
377 DECLARE kur CURSOR FOR SELECT sifRadnik FROM radnik;
378 DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag =TRUE;
379 SET counter =0;
380 OPEN kur;
381 petlja:LOOP
382 FETCH kur INTO sif;
383 IF flag IS TRUE THEN LEAVE petlja;
384 END IF;
385 UPDATE radnik
386 SET sifOdjel=sifOdjel+1 WHERE sifRadnik=sif;
387 SET counter=counter+1;
388 END LOOP;
389 CLOSE kur;
390 END //
391DELIMITER ;
392SET @var=0;
393CALL promak(@var);
394SELECT @var
395______________________________________________________________________________________
39621.
397Modificirati proceduru iz prethodnog zadatka na naÄin da promakne samo ONE radnike koji
398su iz zadanog mjesta (procedura prima naziv mjesta).
399
400DROP PROCEDURE IF EXISTS promak;
401DELIMITER //
402CREATE PROCEDURE promak(IN mjesto VARCHAR(30),OUT counter INT)
403 BEGIN
404
405 DECLARE sif INT;
406 DECLARE flag BOOL DEFAULT FALSE;
407 DECLARE kur CURSOR FOR SELECT sifRadnik FROM radnik
408 JOIN mjesto ON radnik.pbrStan=mjesto.pbrMjesto
409 WHERE mjesto.nazivMjesto=mjesto;
410 DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag =TRUE;
411 SET counter =0;
412 OPEN kur;
413 petlja:LOOP
414 FETCH kur INTO sif;
415 IF flag IS TRUE THEN LEAVE petlja;
416 END IF;
417 UPDATE radnik
418 SET sifOdjel=sifOdjel+1 WHERE sifRadnik=sif;
419 SET counter=counter+1;
420 END LOOP;
421 CLOSE kur;
422 END //
423DELIMITER ;
424SET @var=0;
425CALL promak('Zagreb',@var);
426SELECT @var;
427_______________________________________________________________________________________
42822.
429Modificirati proceduru iz prethodnog zadatka na naÄin da ako se radnik promiÄe u
430nepostojeći odjel (šifra odjela veća od maksimalne moguće), onda je potrebno opozvati
431promaknuće (rollback) a inaÄe potvrditi promaknuće(commit).
432
433
434DROP PROCEDURE IF EXISTS promak;
435DELIMITER //
436CREATE PROCEDURE promak(IN mjesto VARCHAR(30),OUT counter INT)
437 BEGIN
438
439 DECLARE sif,odj INT;
440 DECLARE flag BOOL DEFAULT FALSE;
441 DECLARE maximum INT;
442 DECLARE kur CURSOR FOR SELECT sifRadnik,sifOdjel FROM radnik
443 JOIN mjesto ON radnik.pbrStan=mjesto.pbrMjesto
444 WHERE mjesto.nazivMjesto=mjesto;
445 DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag =TRUE;
446 SET counter =0;
447 SELECT MAX(sifodjel) INTO maximum FROM odjel;
448 OPEN kur;
449 petlja:LOOP
450 FETCH kur INTO sif,odj;
451 IF flag IS TRUE THEN LEAVE petlja;
452 END IF;
453 SET autocommit=0;
454 START TRANSACTION;
455 SET odj=odj+1;
456 UPDATE radnik
457 SET sifOdjel=odj WHERE sifRadnik=sif;
458 SET counter=counter+1;
459 IF odj > maximum THEN ROLLBACK; ELSE COMMIT;
460 END IF;
461 END LOOP;
462 CLOSE kur;
463 END //
464DELIMITER ;
465SET @var=0;
466CALL promak('Zagreb',@var);
467SELECT @var;
468________________________________________________________________________________________
46923.
470Nadograditi proceduru iz prethodnog zadatka tako da vraća podatke o promaknutim
471radnicima (šifru radnika) te odjel kojem radnik nakon promaknuća pripada.
472
473DROP PROCEDURE IF EXISTS promak;
474DELIMITER //
475CREATE PROCEDURE promak(IN mjesto VARCHAR(30),OUT counter INT)
476 BEGIN
477
478 DECLARE sif,odj INT;
479 DECLARE flag BOOL DEFAULT FALSE;
480 DECLARE maximum INT;
481 DECLARE kur CURSOR FOR SELECT sifRadnik,sifOdjel FROM radnik
482 JOIN mjesto ON radnik.pbrStan=mjesto.pbrMjesto
483 WHERE mjesto.nazivMjesto=mjesto;
484 DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag =TRUE;
485 DROP TEMPORARY TABLE IF EXISTS tmpRadnik;
486 CREATE TEMPORARY TABLE tmpRadnik(sifRad INT,noviOdj INT);
487 SET counter =0;
488 SELECT MAX(sifodjel) INTO maximum FROM odjel;
489 OPEN kur;
490 petlja:LOOP
491 FETCH kur INTO sif,odj;
492 IF flag IS TRUE THEN LEAVE petlja;
493 END IF;
494 SET autocommit=0;
495 START TRANSACTION;
496 SET odj=odj+1;
497 UPDATE radnik
498 SET sifOdjel=odj WHERE sifRadnik=sif;
499 SET counter=counter+1;
500 INSERT INTO tmpRadnik VALUES(sif,odj);
501 IF odj > maximum THEN ROLLBACK; ELSE COMMIT;
502 END IF;
503 END LOOP;
504 CLOSE kur;
505 SELECT * FROM tmpRadnik;
506 END //
507DELIMITER ;
508SET @var=0;
509CALL promak('Zagreb',@var);
510SELECT @var;
511_________________________________________________________________________________________
51224.Tablici radnik dodati novi atribut brNaloga inicijalno postavljen na -1. Napisati proceduru
513koja će u novostvoreni atribut upisati koliko je naloga radnik obradio. Potrebno je obraditi
514sve radnike.
515
516ALTER TABLE radnik ADD COLUMN brNaloga INT DEFAULT -1;
517
518DROP PROCEDURE IF EXISTS nalozi;
519DELIMITER //
520CREATE PROCEDURE nalozi()
521 BEGIN
522 DECLARE counter,sif INT DEFAULT 0;
523 DECLARE flag BOOL DEFAULT FALSE;
524 DECLARE kur CURSOR FOR SELECT sifRadnik FROM radnik;
525 DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag=TRUE;
526
527 OPEN kur;
528 petlja:LOOP
529 FETCH kur INTO sif;
530 IF flag=TRUE THEN LEAVE petlja;
531 END IF;
532 SELECT COUNT(*) INTO counter FROM nalog WHERE sifRadnik=sif;
533 UPDATE radnik
534 SET brNaloga=counter WHERE sifRadnik=sif;
535 END LOOP;
536 CLOSE kur;
537 END //
538DELIMITER ;
539SELECT * FROM radnik
540CALL nalozi();
541____________________________________________________________________________________________
54225.
543Modificirati proceduru iz prethodnog zadatka da obradi samo ONE radnike koji su radili na
544zadanom kvaru (ulazni parametar u proceduru neka bude naziv kvara).
545
546DROP PROCEDURE IF EXISTS nalozi;
547DELIMITER //
548CREATE PROCEDURE nalozi(IN zad VARCHAR(50))
549 BEGIN
550 DECLARE counter,sif INT DEFAULT 0;
551 DECLARE flag BOOL DEFAULT FALSE;
552 DECLARE dohvaceno,obradeno INT DEFAULT 0;
553 DECLARE kur CURSOR FOR SELECT radnik.sifRadnik FROM radnik
554 JOIN nalog ON radnik.sifRadnik=nalog.sifRadnik
555 JOIN kvar ON nalog.sifKvar=kvar.sifKVar
556 WHERE kvar.nazivKvar=zad;
557 DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag=TRUE;
558
559 OPEN kur;
560 SELECT FOUND_ROWS() INTO dohvaceno;
561 petlja:LOOP
562 FETCH kur INTO sif;
563 IF flag=TRUE THEN LEAVE petlja;
564 END IF;
565 SELECT COUNT(*) INTO counter FROM nalog
566 JOIN radnik ON nalog.sifRadnik=radnik.sifRadnik WHERE radnik.sifRadnik=sif;
567 UPDATE radnik
568 SET brNaloga=counter WHERE sifRadnik=sif;
569 SET obradeno=obradeno+1;
570 END LOOP;
571 CLOSE kur;
572 SELECT dohvaceno,obradeno;
573 END //
574DELIMITER ;
575
576CALL nalozi('Zamjena blatobrana');
577____________________________________________________________________________________________
57826.
579Modificirati proceduru iz prethodnog zadatka na naÄin da se upiÅ¡e vrijednost brNaloga samo
580ako je veća od 10.
581
582
583
584
585DROP PROCEDURE IF EXISTS nalozi;
586DELIMITER //
587CREATE PROCEDURE nalozi(IN zad VARCHAR(50))
588 BEGIN
589 DECLARE counter,sif INT DEFAULT 0;
590 DECLARE flag BOOL DEFAULT FALSE;
591 DECLARE dohvaceno,obradeno INT DEFAULT 0;
592 DECLARE kur CURSOR FOR SELECT radnik.sifRadnik FROM radnik
593 JOIN nalog ON radnik.sifRadnik=nalog.sifRadnik
594 JOIN kvar ON nalog.sifKvar=kvar.sifKVar
595 WHERE kvar.nazivKvar=zad;
596 DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag=TRUE;
597
598 OPEN kur;
599 SELECT FOUND_ROWS() INTO dohvaceno;
600 petlja:LOOP
601 FETCH kur INTO sif;
602 IF flag=TRUE THEN LEAVE petlja;
603 END IF;
604 SELECT COUNT(*) INTO counter FROM nalog
605 JOIN radnik ON nalog.sifRadnik=radnik.sifRadnik WHERE radnik.sifRadnik=sif;
606 IF counter>10 THEN
607 UPDATE radnik
608 SET brNaloga=counter WHERE sifRadnik=sif;
609 SET obradeno=obradeno+1;
610 END IF;
611 END LOOP;
612 CLOSE kur;
613 SELECT dohvaceno,obradeno;
614 END //
615DELIMITER ;
616
617CALL nalozi('Zamjena blatobrana');
618_____________________________________________________________________________________________
61927.
620Modificirati proceduru iz prethodnog zadatka na naÄin da se ispisuju i podaci o radnicima
621kojima je promijenjena vrijednost atributa brNaloga. Neka se ispišu atributi sifRadnik i
622brNaloga.
623
624
625
626
627DROP PROCEDURE IF EXISTS nalozi;
628DELIMITER //
629CREATE PROCEDURE nalozi(IN zad VARCHAR(50))
630 BEGIN
631 DECLARE counter,sif INT DEFAULT 0;
632 DECLARE flag BOOL DEFAULT FALSE;
633 DECLARE dohvaceno,obradeno INT DEFAULT 0;
634 DECLARE kur CURSOR FOR SELECT radnik.sifRadnik FROM radnik
635 JOIN nalog ON radnik.sifRadnik=nalog.sifRadnik
636 JOIN kvar ON nalog.sifKvar=kvar.sifKVar
637 WHERE kvar.nazivKvar=zad;
638 DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag=TRUE;
639 DROP TEMPORARY TABLE IF EXISTS tmp;
640 CREATE TEMPORARY TABLE tmp(sifra INT,broj INT);
641 OPEN kur;
642 SELECT FOUND_ROWS() INTO dohvaceno;
643 petlja:LOOP
644 FETCH kur INTO sif;
645 IF flag=TRUE THEN LEAVE petlja;
646 END IF;
647 SELECT COUNT(*) INTO counter FROM nalog
648 JOIN radnik ON nalog.sifRadnik=radnik.sifRadnik WHERE radnik.sifRadnik=sif;
649 IF counter>10 THEN
650 UPDATE radnik
651 SET brNaloga=counter WHERE sifRadnik=sif;
652 SET obradeno=obradeno+1;
653 END IF;
654 INSERT INTO tmp VALUES (sif,counter);
655 END LOOP;
656 CLOSE kur;
657 SELECT * FROM tmp;
658
659 END //
660DELIMITER ;
661
662CALL nalozi('Zamjena blatobrana');
663________________________________________________________________________________________________
6642.DIO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
6651.
666U bazi radionica: Napisati transakciju koja će sve naloge zaprimljene u prvoj polovini
667sijeÄnja bilo koje godine pomaknuti za dva tjedna kasnije (potrebno je promijeniti datum
668primitka naloga). Također je potrebno prioritet tih naloga postaviti na maksimalnu vrijednost
669prioriteta naloga umanjenu za 1.
670Transakcija mora potvrditi samo prvu radnju a drugu opovrgnuti.
671Napisati primjere SELECT upita koji će se postaviti prije, za vrijeme i poslije transakcije
672kako bi se provjerila njena uÄinkovitost.
673SET autocommit=0;
674 BEGIN;
675 SELECT * FROM nalog;
676 UPDATE nalog
677 SET datPrimitkaNalog=DATE_ADD(datPrimitkaNalog,INTERVAL 14 DAY)
678 WHERE MONTH(datPrimitkaNalog)=1 AND DAY(datPrimitkaNalog)<=15;
679 COMMIT;
680 SELECT * FROM nalog;
681 SELECT MAX(prioritetNalog)-1 INTO @maks FROM nalog;
682 UPDATE nalog
683 SET prioritetNalog=@maks WHERE MONTH(datPrimitkaNalog)=1 AND DAY(datPrimitkaNalog)<=15;
684 ROLLBACK;
685 SELECT * FROM nalog;
686SET autocommit=1;
687_________________________________________________________________________________________________
6882.
689U bazi studenti: Napisati transakciju koja studente sa smjera 'smjer informatike' prebacuje
690na smjer 'smjer raÄunarstvo', te kolegije sa smjera 'smjer informatike' dodjeljuje
691smjeru 'smjer raÄunarstvo' te u naziv kolegija dodaje oznaku :"- prijenos".
692Nakon toga je potrebno obrisati 'smjer informatike'.
693Potrebno je poništiti sve promjene.
694Napisati primjere SELECT upita koji će se postaviti prije, za vrijeme i poslije transakcije
695kako bi se provjerila njena uÄinkovitost.
696
697SET autocommit=0;
698 SELECT * FROM studenti
699JOIN smjerovi ON studenti.idSmjer=smjerovi.id
700JOIN kolegiji ON smjerovi.id=kolegiji.idSmjer;
701 BEGIN;
702 SELECT id INTO @rac FROM smjerovi WHERE naziv="smjer raÄunarstvo";
703 SELECT id INTO @inf FROM smjerovi WHERE naziv="smjer informatika";
704 UPDATE studenti
705 SET idSmjer=@rac WHERE idSmjer=@inf;
706 SELECT * FROM studenti
707JOIN smjerovi ON studenti.idSmjer=smjerovi.id
708JOIN kolegiji ON smjerovi.id=kolegiji.idSmjer;
709 UPDATE kolegiji
710 SET idSmjer=@rac ,
711 naziv=CONCAT(naziv,"-prijenos") WHERE idSmjer=@inf;
712 DELETE FROM smjerovi WHERE naziv="smjer informatika";
713 SELECT * FROM studenti
714JOIN smjerovi ON studenti.idSmjer=smjerovi.id
715JOIN kolegiji ON smjerovi.id=kolegiji.idSmjer;
716 COMMIT;
717SET autocommit=1;
718________________________________________________________________________________________________
7193.
720U bazi studenti: napisati funkciju koja za studenta zadanog pomoću JMBAG-a vraća 1 ako ima barem jednu negativnu ocjenu, a 0 ako nema niti jednu negativnu ocjenu.
721Napisati proceduru koja za zadanog studenta vraća zakljuÄnu ocjenu na naÄin:
722- prosjek veći od 4,5 DO 5,0 - zakljuÄna 'odliÄan'
723- prosjek veći od 3,5 DO 4,5 - zakljuÄna 'vrlo dobar'
724- prosjek veći od 2,5 DO 3,5 - zakljuÄna 'dobar'
725- prosjek od 2,0 DO 2,5 - zakljuÄna 'dovoljan'
726- prosjek manji od 2,0 ili bilo koja ocjena=1 - zakljuÄna 'nedovoljan'
727Potrebno je koristiti ranije kreiranu funkciju za provjeru ima li neki student negativnu ocjenu.
728Napisati primjer poziva procedure.
729
730DROP FUNCTION IF EXISTS jedinica;
731DELIMITER //
732CREATE FUNCTION jedinica(jmbag VARCHAR(50)) RETURNS INT
733DETERMINISTIC
734 BEGIN
735 DECLARE brojac INT;
736 SELECT COUNT(jmbagStudent) INTO brojac FROM ocjene WHERE jmbagStudent=jmbag AND ocjena = 1;
737 IF brojac !=0 THEN SET brojac=1;
738 END IF;
739 RETURN brojac;
740 END //
741DELIMITER ;
742SELECT jedinica("0128050853");
743
744DROP PROCEDURE IF EXISTS prosjek;
745DELIMITER //
746CREATE PROCEDURE prosjek(IN jmbag VARCHAR(10),OUT poruka VARCHAR(50))
747 BEGIN
748 DECLARE pao INT;
749 DECLARE pros DOUBLE;
750 SELECT AVG(ocjena) INTO pros FROM ocjene WHERE jmbagStudent=jmbag;
751 SELECT jedinica(jmbag) INTO pao;
752
753 IF pao=1 OR pros<2 THEN SET poruka= "zakljuÄna 'nedovoljan'";END IF;
754 IF pros >4.5 THEN SET poruka= "zakljuÄna 'odliÄan'";END IF;
755 IF pros < 4.5 AND pros > 3.5 THEN SET poruka= "zakljuÄna 'vrlo dobar'";END IF;
756 IF pros <3.5 AND pros > 2.5 THEN SET poruka= "zakljuÄna 'dobar'";END IF;
757 IF pros <2.5 AND pros >2.0 THEN SET poruka= "zakljuÄna 'dovoljan'";END IF;
758
759
760 END //
761DELIMITER ;
762
763CALL prosjek("0246022345",@a);
764SELECT @a;
765____________________________________________________________________________________________________