240 likes | 347 Views
Adatbázis rendszerek II. Kovács László. Az SQL procedurális kiegészítése PL/SQL. Az SQL korlátai. Az SQL nyelv az adatbázis manipulálásra szolgálnak, nem tartalmaz: - változó kezelést - vezérlési elemeket - file IO - képernyő kezelés - hibakezelés .
E N D
Adatbázis rendszerek II Kovács László Az SQL procedurális kiegészítése PL/SQL
Az SQL korlátai Az SQL nyelv az adatbázis manipulálásra szolgálnak, nem tartalmaz: - változó kezelést - vezérlési elemeket - file IO - képernyő kezelés - hibakezelés ... Nem programozási nyelv, nem is arra használjuk. De néha jó lenne, ha mégis az lenne,...
Üzleti logika elhelyezése adatbázis Kliens üzleti logika Nagy hálózati forgalom Decentralizált karbantartás Lassabb végrehajtás Kliens Adatbázis üzleti logika Kis hálózati forgalom Centralizált karbantartás Gyorsabb végrehajtás
Üzleti logika és adatbázis integrálása Az üzleti logika procedurális nyelven definiált. Alkalmazható programozási nyelvek: - külső (pl. java, C) - saját - SQL/kiegészítés Külső: alkalmazzák (pl. Postgres) +: ismert, sok funkció -: laza integráció,védelem Saját: ritkán alkalmazzák (pl. VFP) +: testre szabható -: új ismereteket igényel, zártság SQL kiegészítés: sokan alkalmazzák (pl. Oracle, SQLServer) +: szoros integráció -: sok új elem van a nyelvben, zártság
PL/SQL alapjai PL/SQL: az Oracle SQL kiegészítése a procedurális elemeket definiálására A PL/SQL kódok építő köve a PL/SQL blokk DECLARE Deklarációs rész BEGIN Törzs, kód rész blokk EXCEPTION A blokk még nem adatbázis objektum (pl. nincs neve) Hiba kezelő rész END
PL/SQL alapjai A PL/SQL blokk felhasználása Tárolt eljárás PL/SQL blokk Tárolt függvény Triggerek JOB Közvetlen futtatás
Tárolt eljárások, PL/SQL elemei A tárolt eljárások DB objektumként védhető, karbantartható CREATE OR REPLACE PROCEDURE név (pnev1 IN | OUT típus1,… ) AS PL/SQL blokk Paramétereknél: IN: bemenő paraméter OUT: értéket kap, amit kinn is látni kellene Elindítása: EXECUTE név (param1, ..) Megszüntetése: DROP PROCEDURE név
KÉP Thom Evans (?): Repetition
Programozási elemek A deklarációs rész felépítése adattípus DECLARE nev CHAR(10); kor NUMBER(5,1) := 12; tip CONSTANT CHAR(2) := ‘AL’; ig EMBER.IGSZ%TYPE; auto AUTO%ROWTYPE; kezdőérték konstans érték DB tábla megadott mezőjének típusát veszi fel rekord típus, DB tábla rekordtípusát veszi fel változó neve KL KL
Alap adattípusok BINARY_INTEGER: egész, bináris, +/-214783647-ig NUMBER(n,m): valós, számjegyes CHAR(n): szöveg VARCHAR2(n): változó méretű szöveg BOOLEAN: logikai DATE: dátum, idő RAW: bináris LONG: hosszú szöveg(2GB) LONG RAW: hosszú bináris(2GB) declares1 char(5) := '12'; s2 char(5) := '12 '; => s1 = s2 ist TRUE declares1 varchar2(5) := '12'; s2 varchar2(5) := '12 '; => s1 = s2 ist FALSE
Alap operátorok Operátorok prioritási táblázata NOT, ** +, - (előjelek) /, * +, -, || =, !=, <, >, <=, >=, IS NULL,LIKE,BETWEEN,IN AND OR Néhány függvény Szöveg : upper(), initcap(), substr(), length(), rtrim() dátum : sysdate, to_date(), to_char(), t_number() numerikus : abs(), mod(), round() ...
Programozási elemek A törzs rész felépítése értékadás BEGIN nev := ‘mars’; IF x > 4 THEN .. ELSE .. END IF; UPDATE auto SET ar = x WHERE …; SELECT ar,ig,.. INTO x, y.. FROM .. NULL; .. END feltételes végrehajtás SQL parancsok gazdanyelvi változó Egy rekord lekérdezése gazdanyelvi változóba Üres parancs KL KL
Programozási elemek A törzs rész felépítése BEGIN LOOP .. EXIT [WHEN felt]; END LOOP; WHILE x < 2 LOOP .. END LOOP; FOR x IN [REVERSE] … LOOP .. END LOOP; … END; alapciklus kilépés [feltétel esetén] feltételes ciklus léptetéses ciklus Egy halmaz elemeire
Programozási elemek Többszörös elágazás BEGIN .. CASE WHEN feltétel THEN tevékenység; WHEN feltétel THEN BEGIN tevékenység; END; ELSE tevékenység; END CASE; .. END elágazás rész nyitása egy feltétel ág tevékenység blokk egyéb ág elágazás rész zárása
Programozási elemek Kurzor szerkezet, több rekord beolvasása a DB-ből DECLARE CURSOR cnev(param) IS SELECT ..; BEGIN OPEN cnev(aparam); LOOP FETCH cnev INTO vlista; EXIT WHEN cnev%NOTFOUND; END LOOP; CLOSE cnev; deklaráció, paraméterrel nyitás rekord olvasás kilépés a ciklusból lezárás DBMS PL/SQL blokk kurzor
Programozási elemek Közvetlen kurzorkezelési ciklus DECLARE CURSOR cnev(param) IS SELECT ..; BEGIN OPEN cnev(aparam); FOR c1 IN cnec LOOP x := c1.mezo1; ... END LOOP; CLOSE cnev; deklaráció, paraméterrel nyitás ciklus Hivatkozás egy mezőre lezárás
Programozási elemek Hibakezelés saját hibakód deklarálás DECLARE hnev EXCEPTION; hiba explicit generálása BEGIN RAISE hnev ; EXCEPTION WHEN hiba THEN ….. WHEN OTHERS THEN …. hiba azonosítása hibakezelő rutin egyéb hibák kezelése
Hibakódok no-data-found : nincs több adat Cursor-already-open : már nyitott a kurzor Dup-val-On-index : kulcs dupplikálás Storage-error : memória hiba Program-error : pl/SQL motor hiba Zero-divide : nullával való osztás invalid-cursor : nem élő kurzor Login-denied : érvénytelen bejelentkezés Invalid-number : adattípus hiba Too-many-rows : több mint egy eredményrekord
Minta kód DECLARE v_KOD varchar2(10); v_NEV varchar2(40);BEGIN v_KOD := 'kg'; v_NEV := 'Kilogramm'; insert into MERTEKEGYSEG (KOD, NEV) values (v_KOD, v_NEV);EXCEPTION when DUP_VAL_ON_INDEX then update MERTEKEGYSEG set NEV = v_NEV where KOD = v_KOD;END; egy megadott (KÓD, NEV) rekord felvitele a MERTEKEGYSEG táblába; Létező kód esetén felülírja a létező rekord NEV mezőjét.
Minta kód declare function LETEZIK (p_KOD in varchar2)return boolean is v_DB integer; begin select count(*) into v_DB from MERTEKEGYSEG where KOD = p_KOD; return v_DB > 0; end; begin if not LETEZIK ('m') then insert into MERTEKEGYSEG (KOD, NEV) values (‘m', 'Meter'); end if; end; Beépített függvény, amely ellenőrzi, hogy a megadott KOD érték már létezik-e vagy sem
Minta kód DECLARE e_rec emp%ROWTYPE; e1 EXCEPTION; sal1 emp.sal%TYPE; BEGIN SELECT sal INTO sal1 FROM emp WHERE deptno = 30 AND ename = 'John'; IF sal1 < 5000 THEN RAISE e1; sal1 := 8500; UPDATE emp SET sal = sal1 WHERE deptno = 30 AND ename = 'John'; END IF; EXCEPTION WHEN no_data_found THEN RAISE_APPLICATION_ERROR (-20001, 'John távol van'); WHEN e1 THEN RAISE_APPLICATION_ERROR (-20002, ’Less Salary.'); END;
kép Thom Evans: Whispers
Adatkezelés speciális elemei • FOR UPDATE • Dinamikus kurzor • FOR - kurzor • Blokkok egymásba ágyazása • Saját hibatípus