Download - 08. PLSQL - Procedure i Funkcije - Vjezba
![Page 1: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/1.jpg)
VJEZBA
![Page 2: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/2.jpg)
![Page 3: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/3.jpg)
![Page 4: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/4.jpg)
Priprema baze
• Baza sa prvog testa• skript
![Page 5: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/5.jpg)
Zadatak 1
• Napisati funkciju validiraj_jmbg (p_jmbg in zaposleni.jmbg%TYPE,p_datum in date) koja provjerava da li unijeti jmbg za zaposlenog validan. Validacija se radi tako sto se provjeri da li su prva dva broja jmbg-a isto sto i prva dva broja datuma. Funkcija za nalazenje podstringa je SUBSTR( string, start_position, length ). Ako je jmbg validan funkcija treba da vrati 1 inace vraca 0.
![Page 6: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/6.jpg)
Rjesenje • create or replace function validiraj_jmbg (p_jmbg in zaposleni.jmbg%TYPE,p_datum date) • RETURN INTEGER• IS • str1 CHAR(2);• str2 CHAR(2);• ind INTEGER;• begin • str1 := substr(p_jmbg,1,2);• str2 := substr(p_datum,1,2);• IF (str1 = str2) THEN• ind := 1;• ELSE• ind := 0;• END IF; • RETURN ind;• End validiraj_jmbg;
![Page 7: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/7.jpg)
Zadatak 2
• Testirati funkciju iz prethodnog zadatka
declare indi number;beginindi := validiraj_jmbg('01','01.FEB.2006');DBMS_OUTPUT.PUT_LINE('to je '||indi);end;
![Page 8: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/8.jpg)
Zadatak 3
• Napisati proceduru uvecaj_platu (p_id in zaposleni.z_id%TYPE) koja uvećava platu za 10% zaposlenom ciji je id jednak p_id
![Page 9: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/9.jpg)
Rjesenje
create or replace procedure uvecaj_platu (p_id in zaposleni.z_id%TYPE)as begin update zaposleni set plata = plata + 0.1 *plata where z_id = p_id;end uvecaj_platu;
![Page 10: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/10.jpg)
Zadatak 4
Napisati proceduru nadji_vrijednost(p_id in zaposleni.z_id%TYPE,p_plata out number) koja trazi vrijednost plate za zaposlenog sa id-om p_id i vrijednost vraća preko p_plata. Obraditi i izuzetak ako zaposleni sa predatim id-em ne postoji.
![Page 11: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/11.jpg)
Rjesenje
create or replace procedure nadji_vrijednost(p_id in zaposleni.z_id%TYPE,p_plata out number)is begin
DBMS_OUTPUT.PUT_LINE('trazim vrijednost plate za zaposlenog sa id-om :');
select plata into p_plata from zaposleniwhere z_id = p_id;
exception when no_data_found thendbms_output.put_line('ne postoji zaposleni sa unijetim id');
End nadji_vrijednost;
![Page 12: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/12.jpg)
Zadatak 5
• Napisati funkciju koja vraća broj zaposlenih koji imaju validan jmbg. Potom je pozvati kroz glavni program. (za prebrojavanje koristiti kursor)
![Page 13: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/13.jpg)
CREATE OR REPLACE FUNCTION get_valid_count2RETURN NUMBERISCURSOR zap_cursor ISSELECT * FROM zaposleni;zap_rec zaposleni%ROWTYPE;temp NUMBER;rezultat NUMBER :=0;BEGIN
OPEN zap_cursor;LOOP
FETCH zap_cursor INTO zap_rec;EXIT WHEN zap_cursor%NOTFOUND;temp := validiraj_jmbg(zap_rec.jmbg,zap_rec.datum_rodjenja);IF temp = 1 THEN
rezultat := rezultat + 1;END IF;
END LOOP;RETURN rezultat;
END;--------------------------------------------------show errors function get_valid_count2;declare result number;begin result := get_valid_count2;dbms_output.put_line('Broj zaposlenih koji imaju validan jmbg je :'||result);End get_valid_count2;
![Page 14: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/14.jpg)
Zadatak 6
• Napisati proceduru drugi_najmladji(p_datum out zaposleni.datum_rodjenja%type) koja promjenjivu p_datum setuje da bude datum rodjenja drugog po redu najmladjeg zaposlenog
![Page 15: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/15.jpg)
Zadatak 7
• Standardna baza sa vjezbi.
• Napisasti program koji sa konzole prihvata id rukovodioca i u promjenjivu tipa rekord cuva podatke o projektu kojim on rukovodi. Obraditi slucajeve kada upit ne vrati ni jednu torku NO_DATA_FOUND i kada vrati vise od jedne torke TOO_MANY_ROWS
![Page 16: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/16.jpg)
ACCEPT P_ruk PROMPT 'Unesi sifru rukovodioca' DECLARE V_Proj Projekat%ROWTYPE; BEGIN
SELECT * INTO V_Proj FROM Projekat WHERE Ruk = &P_ruk;
EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('Nije selektovana ni jedna torka ...'); RAISE NO_DATA_FOUND; WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('Selektovano je vise od jedne torke ...'); RAISE;
END;
![Page 17: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/17.jpg)
Zadatak 8
• Napisati program koji Svakom radniku koji ima platu manju od 2000 povecava platu za 10%.
• SELECT ... • FROM ... • FOR UPDATE [OF column_list][NOWAIT];
• UPDATE ... | DELETE ... • WHERE CURRENT OF naziv_kursora
![Page 18: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/18.jpg)
Zadatak 9
• Napisati funkciju koja kao argument uzima broj koji predstavlja sifru projekta a vraća sve podatke o projektu
![Page 19: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/19.jpg)
• CREATE OR REPLACE FUNCTION F_SEL_Projekat • (P_Spr IN Projekat.Spr%TYPE) RETURN Projekat%ROWTYPE • IS • V_Proj Projekat%ROWTYPE; • BEGIN
SELECT * INTO V_Proj FROM Projekat WHERE Spr = P_Spr; RETURN V_Proj;
• EXCEPTION WHEN NO_DATA_FOUND THEN RETURN NULL;
• END F_SEL_Projekat;
![Page 20: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/20.jpg)
![Page 21: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/21.jpg)
PL/SQL tip indeksirane tabele
• Deklarisanje TYPE type_name IS TABLE OF {column_type | variable%TYPE | table.column%TYPE} [NOT NULL] | table%ROWTYPE [INDEX BY BINARY_INTEGER]; identifier type_name;
![Page 22: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/22.jpg)
PL/SQL tip indeksirane tabele
• Referenciranje elementa tabele (niza)
identifier(index) indetifier(ind1)...(indn) – za višedimenzionalne strukture
• Referenciranje polja sloga, koji predstavlja element tabele (niza)
identifier(index).field_name
![Page 23: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/23.jpg)
Metode (operacije) nad promenljivama tabelarnog tipa
![Page 24: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/24.jpg)
Primjer upotrebe
![Page 25: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/25.jpg)
Zadatak 10
• Napisati funkciju koja će, u okviru jedne transakcije, putem kursora, preuzimati, redom, sve torke iz tabele Projekat i prebacivati ih, jednu po jednu, u PL/SQL tabelarnu kolekciju. Takva tabelarna kolekcija treba da predstavlja izlazni podatak funkcije.
• Proveriti ispravnost rada funkcije pozivima na konkretnim primjerima.
![Page 26: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/26.jpg)
Zadatak 11
• Napisati funkciju koja će, u okviru jedne transakcije, putem kursora, preuzimati, redom, sve torke iz tabele Projekat, uređene u opadajućem redosledu šifri projekata, i prebacivati ih u PL/SQL tabelarnu kolekciju. Tabelarna kolekcija je kolekcija rekorda koji nose sledece podatke – sifra projekta, naziv, broj radnika koji rade na projektu.
• Provjeriti ispravnost rada funkcije pozivima na konkretnim primjerima.
![Page 27: 08. PLSQL - Procedure i Funkcije - Vjezba](https://reader031.vdocuments.pub/reader031/viewer/2022012314/55cf9222550346f57b93ec53/html5/thumbnails/27.jpg)
Zadatak – potpuna validacija jmbg-a
• create or replace function validiraj_potpuna(p_jmbg in zaposleni.jmbg%TYPE,p_datum in date)• return integer• is• s1 varchar(7);• s2 varchar(7);• pom date;• begin• s1:=substr(p_jmbg,1,7);• s2:=TO_CHAR(p_datum,'ddmmyyy');•
• if (s1=s2) then • return 1;• else• return 0;• end if;•
• end validiraj_potpuna;