08. plsql - procedure i funkcije - vjezba
DESCRIPTION
aaTRANSCRIPT
VJEZBA
Priprema baze
• Baza sa prvog testa• skript
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.
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;
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;
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
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;
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.
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;
Zadatak 5
• Napisati funkciju koja vraća broj zaposlenih koji imaju validan jmbg. Potom je pozvati kroz glavni program. (za prebrojavanje koristiti kursor)
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;
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
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
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;
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
Zadatak 9
• Napisati funkciju koja kao argument uzima broj koji predstavlja sifru projekta a vraća sve podatke o projektu
• 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;
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;
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
Metode (operacije) nad promenljivama tabelarnog tipa
Primjer upotrebe
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.
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.
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;