180 likes | 270 Views
Adatbázisok használata 1. (10. gyakorlat). 2012. tavaszi félév Vitéz Gergely. A diasor ismerete nem helyettesíti a tankönyvet, és a példatárat. A diasor ismerete szükséges, de nem elégséges feltétele a minimum elégséges érdemjegynek!. Kivételkezelés. Azonosítóval ellátott esemény
E N D
Adatbázisok használata 1.(10. gyakorlat) 2012. tavaszi félév Vitéz Gergely
A diasor ismerete nem helyettesíti a tankönyvet, és a példatárat. A diasor ismerete szükséges, de nem elégséges feltétele a minimum elégséges érdemjegynek!
Kivételkezelés • Azonosítóval ellátott esemény • Ha bekövetkezik, a PL/SQL blokk futása megszakad • A vezérlés a kivételkezelő blokkra adódik • Hibák esetén fordul elő, vagy ha előidézzük a RAISE kulcsszóval
Kivételkezelés • PL/SQL kulcsszavak: • DECLARE • --változók deklarálása • BEGIN • --programkód • EXCEPTION • WHEN kivétel THEN • WHEN OTHERS THEN --minden egyéb kivétel • --kivételkezelő blokk • END; • / • Próbáljuk meg előidézni a következő dián kezelt kivételeket!
Kivételkezelés • SET serveroutput ON • DECLARE • v_szam NUMBER(5); • BEGIN • SELECT sal INTO v_szam FROM emp WHERE ename = 'KING'; • dbms_output.put_line('Az eredmény: ' || v_szam); • EXCEPTION • WHEN ZERO_DIVIDE THEN • dbms_output.put_line('Nullával nem oszthatsz!'); • WHEN NO_DATA_FOUND THEN • dbms_output.put_line('Nincs eredmény!'); • WHEN TOO_MANY_ROWS THEN • dbms_output.put_line('Túl sok eredmény!'); • WHEN OTHERS THEN • dbms_output.put_line(SQLCODE); • dbms_output.put_line(SQLERRM); • END; • /
Saját kivétel • DECLARE részben deklarálni kell • A RAISE kulcsszóval lehet kiváltani • DECLARE • kivetel EXCEPTION; • BEGIN • IF feltétel • THEN RAISE kivetel; • … • Próbáljunk egy saját kivételkezelést megvalósítani
Saját kivétel • SET serveroutput ON • DECLARE • v_szam NUMBER; • gazdag EXCEPTION; • BEGIN • SELECT sal INTO v_szam FROM emp WHERE ename = 'KING'; • IF v_szam > 4000 THEN • RAISE gazdag; • ELSE • dbms_output.put_line(v_szam); • END IF; • EXCEPTION • WHEN gazdag THEN • dbms_output.put_line('Gazdag'); • WHEN OTHERS THEN • dbms_output.put_line(SQLCODE); • dbms_output.put_line(SQLERRM); • END; • /
Alprogramok • Névvel ellátott blokkok • Fogadhatnak paramétereket • Lehet visszatérési értékük • Tárolt Eljárások: PROCEDURE • Nincs visszatérési értéke • Függvények: FUNCTION • Van visszatérési értéke
Tárolt eljárások CREATE OR REPLACE PROCEDURE {eljárásnév} [ ({paraméterlista}) ] IS [{lokális változók}] BEGIN {utasítások} [EXCEPTION …] END; /
Tárolt eljárások • Futtatása PL/SQL blokkon belül: eljárás(paraméterek); • Futtatása PL/SQL blokkon kívülről: EXECUTE {eljárásnév(paraméterek)}; • Törlés: DROP PROCEDURE {eljárásnév};
Tárolt eljárások • CREATE OR REPLACE • PROCEDURE kiir( • szoveg VARCHAR2 DEFAULT 'semmi') • IS • v_atad VARCHAR2(200); • BEGIN • v_atad := szoveg; • dbms_output.put_line(v_atad); • END; • / • set serveroutput on • execkiir; • execkiir(‘proba');
Függvények CREATE OR REPLACE FUNCTION {eljárásnév} [ ({paraméterlista}) ] RETURN {típus} IS [{lokális változók}] BEGIN {utasítások} [EXCEPTION …] END; /
Függvények • CREATE OR REPLACE • FUNCTION osszead( • elso NUMBER, • masodik NUMBER) • RETURN NUMBER • IS • v_eredmeny NUMBER; • BEGIN • v_eredmeny:= elso + masodik; • RETURN v_eredmeny; • END; • / • SET serveroutput ON • EXEC dbms_output.put_line(osszead(2,3));
Triggerek • Adott esemény bekövetkezésére reagálunk (tárolt eljárást futtat) • INSERT, UPDATE, DELETE, CREATE, ALTER, DROP • Mikor: BEFORE, AFTER, INSTEAD OF • Bekövetkezhet műveletenként, soronként: FOR EACH ROW • Soronként az egyes sorok régi és új adatai is elérhetőek :NEW, :OLD
Triggerek CREATE OR REPLACE TRIGGER {név}[BEFORE | AFTER | INSTEAD OF]{esemény} [OR {esemény} …]ON {tábla} [FOR EACH ROW [WHEN {feltétel}]] [DECLARE {változók}] BEGIN {utasítások} [EXCEPTION …] END;
Trigger példa DROP TABLE dolgozo; CREATE TABLE dolgozo AS SELECT * FROM emp; CREATE OR REPLACE TRIGGER SomeTrigger BEFORE DELETE OR INSERT OR UPDATE ON dolgozo FOR EACH ROW BEGIN IF INSERTING THEN IF :NEW.sal < 1000 THEN raise_application_error(-20000, 'Hiba: túlkicsi a fizetés!'); END IF; dbms_output.put_line('Uj: ' || :NEW.ename); ELSIF DELETING THEN dbms_output.put_line('Töröl: ' || :OLD.ename); ELSIF UPDATING THEN dbms_output.put_line('Módosít: ' || :OLD.ename || ' ==>' || :NEW.ename); END IF; END; /
Triggerek • Triggerek letiltása: • ALTER TRIGGER SomeTriggerdisable; • Engdélyezés: • ALTER TRIGGER SomeTriggerdisable; • Saját alkalmazáshiba dobása: • raise_application_error(-20000, 'Hiba'); • A szám tetszőleges -20000 és -20999 között
Köszönöm a figyelmet! Anyag: Példatár 10. fejezet NagyZH pótlás Pénteken 16:00-tól, 18:00-tól, 20:00-tól az 1.13, 1.14, 2.10, 2.20 laborokban! http://www.orakulum.com http://jerry.gorextar.hu/ab1 vitez.gergely@spectronet.hu