2006. október 30.Markó Tamás, PTE TTK1 Az Oracle SQL 9. Triggerek és tárolt eljárások. Kliens oldali programok.
2006. október 30.Markó Tamás, PTE TTK2 A rádiótelefonokat kérem KIKAPCSOLNI!
2006. október 30.Markó Tamás, PTE TTK3 Triggerek
2006. október 30.Markó Tamás, PTE TTK4 A trigger Speciális programblokk (eljárás) Egy táblához vagy nézettáblához kapcsolódik Adatbázis-események hatására hajtódik végre –nem lehet meghívni, mint a „normál” eljárásokat PL/SQL nyelven íródik –az újabb Oracle-verziók a Java és a C használatát is támogatják Az adatbázisban tároljuk –a C-ben írt eljárások nem az adatbázisban vannak
2006. október 30.Markó Tamás, PTE TTK5 A triggereket kiváltó események DML-utasítások –INSERT, UPDATE, DELETE DDL-utasítások –CREATE, ALTER, DROP Rendszer-események –az adatbázis elindítása, leállítása, hibák Felhasználói események –bejelentkezés, kijelentkezés
2006. október 30.Markó Tamás, PTE TTK6 A triggerek fő alkalmazási lehetőségei Bonyolult, kényszerekben nem leírható adat- ellenőrzések Származtatott oszlopok értékének kiszámítása Naplózás Statisztikák gyűjtése a táblák eléréséről Nézettáblákon keresztül történő adatmódosítások megvalósítása
2006. október 30.Markó Tamás, PTE TTK7 Trigger létrehozása / módosítása DML-utasításhoz kapcsolódó triggernél az utasítás alapformája: CREATE [OR REPLACE] TRIGGER triggernév BEFORE | AFTER | INSTEAD OF [INSERT] [OR] [UPDATE] [OR] [DELETE] ON táblanév | nézetnév [FOR EACH ROW] [DECLARE deklarációk] BEGIN utasítások END; milyen eseményre induljon a végrehajtandó tevékenység előírása
2006. október 30.Markó Tamás, PTE TTK8 BEFORE / AFTER / INSTEAD OF Megadja, hogy a trigger a kiváltó esemény előtt, után vagy helyette fusson le BEFORE és AFTER csak táblákra használható –használatuk csak néhány apróságban különbözik INSTEAD OF csak nézettáblákra (view) használható
2006. október 30.Markó Tamás, PTE TTK9 :old és :new A mezők módosítás előtti és új értékét is el lehet érni INSERT esetén a régi érték (:old) NULL DELETE esetén az új érték (:new) NULL BEFORE triggerekben az új érték (:new) át is írható, pl. … IF :new.egysegar < 100 THEN :new.egysegar := 100; -- túl olcsó lenne! END IF; …
2006. október 30.Markó Tamás, PTE TTK10 1. példa triggerre CREATE OR REPLACE TRIGGER arvaltozas_kiirasa BEFORE DELETE OR INSERT OR UPDATE ON cikk FOR EACH ROW DECLARE ardiff number; BEGIN ardiff := :new.egysegar - :old.egysegar; dbms_output.put(:new.cikknev); dbms_output.put(’Régi ár: ' || :old.egysegar); dbms_output.put(' Új ár: ' || :new.egysegar); dbms_output.put_line(' Növekedés: ' || ardiff); END; / SQL*Plusban szükséges a végrehajtatáshoz kiírja a képernyőre a cikk nevét, régi és új árát és a két ár eltérését minden adatmódosító utasításnál elindul a CIKK tábla minden megváltozott sorára
2006. október 30.Markó Tamás, PTE TTK11 A DBMS_OUTPUT csomag üzeneteinek megjelenítése Az üzenetek kliens oldali megjelenítéséhez SQL*Plusban a SET SERVEROUTPUT ON SIZE ; utasítást ki kell előtte adni!
2006. október 30.Markó Tamás, PTE TTK12 legkorábban 18 éves korában lehet 1. éves, 19 éves korában 2. éves, stb. 2. példa triggerre CREATE OR REPLACE TRIGGER eleg_idos BEFORE INSERT OR UPDATE ON hallgato FOR EACH ROW DECLARE szul_evNUMBER(4); folyo_evNUMBER(4); BEGIN szul_ev := TO_NUMBER( TO_CHAR(:new.szul_dat, ‘YYYY’)); folyo_ev := TO_NUMBER( TO_CHAR(SYSDATE, ‘YYYY’)); IF szul_ev + :new.evfolyam + 17 > folyo_ev THEN RAISE_APPLICATION_ERROR (-20101, ‘Túl fiatal ahhoz, hogy ‘ || :new.evfolyam || ‘. éves legyen!’); END IF; END; / SQL*Plusban szükséges a végrehajtatáshoz adatbevitel / módosítás hatására indul el a HALLGATO tábla minden megváltozott sorára
2006. október 30.Markó Tamás, PTE TTK13 A triggereink adatainak megnézése Az alábbi táblában találunk információkat: –USER_TRIGGERS –ALL_TRIGGERS –DBA_TRIGGERS
2006. október 30.Markó Tamás, PTE TTK14 Trigger törlése Alakja: DROP TRIGGER triggernév; Példa: DROP TRIGGER arvaltozas_kiirasa;
2006. október 30.Markó Tamás, PTE TTK15 … és hol az ALTER TRIGGER? Van ilyen utasítás is Nem a trigger tevékenységének megváltoztatására szolgál Csak engedélyezni / letiltani / újra fordítani lehet vele a meglévő triggert
2006. október 30.Markó Tamás, PTE TTK16 1. feladat Trigger készítése, amely a VEVOK tábla módosítása (UPDATE) esetén egy VEVO_NAPLO nevű táblába beírja – minden módosított vevő (régi) kódját, –a módosítás idejét –és a módosítást végrehajtó felhasználó login- nevét Figyelem! A VEVO_NAPLO táblát is létre kell hozni!
2006. október 30.Markó Tamás, PTE TTK17 Megoldás - a tábla CREATE TABLE vevo_naplo ( vevokodVARCHAR2(8), modositvaDATE, kicsodaVARCHAR2(30) );
2006. október 30.Markó Tamás, PTE TTK18 Megoldás - a trigger CREATE OR REPLACE TRIGGER naploz AFTER UPDATE ON vevok FOR EACH ROW BEGIN INSERT INTO vevo_naplo (vevokod, modositva, kicsoda) VALUES (:old.vevokod, SYSDATE, USER); END; /
2006. október 30.Markó Tamás, PTE TTK19 Tárolt programok
2006. október 30.Markó Tamás, PTE TTK20 Tárolt program Az adatbázisban tároljuk Eljárás, függvény vagy programcsomag lehet –a csomagok változókat, eljárásokat és függvényeket tartalmazhatnak PL/SQL nyelven íródik –az újabb Oracle-verziók a Java és a C használatát is támogatják Nagymennyiségű adat feldolgozására a leghatékonyabb megoldás
2006. október 30.Markó Tamás, PTE TTK21 Tárolt eljárás létrehozása / módosítása CREATE [OR REPLACE] PROCEDURE név [(paraméterlista)] IS | AS [deklarációk] BEGIN utasítások [EXCEPTION kivételkezelés] END [név];
2006. október 30.Markó Tamás, PTE TTK22 Tárolt függvény létrehozása / módosítása CREATE [OR REPLACE] FUNCTION név [(paraméterlista)] RETURN adattípus IS | AS [deklarációk] BEGIN utasítások [EXCEPTION kivételkezelés] END [név]; a függvény adattípusa
23 Példa tárolt eljárás létrehozására CREATE OR REPLACE PROCEDURE ataraz (cikkcsoport INTEGER, szazalek NUMBER) IS -- A megadott cikkcsoportba tartozó termékek -- árának emelése az adott százalékkal. -- (Negatív százalék esetén árcsökkentést jelent.) szorzo NUMBER; BEGIN IF szazalek < -100 THEN RAISE_APPLICATION_ERROR(-20100, ‘Negatív lenne az ár!’); ELSE szorzo := (100 + szazalek) / 100; UPDATE cikk SET egysegar = egysegar * szorzo WHERE cikkcsop = cikkcsoport; COMMIT; END IF; END ataraz; / deklaráció paraméterek SQL*Plusban szükséges a végrehajtatáshoz
2006. október 30.Markó Tamás, PTE TTK24 Tárolt eljárás hívása SQL*Plus-ból Az EXECUTE paranccsal Példa: EXECUTE ataraz(1, 10);
2006. október 30.Markó Tamás, PTE TTK25 A forráskód tárolása az adatbázisban A USER_SOURCE nézettáblában történik (rekordonként egy sor) A példaként elkészített tárolt eljárás szövegének lekérdezése: SELECT text FROM USER_SOURCE WHERE name = ‘ATARAZ’ AND type = ‘PROCEDURE’ ORDER BY line; fontos a nagybetű! a sor száma a forráskódban
2006. október 30.Markó Tamás, PTE TTK26 Tárolt eljárás / függvény törlése Alakja: DROP PROCEDURE | FUNCTION név; Példa: DROP PROCEDURE ataraz;
2006. október 30.Markó Tamás, PTE TTK27 ALTER PROCEDURE / FUNCTION Van ilyen utasítás is Nem a kód megváltoztatására szolgál Csak újrafordítani lehet vele a meglévő eljárást / függvényt
2006. október 30.Markó Tamás, PTE TTK28 2. feladat Tárolt eljárás készítése az alábbiak szerint: –neve: torol –bemenő paraméter: egy vevő kódja –tevékenység: a vevő nyomtalan eltüntetése az adatbázisból Figyelem! A vevő addig nem törölhető, amíg más táblák hivatkoznak rá!
2006. október 30.Markó Tamás, PTE TTK29 2. feladat - megoldás CREATE OR REPLACE PROCEDURE torol (vevo VARCHAR2) IS BEGIN -- a tételek törlése a vevő megrendeléseiből: DELETE FROM rtetel WHERE rszam IN (SELECT rszam FROM rendel WHERE vevokod = vevo); -- a vevő megrendeléseinek törlése: DELETE FROM rendel WHERE vevokod = vevo; -- a vevő törlése: DELETE FROM vevok WHERE vevokod = vevo; COMMIT; EXCEPTION -- bármiféle hiba esetén visszagörgetés: WHEN OTHERS THEN ROLLBACK; END torol; / a hosszát itt nem kell megadni!
2006. október 30.Markó Tamás, PTE TTK30 Házi feladat Trigger készítése, ami a a VEVOK táblából történő törlés esetén az 1. feladatnál elkészített VEVO_NAPLO nevű táblába beírja – minden törölt vevő kódját, –a törlés idejét –és a törlést végrehajtó felhasználó login-nevét csupa kisbetűvel Tárolt eljárás készítése –bemenő paramétere egy dátum –a fenti VEVO_NAPLO táblából törli a megadott dátumnál régebbi bejegyzéseket
2006. október 30.Markó Tamás, PTE TTK31 Kliens oldali Oracle programok
2006. október 30.Markó Tamás, PTE TTK32 Az Oracle Client Kb. 25 alkalmazás rendszergazdáknak és server oldali fejlesztőknek Gyakrabban használt összetevők: –Enterprise Manager Console: grafikus felület adatbázisok felügyeletére és hangolására –SQLPlus Worksheet: grafikus felület SQL parancsok kiadására –SQL*Plus: karakteres felület SQL parancsok kiadására
2006. október 30.Markó Tamás, PTE TTK33 Az Oracle Developer 1. Kb. 15 alkalmazás (alapvetően kliens oldali) fejlesztőknek Gyakrabban használt összetevők: –Form Builder: adatbeviteli űrlapok (formok) készítésére (mint az Access űrlapok) –Report Builder: listák készítésére (mint az Access jelentések)
2006. október 30.Markó Tamás, PTE TTK34 Az Oracle Developer 2. Gyakrabban használt összetevők (folytatás): –Procedure Builder: triggerek, tárolt programok és kliens oldali PL/SQL programok készítésére –Graphics Builder: a tárolt adatokból diagramok készítésére –Query Builder: lekérdezések készítésére (mint Accessben)
2006. október 30.Markó Tamás, PTE TTK35 Oracle Designer Több, többé-kevésbé független eszköz gyűjteménye Fő funkciói: –üzleti folyamatok modellezése –adatbázis tervezése –alkalmazás-tervezés –az adatbázist előállító scriptek generálása –programok generálása
2006. október 30.Markó Tamás, PTE TTK36 TOAD A Quest Software nevű független cég terméke Kényelmes felület az adatbázis kezeléséhez –hasonló az SQL Developerhez, de sokoldalúbb A próbaverzió letölthető a címről