Upload
marica-bronza-poslek
View
51
Download
3
Embed Size (px)
Citation preview
Projektiranje informacijskih sustava - VJEŽBE
Osnove PL/SQL-a – Curosori i Exceptioni
Tomislav Gligora, struč.spec.ing.techn.inf.
Cursor-i
• CURSOR je privremeno radno područje kreirano u memoriji sustava nakon što je SQL naredba izvršena
• CURSOR sadrži informacije o SELECT naredbi i redcima podataka koju su naredbom dohvaćeni
• Privremeno radno područje se koristi kako bi se u njega mogli spremiti podaci dohvaćeni iz baze podataka, te se kasnije njima manipulirati
• CURSOR može sadržavati više od jednog retka, ali istovremeno može obrađivati isključivo jedan redak
• Skup redaka koji sadrži CURSOR naziva se ACTIVE SET
Tomislav Gligora, struč.spec.ing.techn.inf.
Cursor-i
• Postoje dva tipa CURSOR-a u PL/SQL-u:
1. Implicitni CURSOR-i
o Automatski se kreiraju prilikom izvođenja DML naredbi poput INSERT, UPDATE ili DELETE
o Također, automatski se kreiraju prilikom izvođenja SELECT naredbe koja dohvaća isključivo jedan redak
2. Eksplicitni CURSOR-i
o Moraju se kreirati prilikom dohvata više od jednog retka podataka unutar SELECT naredbe
o Iako CURSOR sadrži više redaka podataka, isključivo se na jednim retkom može izvršavati obrada, koji se naziva CURRENT ROW
o Nakon dohvata retka, CURRENT ROW POSITION se pomiče na sljedeći redak
• Oba tipa CURSOR-a imaju istu funkcionalnost, ali im se na različite načine pristupa
Tomislav Gligora, struč.spec.ing.techn.inf.
Implicitni CURSOR-i
• Prilikom izvršavanja DML naredbi DELETE, INSERT, UPDATE i SELECT, implicitni CURSOR-i se izvršavaju da bi procesuirali navedene naredbe
• PL/SQL podržava nekoliko atributa koji se nazivaju atributi implicitnih CURSOR-a, a čija je svrha provjera statusa izvođenja DML naredbi:
– %FOUND
– %NOTFOUND
– %ROWCOUNT
– %ISOPEN
• NPR:
– Kada se izvršavaju INSERT, UPDATE ili DELETE naredbe atributi implicitnog CURSOR-a sadrže informacije da li je bilo koji redak zahvaćen promjenama i koliko je takvih redaka
– Kada se izvrši SELECT…INTO naredba unutar PL/SQL bloka atributi implicitnog CURSOR-a mogu se koristiti za provjeru da li je dohvaćen bilo koji redak sa SELECT naredbom. PL/SQL vraća grešku ukoliko niti jedan redak nije zahvaćen SELECT naredbom
Tomislav Gligora, struč.spec.ing.techn.inf.
Implicitni CURSOR-i
Tomislav Gligora, struč.spec.ing.techn.inf.
Implicitni CURSOR-i - primjer
DECLARE
v_broj_redaka number(5);
BEGIN
UPDATE zaposlenici
SET placa = placa + 1000
WHERE placa <= 6000;
IF SQL%NOTFOUND THEN
dbms_output.put_line('Niti jednom zaposleniku nije povećana
plaća');
ELSIF SQL%FOUND THEN
v_broj_redaka := SQL%ROWCOUNT;
dbms_output.put_line('Placa ' || v_broj_redaka ||
'zaposlenika je povećana');
END IF;
END;
Tomislav Gligora, struč.spec.ing.techn.inf.
Eksplicitni CURSOR-i
• Kreira sa prilikom izvršavanja SELECT naredbe koja dohvaća više od jednog retka podataka
• Definira se u deklaracijskom bloku PL/SQL-a, sa proizvoljnim imenom
• Općenita sintaksa:
CURSOR cursor_name IS select_statement;
– cursor_name – proizvoljno ime CURSORA
– select_statment – SELECT upit koji dohvaća više od jednog retka
Tomislav Gligora, struč.spec.ing.techn.inf.
Eksplicitni CURSOR-i
• Način korištenja eksplicitnih CURSOR-a:
1. Deklaracija CURSOR-a u deklaracijskom bloku sa pripadnim SELECT izrazom – DECLARE
2. Otvaranje CURSOR-a u egzekucijskom bloku (begin…end) – OPEN
3. Prijenos podataka iz CURSOR-a u PL/SQL varijable ili recorde u egzekucijskom bloku (begin…end) – FETCH
4. Zatvaranje CURSOR-a u egzekucijskom bloku (begin…end) prije završetka cijelog PL/SQL bloka – CLOSE
Tomislav Gligora, struč.spec.ing.techn.inf.
Eksplicitni CURSOR-i
• PL/SQL podržava nekoliko atributa koji se nazivaju atributi eksplicitnih CURSOR-a, a čija je svrha kontrola procesuiranja podataka prilikom korištenja CURSOR-a.
• Te atribute koristimo kako bismo izbjegli greške prilikom pristupanja CURSOR-ima pomoću OPEN, FETCH i CLOSE naredbe
• Kada se može dogoditi pogreška prilikom pristupanja CURSOR-ima:
1. Kada pokušavamo otvoriti CURSOR koji nije zatvoren u prethodnim operacijama
2. Kada pokušavamo dohvatiti podatke iz CURSOR-a (FETCH) nakon zadnje odrađene operacije
Tomislav Gligora, struč.spec.ing.techn.inf.
Eksplicitni CURSOR-i
Tomislav Gligora, struč.spec.ing.techn.inf.
Eksplicitni CURSOR-i – primjer
declare
v_zap_rec zaposlenici%rowtype;
CURSOR c_zap IS
SELECT *
FROM zaposlenici
WHERE placa > 5000;
BEGIN
OPEN c_zap;
FETCH c_zap INTO v_zap_rec;
dbms_output.put_line (v_zap_rec.ime || ' ' ||
v_zap_rec.prezime);
CLOSE c_zap;
END;
• PROBLEM!!! Navedeni primjer dohvati u v_zap_rec rekord samo prvi redak podataka koji je dohvaćen u CURSOR-u c_zap = RJEŠENJE: upotreba petlje
Tomislav Gligora, struč.spec.ing.techn.inf.
Eksplicitni CURSOR-i – korištenje petlje
1. NAČIN – obična LOOP petlja
DECLARE
v_zap_rec zaposlenici%rowtype;
CURSOR c_zap IS
SELECT *
FROM zaposlenici
WHERE placa > 5000;
BEGIN
OPEN c_zap;
LOOP
FETCH c_zap INTO v_zap_rec;
EXIT WHEN c_zap%NOTFOUND;
dbms_output.put_line (v_zap_rec.ime || ' ' ||
v_zap_rec.prezime);
END LOOP;
CLOSE c_zap;
END;
Tomislav Gligora, struč.spec.ing.techn.inf.
Eksplicitni CURSOR-i – korištenje petlje
2. NAČIN – FOR petlja
DECLARE
v_zap_rec zaposlenici%rowtype;
CURSOR c_zap IS
SELECT *
FROM zaposlenici
WHERE placa > 5000;
BEGIN
FOR v_zap_rec in c_zap
LOOP
dbms_output.put_line (v_zap_rec.ime || ' ' ||
v_zap_rec.prezime);
END LOOP;
END;
Tomislav Gligora, struč.spec.ing.techn.inf.
Exception Handling – obrada iznimki
• PL/SQL sadržava funkcionalnost obrade iznimki koje se dogode unutar bloka naredbi – EXCEPTION HADNLING
• Korištenjem EXCEPTION-a programski kod se može testirati i spriječiti neočekivani izlazak iz programskih blokova
• Kada se EXCEPTION izvrši, dobiva se povratna poruka koja objašnjava što se dogodilo – PL/SQL EXCEPTION MESSAGE, sastoji se od tri djela:
1. TYPE OF EXCEPTION
2. ERROR CODE
3. MESSAGE
Tomislav Gligora, struč.spec.ing.techn.inf.
Exception Handling – obrada iznimki
• Općenita sintaksa
DECLARE
Declaration section
BEGIN
Exception section
EXCEPTION
WHEN ex_name1 THEN
-Error handling statements
WHEN ex_name2 THEN
-Error handling statements
WHEN Others THEN
-Error handling statements
END;
Tomislav Gligora, struč.spec.ing.techn.inf.
Exception Handling – obrada iznimki
• Tri tipa EXCEPTION-a
1. NAMED SYSTEM EXCEPTIONS
2. UNNAMED SYSTEM EXCEPTIONS
3. USER-DEFINED EXCEPTIONS
NAMED SYSTEM EXCEPTIONS
• Automatski se okidaju od strane DBMS-a, kada programski kod prekrši DBMS pravilo
• Zbog vrlo česte upotrebe takvih EXCEPTION-a dodijeljena su im imena od strane Oracle-a
• Karakteristike:
– Ne deklariraju se eksplicitno
– Podižu se implicitno kada se dogodi predefinirana Oracle pogreška
– Mogu se pozivati preko svojeg imena u programskom kodu
Tomislav Gligora, struč.spec.ing.techn.inf.
Exception Handling – obrada iznimki
NAMED SYSTEM EXCEPTIONS
Tomislav Gligora, struč.spec.ing.techn.inf.
Exception Handling – obrada iznimki
UNNAMED SYSTEM EXCEPTIONS
• Ne upotrebljavaju se često, stoga nisu niti imenovani od strane Oracle-a
• Sastoje se od EXCEPTION koda i EXCEPTION poruke
• Postoje dva načina obrade ovog tipa EXCEPTIONA:
– Korištenjem WHEN OTHER klauzule unutar EXCEPTIONA
– Dodjeljivanjem imena EXCEPTION kodu i kasnijim korištenjem kao imenovanog (NAMED) EXCEPTIONA
• Pravila za korištenje UNAMED EXCEPTIONA:
– Okidaju se implicitno
– Ukoliko nisu obuhvaćeni u WHEN OTHERS klauzuli moraju se okidati eksplicitno
– Za korištenje eksplicitnog okidanja potrebno ih je deklarirati korištenjem PRAGMA EXCEPTION_INIT naredbe u kojoj se definira ime EXCEPTIONA i dodjeljuje mu se postojeći EXCEPTION kod imenovanog EXCEPTIONA
Tomislav Gligora, struč.spec.ing.techn.inf.
Exception Handling – obrada iznimki
UNNAMED SYSTEM EXCEPTIONS
• Općenita sintaksa
DECLARE
exception_name EXCEPTION;
PRAGMA
EXCEPTION_INIT (exception_name, Err_code);
BEGIN
Execution section
EXCEPTION
WHEN exception_name THEN
handle the exception
END;
Tomislav Gligora, struč.spec.ing.techn.inf.
Exception Handling – obrada iznimki
UNNAMED SYSTEM EXCEPTIONS
• Primjer:
DECLARE
Child_exception EXCEPTION;
PRAGMA
EXCEPTION_INIT (Child_exception, -2292);
BEGIN
Delete
FROM artikli
where id= 1;
EXCEPTION
WHEN Child_exception THEN
Dbms_output.put_line('Postoji child redak za taj artikl id.');
END;
Tomislav Gligora, struč.spec.ing.techn.inf.
Exception Handling – obrada iznimki
USER DEFINED EXCEPTIONS
• Za razliku od sistemski EXCEPTIONA, moguće je definirati EXCEPTIONE koju su zasnovani na poslovnim pravilima određenog poslovnog sustava
• Pravila za korištenje USER DEFINED EXCEPTIONA
– Moraju biti eksplicitno deklariranu u deklaracijskom bloku (declar)
– Moraju biti eksplicitno pozivani u egzekucijskom bloku (begin…end)
– Moraju biti obrađivani u EXCEPTION bloku na način da se na njih referencira pomoću imena koje im je dodijeljeno u deklaracijskom bloku
Tomislav Gligora, struč.spec.ing.techn.inf.
Exception Handling – obrada iznimki
USER DEFINED EXCEPTIONS
• Primjer:
declare
e_velika_prodaja exception;
v_naziv varchar2(100);
v_ukupno number(10,2);
v_poruka varchar2(100);
v_gornja_granica constant number(10,2) := 500;
artikli_rec artikli%rowtype;
cursor c_prodaja is
select art.naziv, art.vpc * prd.kolicina as prodano
from artikli art
, prodaja prd
where prd.id_artikl = art.id;
Tomislav Gligora, struč.spec.ing.techn.inf.
Exception Handling – obrada iznimki
begin
for artikli_rec in c_prodaja loop
if artikli_rec.prodano > v_gornja_granica then
v_poruka := 'Ukupna prodaja za artikl ' || artikli_rec.naziv ||
' je veća od gornje granice. Dodatan popust
treba biti odobren';
raise e_velika_prodaja;
else
v_poruka := 'Ukupna prodaja za artikl ' || artikli_rec.naziv ||
' je manja od gornje granice.';
end if;
dbms_output.put_line(v_poruka);
end loop;
exception
when e_velika_prodaja then
dbms_output.put_line(v_poruka);
end;
Tomislav Gligora, struč.spec.ing.techn.inf.
Raise_Application_Error()
• RAISE_APPLICATION_ERROR je built-in procedura Oracle baze podataka koja se koristi za prikaz user-defined poruke o pogrešci sa brojem poruke koji je u skupu od -20000 do -20999
• Bez obzira kada se prikaže poruka korištenjem RAISE_APPLICATION_ERROR, sve prijašnje transakcije koje nisu potvrđene (commit) automatski se vraćaju u prijašnje stanje (rollback)
• RAISE_APPLICATION_ERROR se koristi:
– Da se kreira jedinstveni id za svaki user-defined EXCEPTION
– Da bi se postigla funkcionalnost da user-defined EXCEPTION izgleda kao i Oracle EXCEPTION
• Općenita sintaksa:
RAISE_APPLICATION_ERROR (error_number, error_message);
– error_number mora biti u rasponu od -20000 do -20999
– error_message je poruka koju želimo prikazati kada se dogodi navedena pogreška
Tomislav Gligora, struč.spec.ing.techn.inf.
Raise_Application_Error()
• Primjer:
declare
e_velika_prodaja exception;
v_naziv varchar2(100);
v_ukupno number(10,2);
v_poruka varchar2(100);
v_gornja_granica constant number(10,2) := 500;
artikli_rec artikli%rowtype;
cursor c_prodaja is
select art.naziv, art.vpc * prd.kolicina as prodano
from artikli art
, prodaja prd
where prd.id_artikl = art.id;
Tomislav Gligora, struč.spec.ing.techn.inf.
begin
for artikli_rec in c_prodaja loop
if artikli_rec.prodano > v_gornja_granica then
v_poruka := 'Ukupna prodaja za artikl ' || artikli_rec.naziv ||
' je veća od gornje granice. Dodatan popust
treba biti odobren';
raise e_velika_prodaja;
elsif artikli_rec.prodano <= v_gornja_granica then
v_poruka := 'Ukupna prodaja za artikl ' || artikli_rec.naziv ||
' je manja od gornje granice.';
end if;
dbms_output.put_line(v_poruka);
end loop;
exception
when e_velika_prodaja then
raise_application_error(-20001,v_poruka);
end;
Tomislav Gligora, struč.spec.ing.techn.inf.