08. plsql - procedure i funkcije - vjezba

27
VJEZBA

Upload: -

Post on 24-Dec-2015

277 views

Category:

Documents


12 download

DESCRIPTION

aa

TRANSCRIPT

Page 1: 08. PLSQL - Procedure i Funkcije - Vjezba

VJEZBA

Page 2: 08. PLSQL - Procedure i Funkcije - Vjezba
Page 3: 08. PLSQL - Procedure i Funkcije - Vjezba
Page 4: 08. PLSQL - Procedure i Funkcije - Vjezba

Priprema baze

• Baza sa prvog testa• skript

Page 5: 08. PLSQL - Procedure i Funkcije - Vjezba

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

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

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

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

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

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

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

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

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

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

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

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

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

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

• 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
Page 21: 08. PLSQL - Procedure i Funkcije - Vjezba

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

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

Metode (operacije) nad promenljivama tabelarnog tipa

Page 24: 08. PLSQL - Procedure i Funkcije - Vjezba

Primjer upotrebe

Page 25: 08. PLSQL - Procedure i Funkcije - Vjezba

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

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

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;