26
Projektiranje informacijskih sustava - VJEŽBE Osnove PL/SQL-a – Curosori i Exceptioni Tomislav Gligora, struč.spec.ing.techn.inf.

08 Vjezbe Osnove PLSQLa Cursori Exceptioni

Embed Size (px)

Citation preview

Page 1: 08 Vjezbe Osnove PLSQLa Cursori Exceptioni

Projektiranje informacijskih sustava - VJEŽBE

Osnove PL/SQL-a – Curosori i Exceptioni

Tomislav Gligora, struč.spec.ing.techn.inf.

Page 2: 08 Vjezbe Osnove PLSQLa Cursori Exceptioni

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.

Page 3: 08 Vjezbe Osnove PLSQLa Cursori Exceptioni

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.

Page 4: 08 Vjezbe Osnove PLSQLa Cursori Exceptioni

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.

Page 5: 08 Vjezbe Osnove PLSQLa Cursori Exceptioni

Implicitni CURSOR-i

Tomislav Gligora, struč.spec.ing.techn.inf.

Page 6: 08 Vjezbe Osnove PLSQLa Cursori Exceptioni

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.

Page 7: 08 Vjezbe Osnove PLSQLa Cursori Exceptioni

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.

Page 8: 08 Vjezbe Osnove PLSQLa Cursori Exceptioni

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.

Page 9: 08 Vjezbe Osnove PLSQLa Cursori Exceptioni

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.

Page 10: 08 Vjezbe Osnove PLSQLa Cursori Exceptioni

Eksplicitni CURSOR-i

Tomislav Gligora, struč.spec.ing.techn.inf.

Page 11: 08 Vjezbe Osnove PLSQLa Cursori Exceptioni

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.

Page 12: 08 Vjezbe Osnove PLSQLa Cursori Exceptioni

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.

Page 13: 08 Vjezbe Osnove PLSQLa Cursori Exceptioni

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.

Page 14: 08 Vjezbe Osnove PLSQLa Cursori Exceptioni

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.

Page 15: 08 Vjezbe Osnove PLSQLa Cursori Exceptioni

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.

Page 16: 08 Vjezbe Osnove PLSQLa Cursori Exceptioni

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.

Page 17: 08 Vjezbe Osnove PLSQLa Cursori Exceptioni

Exception Handling – obrada iznimki

NAMED SYSTEM EXCEPTIONS

Tomislav Gligora, struč.spec.ing.techn.inf.

Page 18: 08 Vjezbe Osnove PLSQLa Cursori Exceptioni

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.

Page 19: 08 Vjezbe Osnove PLSQLa Cursori Exceptioni

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.

Page 20: 08 Vjezbe Osnove PLSQLa Cursori Exceptioni

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.

Page 21: 08 Vjezbe Osnove PLSQLa Cursori Exceptioni

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.

Page 22: 08 Vjezbe Osnove PLSQLa Cursori Exceptioni

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.

Page 23: 08 Vjezbe Osnove PLSQLa Cursori Exceptioni

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.

Page 24: 08 Vjezbe Osnove PLSQLa Cursori Exceptioni

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.

Page 25: 08 Vjezbe Osnove PLSQLa Cursori Exceptioni

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.

Page 26: 08 Vjezbe Osnove PLSQLa Cursori Exceptioni

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.