Professional Documents
Culture Documents
Ivancsy-Adatbazisok Szerver Oldali Programozasa PDF
Ivancsy-Adatbazisok Szerver Oldali Programozasa PDF
i < />'i :
- ~- ' ' ,....
lváncsy Renáta
Műegyetemi Kiadó
!.Bevezetés Iváncsy Renáta
l. Bevezetés .................................................................................................................... 8
1. 1. Szoftverarchitektúrák ......................................................................................... 8
1.2. A szerver oldali programozás ................................................................ ........... 10
1.3. Kapcsolódás az adatbázishoz ........................................................................... ll
1.4. Adatbázis-kezelő rendszerek ............................................................................ 13
2. Az SQL nyelv áttekintése ......................................................................................... 20
2.1. Tábla létrehozása .............................................................................................. 20
2.2. Tábla törtése .............. ................. ......................................................... ............. 24
2.3. Tábla módosítása .............................................................................................. 24
2.4. Adatok lekérdezése táblából ............................................................................. 24
2.5. Új sor beszúrása táblába ................................................................ ................... 28
2.6. Sorok törtése táblából ....................................................................................... 28
2.7. Mezö módositása ........................... ..... .............................................................. 29
2.8. Nézet létrehozása .............................................................................................. 29
2.9. Nézet törlése ....................................................................... .............................. 30
2.1O. Nézet módosítása .............................................................................................. 30
2.11. Sor beszúrása nézetbe ....................................................................................... 30
2.12. Sor törtése nézetböl .......................................................................................... 31
2.13. Mezö módosítása nézetben ............................................................................... 31
2.14. Minta adatbázisok ............................................................................................ 31
3. A PUSQL áttekintése ............................................................................................... 44
3.1 . Blokkok ............................................................................................................ 44
3.2. Változók deklarálása, inicializálása, értékadása............................................... 46
3.3. Kurzorok ........................................................................................................... 47
3.4. Attribútumok ...................................................... .............................................. 47
3.5. Programvezérlő utasítások ............................................................................... 48
3.6. Modularitás ....................................................................................................... 48
3.7. Kollekciók (Collections) .................................................................................. 49
3.8. Objektumok ....................................................................................... ............... 49
3.9. Hibakezelés ...................................... .................................................... ............ 49
4. A PUSQL alapjai ..................................................................................................... 50
4.1. Karakterek ................................................... ................. ........................ ............ 50
4.2. Megjegyzések ................................................................................................... 50
3
!.Bevezetés lváncsy Renáta
4
l . Bevezetés Iváncsy Renáta
5
!.Bevezetés Iváncsy Renáta
6
!.Bevezetés lváncsy Renáta
7
! .Bevezetés Iváncsy Renáta
l. Bevezetés
Az SQL (Structured Query Language) segítségévellehetőségünk van adatbázis struktúrák
(táblák. nézetek, szekvenciák stb.) létrehozására. az adatbázis struktúrákban adatok tárolására,
illetve számunkra lényeges, valamilyen feltételnek megfelelő adatok kinyerésére. Egyszóval
lehetőségünk van az adatbázisban található adatok manipulálására. A hatékony
adatfeldolgozás azonban ennél többet igényel. Gyakran nem elég az adatok szekvenciális
feldolgozása, szükség lehet ciklusok szervezésére, feltételek definiálására. komolyabb
programok eselén pedig felmerül az igény az egyes logikailag összefilggö programrészek
elkülönítésére. Szükség lehet filggvények, eljárások definiálására, melyeket késöbb több
helyen is meg lehet hívni. Egyszóval felmerül az igény olyan támogatás iránt, amilyet a
procedurális nyelvek nyújtanak.
Az adatbázisok szerver oldali programozása az adatbázis-kezelő rendszer által nyújtott
procedurális programozási nyelven történő programozást jelenti. A legtöbb adatbázis-kezelő
l.l.Szoftverarcbitektúrák
Az adatbázisok használata napjainkra már igen alapvető igénnyé vált az élet számos
területén. Adatbázisra épülnek egyebek közt a vállalati, banki, egészségügyi információs
rendszerek, az egyetemi hallgatói nyilvántartó rendszerek, az áruházláncok nyilvántartó
rendszerei, már a fodrászatban is adatbázisban tárolják a vendégek hajkezeléséhez szolgáló
információkal. Az adatbázisok széleskörü felhasmálása különbözö igényeket támaszt az
adatbázis-kezelő rendszerrel szemben. Kis alkalmazások esetén az adatbázisban ezres,
8
! .Bevezetés Iváncsy Renáta
9
l .Bevezetés Iváncsy Renáta
nyílik ezen utasítások egyetlen hívással történő futtatására, ezzel csökkentve a hálózati
forgaimat Szintén a hálózati forgaimat csökkenti, ha a nagy adathalmazon történő müveletek
a szerver oldalon kerülnek elvégzésre, mivel így nem kell a nagy adathalmazt átküldeni a
hálózaton. A tárolt eljárások a szerveren futnak, így a szerver kerül terhelésre és nem a kliens.
Produlaivitás és könnyú használat
Amennyiben az alkalmazás tárolt eljárások alapján készül el, úgy el lehet kerülni a
redundáns kódolást. ezzel növelve a produktivitást. A tárolt filggvények SQL-böl történő
A tárolt eljárás segítségével az üzleti logikát meg lehet osztani a k:ülönbözö alkalmazások
között. Például egy tárolt eljárás, ami egy üzleti szabályt implementál k:ülönbözö olyan
kliensalkalmazásokból meghívható, amik ezt az üzleti szabályt alkalmazzák.
Karbantarthatóság
Mivel a tárolt eljárás a szerveren kerüJ tárolásra, olyan módosítás esetén, ami a tárolt
eljárás interfészét nem érinti, nem kell a kliens kódhoz hozzányúlni, elég a szerveren újra
fordítani a módosított eljárást.
10
! .Bevezetés lváncsy Renáta
Biztonság
Tárolt eljárások használatával több lehetőség nyílik a jogosultásogok kezelésére.
Megoldható, hogy egy adott felhasználó az adatokat csak a tárolt eljárásokon keresztül érje el.
Például egy tárolt eljáráson keresztül a felhasználó módosíthat egy táblát, noha a tárolt eljárást
futtató felhasználónak magára a táblára semmilyen joga nincs.
funkciókat. Az Oracle szerver oldali nyelve a PUSQL, a Microsoft SQL Server 2000-é a
Transact-SQL, a DB2 az SQL PL-t használja.
Nem hordozható
A szerver oldali programozási elemek (tárolt eljárások. ftlggvények. triggerek) a
szerveren kerülnek eltárolásra. Ha a szoftver rendszer alá egy másik adatbázis-kezelőt kell
tenni, akkor a szerver oldali elemeket át kell migrálni az egyik adatbázis kezelőröl a másikra.
Ez gondot jelenthet abban az esetben, ha a két adatbázis-kezelő nem azonos, hiszen azok nagy
valószínűséggel más-más nyelvet támogatnak. Oyen formán a szerver oldali elemek nem
hordozható ak.
Teljesítmény
Teljesítmény szempontjából a szerver oldali elemek használata nem csak elöny lehet, de
akár hátránnyá is válhat. Bizonyos esetekben teljesítmény szempontjából jobb megoldás a
bonyolultabb funkciókat a középsö rétegben megvalósítani. Így nem az adatbázis szerver lesz
terhelve, és skálázhatóbbá is válik a rendszer.
1.3.Kapcsolódás az adatbázishoz
A kliens oldalról az adatbázishoz különböző technológiák segítségével lehet csatlakozni.
Ezek a technológiák többek között az ODBC, OLE DB, ADO valamint a JDBC. Mindegyik
technológia lényege, hogy egy réteget képezzen az adatbázis és a kliensalkalmazás között,
amely eltakruja az alkalmazás elöl az adatbázis specifikus részeket.
ll
! .Bevezetés Jváncsy Renáta
12
! .Bevezetés lváncsy Renáta
1.4.Adatbázis-kezelő rendszerek
Napjainkban a szoftver piacon számos adatbázis-kezelő rendszer létezik. Ezek a
rendszerek különbözö tulajdonságokkal rendelkeznek funkcionalitás, teljesítmény és ár
szempontjából egyaránt. A legelterjedtebb adatbázis kezelök az Oracle, a Microsoft SQL
Server 2000, az ffiM DB2 valamint a MySQL. Ezen kívül még számos adatbázis-kezelő
létezik. mint például a Sybase, az lnformix, a Microsoft Access stb., ezekkel azonban idő és
hely hiányában nem foglalkozunk.
Az egyes adatbázis kezelöknek számos változata létezik. amelyek közül bizonyosak
teljes, mások korlátozott funkcionalitással rendelkeznek. Az alábbi táblázat az egyes
adatbázis-kezelő rendszerek közelitö árát mutatják.
Microsoft SQL Oracle9i ffiMDB2 MySQL
Server 2000 Venion 8.1 3.23
Enterprise Edition $19 999 us $40 OOO US $25 OOO US $400 us
az EE változat
DataMining $20 OOO US $60 OOO US nincs
tartalmazza
az EE változat
OLAP
tartalmazza
$20000 us $28 OOO US nincs
Standard Edition $4 999 us $15 OOO US $7 500 us $200 us
1.4.1. Az OraclelOg
A tárgy első felében az Oracle adatbázis kezelő rendszer szerver oldali programozásával
fogunk foglalkozni . Ennek jobb megértése érdekében nézzük meg, hogy hogyan lehet röviden
jellemezni az OraclelOg adatbázis kezelőt
Az OraclelOg architektúrája
Az Oracle adatbázis valamilyen szempontból összetartozó elemek gyűjteménye. Az
adatbázisnak logikai és fizikai struktúrája van. Mivel ez a két struktúra egymástól elkülönül,
ezért a fizikai struktúra anélkül kezelhetö, hogy a logikai struktúrát a módosítások érintenék.
13
l.Bc:vc:zetés Iváncsy Renáta
A logilclli stnllctÍirll
Az Oracle logikai struktúrája a következö elemeket tartalmazza:
• séma objektumok,
• adat blokkok,
• extentek,
• szegmensek
• és táblahelyek.
A séma
A séma adatbázis objektumok gyűjteménye. Egy séma egy adatbázis felhasználó
tulajdonában van, és a séma neve megegyezik a tulajdonosának a nevével. A séma táblákat,
nézeteket, indexeket tartalmazhat.
Az adat blokJcok, extentek és szegmensek
Az adat blokkok, extentek és szegmensek használatával az Oracle-nek lehetősége van a
diszk hely használat finom hangolására.
Az 110 müveletek szempontjából legalacsonyabb szinten helyezkednek el az adat
blokkok. Egy adat blokkhoz megadott számú fizikai hely tartozik. A logikai struktúra
következő szintje az extent. Az extent megadott számú egymás mellett elhelyezkedő
14
! .Bevezetés Iváncsy Renáta
Database
:-S;s~t~ T~b~e:pa~~~- - -: :-U;E~~ T~b~es~a~e- - -
l l l
l l
l l
OATA1 .0RA OATA2.0RA l l
1111b 1Mb
l l
l l
L ___ _ ______ IL __________ I
Látható, hogy egy adatbázis egy vagy több táblahelyből állhat. Minden táblahelyhez
létrehozásra kerül egy vagy több adatfájl az adatok tárolásához.
A jiz)klli struktflr11
Minden Oracle adatbázis egy vagy több adatfájlt tartalmaz. Az adatfájl tartalmazza az
összes adatbázis adatot.
Az adatfájlok mellett van kettő vagy több redo log fájl. A redo log fájlokban kerülnek
naplózásra az adatbázisban történt adat módosftások
Minden Oracle adatbázis rendelkezik egy control fájllaL A control fájl olyan
információkat tartalmaz, ami meghatározza az adatbázis fizikai struktúráját. Például a
következő információkat tartalmazza:
• Adatbázis név
• Az adat és redo log fájlok nevei és helyei
• Az adatbázis létrehozásának ideje
Az lllllltszóúir
Minden Oracle adatbázishoz tartozik egy adat szótár (data dictionary). Az adatszótár
olyan csak olvasható táblák és nézetek referenciáinak halmaza. amelyek az adatbázisról
tartalmaznak információkat Tartalmaz például adatokat az adatbázis fizikai és logikai
struktúrájáról. Ezen kivül a következő adatokat is tartalmazza:
• Az adatbázis felhasználói
• Információk a táblák számára definiált integritás megkötésekről
• Információk a sémákról (táblák, nézetek stb).
Az adatszótár akkor jön létre, amikor az adatbázis létrehozásra kerül, és automatikusan
fiissftödik.
Az alábbi példa lekérdezi az aktuális felhasználó tábláinak nevét:
l SELECT table name FROM user tables;
15
l .Bevezetés lváncsy Renáta
Az IUÜJibtízis péükíny
Minden futó Oracle adatbázis hozzá van rendelve egy Oracle példányhoz (instance).
Amikor elindul egy adatbázis az adatbázis szerveren, az Oracle memóriát foglal magának
(globális rendszer tér -System Global Area - SGA) és elindit egy vagy több folyamatot. Az
Oracle példány nem más, mint ez a memóriaterület (SGA) és a folyamatok összessége.
Amikor elindftunk egy példányt, akkor az Oracle összerendeli a példányt a megadott
adatbázissal. Ezt az adatbázis csatolásának (mounting) hívják. Egy gépen több példány is
futhat, melyeknek saját fizikai adatházisuk van.
Biztonság
Az Oracle adatbázisban léteznek rendszer és séma jogosultságok. A rendszer
jogosultságok azt határozzák meg, hogy milyen rendszer szintű müveleteket hajthat végre a
jogosultsággal rendelkező felhasználó. llyen müvelet lehet például táblahely létrehozása, új
felhasználó felvétele az adatbázisba stb. Több, mint 60-féle különbözö rendszer jogosultság
van. A séma jogosultságok különbözö séma objektumokon végezhető müveleteket
engedélyeznek. vagy tiltanak meg felhasználóknak. llyen objektumok a következők :
• Tábla
• Nézet
• Szekvencia
• Eljárás
• Függvény
• Csomag
A különbözö objektumokra más-más jogosultságok vannak definiálva. Például egy
táblára beszúrási jogosultságot adhatunk. egy tárolt eljárásra futtatási jogot stb.
Szerepek
A különbözö jogosultságok könnyebb kezelésére be lehet vezetni szerepeket (roles). Egy
szerep definiálásakor meg kell adni, hogy az adott szerep milyen rendszer és séma szintű
16
).Bevezetés I váncsy Renáta
17
!.Bevezetés lváncsy Renáta
SQL Szarver
Az adatbázisok két vagy több fájlként kerülnek eltárolásra a diszken. Egy adatbázishoz
tartozik egy adat fájl (.mdf vagy .ndf) valamint egy log fájl (.ldf). Az adatfájl extentekre
bontható, ami 8 folytonos 8K.b-os lapot tartalmaz.
Az SQL szerveren is lehetőség van a rendszerben tárolt adatokról információk szerzésére,
erre a rendszer tárolt eljárások szolgálnak, amiknek előtagja az "sp". Például az "aszp" nevü
felhasználó tábláinak nevét a következő módon kérdezheljük le az adatbázisból:
l exec sp tables @table owner = 'aszp';
Biztonság
Az SQL Serveren a felhasználóknak létre kell hozni egy Iogint. Az adatbázisban az
autentikáció történhet operációs rendszer szinten vagy adatbázis szinten. Az egyes loginokat
különbözö adatbázisokhoz lehet rendelni . Egy adatbázist az a felhasználó használhatja, aki
hozzá van rendelve.
Az SQL Serveren, hasonlóan az Oracle-hez, lehetőség van az egyes felhasználóknak
különbözö rendszer és objektum szintü jogosultságokat adni, illetve megvonni. Ezen kívül
lehetőség van a szerepek definiálására is.
Támogaton operációs rendszerek
l Windows 9x, NT, 2000, XP
AziBMDB2
Az IBM DB2 adatbázis kezelő rendszer architektúrája két szintre bontható. Egyrészt
lehetőség van kalönbözö példányok létrehozására, mely példányok egymástól függetlenül
mü.ködtethetők., adminisztrálhatók és karbantarthatók. Minden példányon belül lehetőség van
egy vagy több adatbázis létrehozására.
18
].Bevezetés Iváncsy Renáta
!9
2.A:z SQL nyelv áttekintése Iváncsy Renáta
A tábla létrehozása során az oszlopok definícióit kell megadni egymás után, vesszövei
elválasztva. Az oszlop definícióján kivül lehetőség van tábla szintü megkötések definiálására
is. Az alábbiakban az oszlop definíció és a tábla szintü megkötés szintaktikáját újuk le.
20
2.Az SQL nyelv áttekintése Iváncsy Renáta
21
2.Az SQL nyelv áttekintése lváocsy Renáta
mert a későbbiekben hasznos lehet, ha pontosan tudjuk, hogy melyik megkötés miatt hiúsult
meg az utasításunk. Amennyiben nem adunk meg nevet, az Oracle és az MS SQL Server is
egyedi névvellátja el a megkötést
A NULL lrulcsszó segitségével megadhatj uk, hogy egy oszlop felvehet NULL értéket. Ez
az alapértelmezett. A NOT NULL lrulcsszóval megtilthatjuk, hogy NULL értéket vegyen fel
egy oszlop. Ebben az esetben az adott oszlopnak mindig meg kell adni értéket beszúrás
esetén, kivéve, ha rendeltünk hozzá alapértelmezett (DEFAULn értéket.
Az oszlopot elsődleges lrulcsként definiálhatjuk, ha a PRIMARY KEY lrulcsszó kerül
mögé. Ebben az esetben a táblán belül az adott oszlopban az értékek egyediek, és nem
vehetnek fel NULL értéket. Ha a UNIQUE kulcsszót használjuk, akkor szintén biztosítjuk az
egyediséget, viszont az oszlop értéke lehet NULL is. Az egyediség a nem NULL értékű
oszlop is lehet.
A REFERENCES kulcsszó után adható meg, hogy az adott oszlop melyik tábla mely
mezőjére hivatkozzon, mint idegen kulcs. Az ON DELETE megkötéssel megadható, hogy mi
történjen az idegenlrulcsként meghatározott mező értékével, ha a hivatkozott mező törlésre
kerül. A CASCADE lrulcsszó használata esetén a hivatkozó tábla megfelelő sora törlődik, ha
a hivatkozott sor törlésre kerül. A NO ACTION lrulcsszó használata esetén a szerver hibát
generál, és a hivatkozott táblában történt törlést visszagörgeti, azaz nem törli ki az adott sort,
mert még van rá hivatkozás az adatbázisban. Az ON UPDATE megkötéssel megadható, hogy
mi történjen a hivatkozó mező értékével, ha a hivatkozott mező értéke megváltozik.
A CHECK lrulcsszó után zárójelben meg kell adni egy logikai kifejezést. A rendszer
minden egyes új sor beszúrásakor az adott mezőre kiértékeli a logikai kifejezést. Ha az
eredmény igaz, a beszúrást elvégzi, egyébként pedig hibát generál. A CHECK megkötés
segítségével biztosítható a tartomány integritás az oszlopban. Fontos, hogy az oszlop szintü
megkötés esetén a CHECK feltétel csak az adott oszlopra vonatkozó logikai kifejezést
tartalmazhat. Amennyiben több oszlop közötti feltételt szeretnénk megadni, akkor tábla szintű
megkötést kell alkalmazni.
22
2.Az SQL nyelv áttekintése lváncsy Renáta
viszonyitva szeretnénk megkötést tenni, akkor Oracle esetén triggert kell alkalmazni. MS
SQL Server 2000 esetén használható a getdateO fiiggvény.
23
2.Az SQL nyelv áttekintése Iváncsy Renáta
24
2.Az SQL nyelv áttekintése Iváncsy Renáta
MS SQL Server esetén lehetőség van a lekérdezés eredményét egy új táblába létrehozni.
Ebben az esetben a lekérdezésben a SELECT és a FROM lrulcsszó között megjelenik egy
INTO lrulcsszó és utána egy táblanév. A lekérdezés eredménye az új táblába kerül, a tábla
oszlopainak a nevét a lekérdezésben meghatározott oszlopnevek al.ko~ák.
25
2.Az SQL nyelv áttekintése lváncsy Renáta
26
2.Az SQL nyelv áttekintése lváncsy Renáta
2.4.5. Az ORDER BY
2.4.6. Halmazmfiveletek
2.4.7. Allekérdezések
27
2.Az SQL nyelv áttekintése Jváocsy Renáta
28
2.Az SQL nyelv áttekintése Iváncsy Renáta
Abban az esetben, ha nem adunk meg WHERE feltételt, a tábla összes sora törlésre kerül.
Egyéb esetben a WHERE kulcsszó után meg kell adni egy feltételt, ami azokat a sorokat
választja ki, amiket törölni szeretnénk.
Amennyiben az összes sort ki szeretnénk törölni a táblából, használhatjuk a TRUNCA TE
utasítást.
TRUNCATE TABLE táblanév
A TRUNCATE használatával lényegesen gyorsabban törölhetünk, mint egy feltétel
nélküli DELETE utasítással, ami szintén az összes sort törölné. Szintén gyorsabb, mint
eldobni az egész táblát, és újra létrehozni azt, ugyanis ebben az esetben az összes triggert és
egyéb, a táblával kapcsolatos objektumot újra létre kellene hozni.
2.7.Mező módosítása
A lábiában egy mezö az UPDATE utasilás segitségével módosítható, szintaktikája SQL
Serveren a következő:
UPDATE táblanév
SET oszlopnév= { kifejezés l DEFAULT l NULL} [, ... n]
[FROM { táblanév l nézetnév} [, ... n]]
WHERE keresési feltétel;
A SET kulcsszó után kell megadni a tábla módositani kivánt oszlopait, és az adott mezö
új értékét. Az új érték, hasonlóan az INSERT utasításnál látottakkal, lehet egy kifejezés, a
DEFAULT kulcsszó (ilyenkor a definiálásnál megadott alapérték lesz a mezö új értéke) vagy
a NULL. A FROM kulcsszó után kell megadni azokat a táblákat, amikhez tartozó oszlopok a
WHERE kulcsszó után. a keresési feltételben szerepeinek és nem a módosftani kivánt tábla
oszlopai. Ha nincs ilyen tábla, akkor a FROM kulcsszót el kell hagyni.
Oracle-ben nincs lehetőség megadni a FROM kulcsszót! Abban az esetben, ha az Oracle
táblában egy másik tábla adatai alapján szeretnénk módosítani, egy allekérdezés segítségével
lehet kiválasztani a megfelelő sorokat.
Az UPDATE utasilás szintaktikája Oracle esetén:
UPDATE táblanév
SET oszlopnév= {kifejezés l DEFAULT l NULL} [ , ... n]
WHERE keresési feltétel;
2.8.Nézet létrehozása
A nézetek olyan virtuális táblák, amik egy vagy több fizikai tábla alapján kerülnek
létrehozásra, és a táblákban tárolt adatokat az eredeti tárolási logikától eltérő logikai
rendszerezés alapján tartalmazzák. A nézetek nem tárolnak adatokat, csak más nézetböJ
29
2.Az SQL nyelv áttekintése lváncsy Renáta
mutatják az adatbázis adatait Nézetet a CRETAE VIEW utasítással hozhatunk létre, melynek
szintaktikája a következő:
CREATE VIEW nézetnév [ (oszlopnév [, ... n]) J AS lekérdezés [WITH
CHECK OPTION] ;
A nézetnév az újonnan létrehozott nézet neve. A névnek meg kell felelnie az elnevezési
konvencióknak. A nézetnév után fel lehet sorolni az oszlopokat, amikböJ a nézet állni fog.
Ezzel felül lehet definiálni a lekérdezésben megadott oszlopneveket Kötelező megadni az
oszlopneveket, ha a lekérdezésben származtatott értékek, kanstansok vagy oszlopfilggvények
vannak. illetve ha több oszlopnak azonos neve lenne. Az AS kulcsszó után meg kell adni egy
lekérdezést, aminek az eredményét szeretnénk nézetként látni.
A WITH CHECK OPTION k:ulcsszó segitségével az adható meg, hogy a nézet
létrehozásakor megadott feltételek a nézeten keresztüli beszúráskor is figyelembe legyenek
véve. Ha például a nézet azokat a sorokat tartalmazza egy táblából, aminek az azonosítója
nagyobb mint 100, akkor ha a WITH CHECK OPTION be van kapcsolva. akkor a nézeten
keresztül csak olyan sorokat tudunk beszúmi, aminek az azonosítója nagyobb, mint l 00. Ha a
WITH CHECK OPTION el van hagyva, akkor bánnilyen azonosító értékkel rendelkező sor
beszúrható a nézeten keresztül a táblába, noha a nézeten keresztül továbbra is csak azok
Játszódnak. amiknek az azonosítója nagyobb, mint l 00.
2.9.Nézet törlése
Nézetet a DROP VIEW utasítássallehet törölni.
DROP VIEW nézetnév;
30
2.Az SQL nyelv áttekintése lváncsy Renáta
31
2.Az SQL nyelv áttekintése lváncsy Renáta
TEACHER
A tanár adatait tárolja.
Oszlop név Tipus Jelentés
tea id CHAR(6) Neptun kód, a tanár elsödlc:ges kulcsa
tea fname VAR CHAR(50) Tanár keresztneve
tea lname VARCHAR(50) Tanár vezetékneve
tea_grade CHAR(2) Fokozat.
tea status INT A tanár státusza, idegen kulcs a sort status táblára.
tea dept CHAR(4) A tanát tanszéke, idegen kulcs a department táblára
tea maii VARCHAR(80) Tanár e-mail címe
SORT_STATUS
Az egyetemen szereplö státuszok elnevezése. Az azonosftók sorrendje alapján a
státuszokat sorrendbe is lehet rendezni, így meg lehet mondani, hogy a tanszékvezető legyen a
legmagasabb fokozat stb.
Oszlop név Típus Jelentés
status id INT A státusz kódja
status name VARCHARJ30) A státusz megtt_evezése
SORT_SUBJECTTYPE
A tárgyak tipusát sorolja fel. A tárgy tipusa azt határozza meg, hogy az adott tárgy melyik
képzésen kerül oktatásra (villamosmémöki alapozó, informatikus szakirányú stb.)
Oszlop név Tipus Jelentés
st id INT A tíj)_us kódja
st _typ_ename VARC~(50)_ A ti!l_us megnevezése
SUBJECT
A SUBJECT tábla tárolja el az egyes oktatott tárgyak adatait. Ezek azok az adatok., amik
állandóak, nem váltomak félévröl-félévre.
Oszlop név Tipus Jelentés
sub id CHAR{8) A tárgy kódja, mint pl. VIAU9159
sub name VARCHAR(50) A tárgy megnevezése
sub outcome CHAR( l) A követelmény. V-vizsga, F-félévközi, G-gyakorlat
sub credit NUMBER(2, l) A kredit érték
sub vdklink VARCHAR(200) A tárgy honlapja
sub _type INT A tárgy tipusa, idegen kulcs a sort subjecttype-ra
32
2.Az SQL nyelv áttekintése Iváncsy Renáta
SEMESTER
A szemeszterek adatait tartalmazza.
Oszlop név Típus Jelentés
sem name CHAR(5) A szemeszter kódja. Az első négy jegy az évet jelenti,
az ötödik szám a naptári évben vett félév sorszámát,
tahát az egyes szerepel a tavaszi és kettes az őszi félév
esetén.
sem be!lli!_ DATE A szemeszter kezdete
sem end DATE A szemeszter vége
sem exambegin DATE A vizsgaidöszak kezdete
sem examend DATE A vizsgaidöszak vége
CO URS E
A tárgyakhoz félévenként különbözö lrurzusokat lehet kiírni. Ez azért van igy, mert egy
tárgyat egy félévben más-más tanár oktathat, és természetesen más diákok is járnak rá. Egy
tárgyhoz egy félévben több Irurzust is ki lehet írni (pl. több labor gyakorlatot) amiket
sorszámmal kell ellátni.
Oszlop név Típus Jelentés
cou id INT A 1rurzus azonosítója
cou subjectid CHAR(8) A tárgy azonosítója, amihez a lrurzus ki lett írva
cou semestemame CHAR(5) A szemeszter, amikor a kurzus meg lett hirdetve
cou_type CHAR( l) A 1rurzus típusa. E-előadás, G-gyakorlat, L-labor
cou coursenumber INT A 1rurzus sorszáma
cou limit INT A Irurzusra jelentkező hallgatók számának korlátja
STUDENT_ COURSE
Ha egy diák egy Irurzusra jelentkezik, a STUDENT _COURS E táblába kerül egy
bejegyzés, ami tartalmazza a diák és a lrurzus azonosítóját, valamint a jelentkezés dátumát.
Oszlop név Tipus Jelentés
sc studentíd CHAR(6) A diák azonosítója.
sc courseid INT A 1rurzus azonosítója
sc date DATE A Irurzusra való jelentkezés dátuma
33
2.Az SQL nyelv áttekintése Iváncsy Renáta
COURSE TEACHER
A lrurzust egy vagy több tanár oktathatja, de ha több tanár is oktathatja, valamelyikük
meg van jelölve felelős tanárként.
Oszlop név Tipus Jelentés
ct id INT A tábla azonosítója
ct teacherid CHAR(6) A tanár azonosítója
ct courseid INT A lrurzus azonosítója
ct masterteacher INT Ha a tanár a felelős, értéke l, egyébként O.
EXAM
Minden lrurzushoz ki lehet írni vizsga időpontokat.
STUDENT EXAM
A vizsgára való jelentkezést egy sor beszúrása jelenti a STIJDENT_ EXAM táblába.
Ekkor beszúrásra kerül a vizsga azonosítója, a diák azonosítója, valamint a jelentkezés
dátuma. Amennyiben a diák le is vizsgázott, az osztályzat oszlop is ki töltésre kerül.
Oszlop név Tipus Jelentés
sx studentid CHAR(6) A diák azonosítója
sx examid INT A vizsga azonosítója
SX date DATE A vizsgára jelentkezés időpontja
SX _grade INT Az osztályzat
BUILDING
A rendszerben nyilván tartjuk az egyes épületeket is, ahol a termek előfordulhatnak.
34
2.Az SQL nyelv áttekintése Iváncsy Renáta
DEPARTMENT
A tanszékek adatait tárolja.
Oszlop név Típus Jelentés
dept code VARCHAR(4) A tanszék azonosítója
dept name VARCHAR(50) A tanszék hosszú elnevezése
dept_building INT Az épület azonosítója. amiben a tanszék
adminisztrációja van.
dept floor V ARCHAR(l5) Az emelet, ahol a tanszék található az épületen belül
ROOM
A terem adatait tárolja el.
Oszlop név Tipus Jelentés
room id INT Az terem azonosítója
room building INT A terem melyik épületben van
room number VARCHAR(lO) A terem száma
room places INT A terem férőhelyeinek száma
room dept VARCHAR(4) A terem melyik tanszékhez tartozik.
room tel V ARCHAR(l5) A terem telefonszáma. ha van
room _type INT A terem típusa, idegen kulcs a room _type táblára
ROOM TYPE
A terem típusát határozza meg (elöadó terem, labor, tanáriszoba stb.).
OuJop név Tipus Jelentés
rt id INT A típus kódja
rt_type V ARCHAR(30) A típus megnevezése
TECHAER ROOM
Azt határozza meg, hogy melyik tanár melyik szobában van elhelyezve hivatalosan. Egy
tanár több teremhez is tartozhat, és egy teremben több tanár is ellehet helyezve.
Oszlop név Típus Jelentés
tr teacherid CHAR(6) A tanár azonosítója
tr roomid INT A terem azonosítója
tr default NUMBER( l ,0) A tanár alapértelmezett szobája.
EXAM_ROOM
Azt határozza meg, hogy melyik vizsga melyik teremben van. Több-többes kapcsolat,
mert egy vizsgát több teremben is lehet tartani, ha olyan sok a hallgató, de egy teremben lehet
több vizsgát is tartani, ha például azonos tanár tartja a két vizsgát.
OuJop név Tipus Jelentés
u examid INT A vizsga azonosítója
u roomid INT A terem azonosítója
35
....
~
Vl
t•adw (opeo) ,o
co~.~mN.melo.ti t,;;ö -. t"'
~
sort_tubjKttype (op60) rrt ....J te• '' che• ....J
[Jc<bmíia 1o.. iii>t ~ veoch.oo
~ea_fr,~rrt- v~(het
<
~~-•: rt :J~a:J. _ _.O<>(\- l J ~~<~-~· ~ v 4f'(h!r
..::J
:
tea _~atus
tea_dect
te.!l_ff'l<!l ~
".,:
.. ~.:.,:•
..-~ .: ~• ! •
..::J
e:
(\.
!':
~ (t_rr.~~~·teacher r.t
~ ..::J
>·
.,
1:1" D«• TYOI ...
- -,
[
•>
·-t
....,
c~ ·J_'> u::>.ec~.-j teat.r...room (opeo)
P>--<>fl cou_i.etrlM:enwne '""' ~..::;.n..... ,OOtl!'ll"'_ ..
'""' D.ia T)'Olt
.-.
~
cou_t-,pe tr_teo..:~~·d c ~oat
D C'Ju_CO'.JI'seni.IT'Iber '""
·· t
v,yc'1ar -'l tr_r()Qtl'lod rr(
_J
v <!ll'd\41'
l
=
D - ..::J
=-
1:1"
..~ ·.~-~~) -
l 1Coi\IM-..
'"
1o;,a l ,po •J
!
l
1~
~ , "'""'-~ :.JF--
a i room b JOnq r.: buldlncl (opeo)
.!:
•
....
..::J; '
.
~.~·ooiTI _r...JMber
1 room _;l ~ es
,-y:t'I.Y
rnt r .. •
,.,...l1J'.um~It>«•T-
"- ·~-"' ~
F----'
l
room
H'l•.::om_~e l
itj'(o)l'rl_:rt>e
:~t ,-."j,.or
,-or: l\ar
•rt
IS"-"" no~•
~.. t>Ytl _zoc. oo.
~J6j _ ((",
lat(~rJjr
-,~r(l'\ar
\"~ (~~
studont_..." (opeo)
l " " - - l Oat•T.i» ..::J :uk1 ~··eret ·.-~ e NI'
r ,::joold:"'"be· -.-ar(h.ir
1;_, .
~··-~ ·,", -t,.j =·~· ....J
~s·_~:,yn.;l nt ..::J
L-1~·-=dt~
., _;· ~
;4tetsne
nt
EGYSEG
Az egység táblában tároljuk el, hogy az egyes alapanyagokat, félkész termékeket és kész
tc:rmékeket milyen egységben értelmezzük, pl. kg, liter, darab, lap, szelet stb.
Ti us
INT
nev VARC
ANYAG
Az anyag táblában kerülnek eltárolásra azok az összetevők, amikböJ elöállftják a félkész
ál a kész termékeket.
FELKESZ
A félkész termékek olyan készitmények, amiket a termékek előállításához kell használni,
azonban önmagukban is már különbözö alapanyagokból tevödnek össze. Félkész termék lehet
például a piskóta tészta, amit még a csoki torta elkészítéséhez fel fognak használni, vagy akár
a tejszinhab is.
Oszlop név Tipus Jelentés
felkesz id INT A félkész azonosítója
felkesz nev VARCHAR( l 00) A félkész neve
felkesz _mennyiseg INT A félkész mennyisége az adott egységböl, ami a
recept alapján elkészül.
felkesz egyseg INT A félkész egysége
felkesz raktardb FLOAT A félkészből a raktárban található mennyiség
felkesz minraktar FLOAT A raktárban minimum ennyi félkésznek kelllennie
37
2.Az SQL nyelv áttekintése Iváncsy Renáta
TERMEK
A termékek olyan készitmények, amik már eladásm kerülnek. Ezek tartalmazhatnak
félkész termékeket, és közvetlenül alapanyagokat is.
Oszlop név Tipus Jelentés
termek id INT A termék azonosítója
termek nev VARCHAR(IOO) A termék neve
termek_mennyiseg INT A termék mennyisége az adott egységböl, ami a
recept alapján elkészül.
termek egyseg INT A termék egysége
FELKESZ ANYAG
Azt határozza meg, hogy adott mennyiségű és egységű félkészhez milyen és mennyi
anyag szükséges.
Oszlop név Tipus Jelentés
fa felkeszid INT A félkész azonosítója
fa anyagid INT Az anyag azonosítója
fa mennyiseg FLOAT Az anyagból szükséges mennyiség
TERMEK_FELKESZ
A táblában tárolt adatok azt határozzák meg, hogy egy adott termékhez milyen, és
mekkom mennyiségű félkész szükséges.
Oszlop név Tipus Jelentés
tf termekid INT A termék azonosítója
tf felkeszid INT A félkész azonosítója
tf mennyiseg FLOAT A félkészböJ szükséges mennyiség
TERMEK ANYAG
Azt határozza meg, hogy a termékhez milyen anyag kell közvetlen. Pl a porcukor a süti
tetején stb.
Oszlop név Tipus Jelentés
ta termekid INT A termék azonosítója
ta anyagid INT Az anyag azonosítója
ta mennyiseg FLOAT Az anyagból szüksé~es mennyiség
38
"'
~
U)
~
r"'
~
ANYAG
<
~
PK AtfiA~ ID NUMBER
5-
;--------------H FK1
ANYAG_NEV
ANYAG_EGYSEG
VARCHAR2(100)
NUMBER
TERMEK_ANYAG f
l
ANYAG_EGYSEGAR FLOAT
l
l
l
ANYAG_RAKTARDB FLOAT H--------- -o FK2 TA_TERMEKID NUMBER
l ANYAG_MINRAKTAR FLOAT
l FK1 TA_ANYAGID NUMBER
~ l ANYAG_ MAXRAKTAR FLOAT
TA_MENNYISEG FLOAT
>·
c:r
ill FELKESZ_ANYAG l
> l
l
n l
~
l
l
....
'1:1
FK2 FA_FELKESZID NUMBER EGYSEG l
:z:
N FK1 FA_ANYAGID NUMBER
FA_MENNYISEG FLOAT
PK !;;~YSi;;~ ID NUMBER
TERMEK
,..
~ EGYSEG_NEV VARCHAR2(20)
tO
PK !!;;BMi;;IS ltl NUMBER
&
~- -=
;;;· TERMEK_NEV VARCHAR2(100)
TERMEK_MENNYISEG NUMBER
~ FK1 TERMEK_EGYSEG NUMBER
8
e.
l» :z:
l
FELKE SZ l
l
TERMEK_Fe\..KESZ l
PK E!;;LIS!;;SZ ltl NUMBER l
l
_______________ J l
FELKESZ_NEV
FELKESZ_MENNYISEG
VARCHAR2(100)
NUMBER
H------ \..1"1
FK2 TF _TERMEK ID NUMBER
~
FK1 FELKESZ_EGYSEG NUMBER FK1 TF _FELKESZID NUMBER
FELKESZ_RAKTARDB FLOAT TF _MENNYISEG FLOAT <
FELKESZ_MINRAKTAR FLOAT
[
'<
i
2.Az SQL nyelv áttekintése lváncsy Renáta
SZEZON
A szezon táblában tároljuk el az egyes Forma-l-es szezonok kezdő és végdátumát Az
elsődleges Irules a szezon évszáma.
Oszlop név Tipus Jelentés
ev INT A szezon azonosítója, lényegében az évszám.
kezdodatum DATE A szezon kezdete.
vegdatum DATE A szezon vége.
PlLOTA
A pilóta táblában tároljuk az egyes pilóták alapvető adatait.
Oszlop_ név Tipus Jelentés
pi lotaid INT A pilóta azonosítója.
nev NVARCHAR2( l 00) A pilóta teljes neve (a vezeték és a keresztnév is).
szuletesidatum DATE A pilóta születési dátuma.
nemzetiseg NV ARCHAR2(50) A pilóta nemzetisége.
magassag INT A pilóta magassaga cm-ben.
suiy INT A pilóta súlya kg-ban.
CSAPAT
A csapat táblában olyan adatok kerülnek eltárolásra, ami a csapat jellemzője, és a
szezonok során nem változik. Az itt felvett mezők definíciószerüen nem változnak.
Oszlop név Tipus Jelentés
csapatid INT A csapat azonosítója.
nev NVARCHAR2(50) A csapat neve.
szekhely NVARCHAR2(50) A csapat székhelye.
40
2.Az SQL nyelv áttekintése Iváncsy Renáta
CSAPAT_SZEZON
A csapat_szezon táblában adjuk meg, hogy mely szezonban mely csapatok indultak és
m.ilyen egyéb tulajdonságokkal rendelkeznek az adott szezonban. Dyen például a fönök neve,
a használt gumi abroncs vagy a motor típusa.
Oszlop név Tipus Jelentés
Csaoatszezonid INT A tábla azonosítója.
Csapatid INT A csapat azonosítója.
Ev INT A szezon azonosítója
Fonoknev NV ARCHAR2(1 00) A csapat fönökének a neve az adott szezonban.
Abroncs CHAR( l) A csapat által használt abroncs típusa az adott
szezonban. M = Michelin, B = Bridgestone
Motor NV ARCHAR2(5ó) A motor típusa.
CSAPAT_PILOT A
A csapat pilóta táblában tároljuk el, hogy egy-egy szezonban mely pilóták versenyeztek
az egyes csapatoknál.
Oszlop név Tipus Jelentés
csapatszezonid INT A csapat szezon azonosítója.
pilotaid INT A pilóta azonosítója.
pi Iotatipus CHAR(!) A pilóta típusa. l = elsö számú pilóta, 2 =
másodszámú pilóta, T = teszt pilóta
HELYSZIN
A helyszín táblában tároljuk el az egyes futamok lehetséges helyszíneit, és a helyszínhez
kötődö legfontosabb információkat
Oszlop név Tipus Jelentés
helyszini d INT A helyszín azonosítója.
nagydij NVARCHAR2(5ő) A nagydij neve.
palya NVARCHAR2(50) Ha van a pályának külön neve, akkor azt ebben az
oszlopban lehet megadni.
palvahossz FLOAT A pálya hossza méterben.
korokszaroa INT A körök száma, amit egy versenyen meg kell tenni
korrekord FLOAT A pályán elért eddigi legjobb eredmény
másoduercben.
korrekordpilotaid INT A lelriobb eredményt elért pilóta azonosítója.
41
2.Az SQL nyelv áttekintése Iváncsy Renáta
FUTAM
A futam táblában az egyes szezonokban a különbözö pályákon megrendezett futamok
adatait tároljuk el.
Oszlop név Tipus Jelentés
Futamid INT A futam azonosítója
helyszinid INT A helyszín azonosítója
ev INT A szezon azonosítója.
datum DATE A futam pontos dátuma.
leggyorsabbkorido FLOAT A futamon elért legjobb kör ideje másodpercben.
leggyorsabbkorpi Iota INT A legjobb kört elért pilóta azonosítója.
FUT AM_PILOT A
A futam _pilota tábla az egyes futamokon az egyes pilóták által elért eredményt
tartalmazza.
Oszlop név Tipus Jelentés
futamid INT A futam azonosítója
pilotaid INT A pilóta azonosítója
helyezes INT A pilóta által elért helyezés.
ido FWAT A pilóta ideje másodpercben. Ha az adott pilótát
lekörözték, akkor ez az érték nulla.
teljesitettkorokszama INT A pilóta által teljesített körök száma.
rajtracs INT A rajtrács, ahonnan apiióta indult.
esemeny NV ARCHAR2(50) Esetleges esemény, anu a pilóta ki esését
eredményezte, illetve a lekörözöttek eselén a
lekörözés mértékét tartalmazza.
SZPONZOR
A csapatokat évente szponzorálha~ák különbözö szponzorok. A szponzor tábla a
szponzorok adatait tárolja.
Oszlop név Tipus Jelentés
szponzorid INT A szponzor azonosítója.
nev NV ARCHAR2( l 00) A szponzor neve.
szelehely NV ARCHAR2( l 00) A szponzor székhelye.
CSAPAT_SZPONZOR
A csapat_szponzor tábla azt határozza meg, hogy mely évben mely szponzor mely
csapatot mennyivel támogatott.
Oszlop név Típus Jelentés
cs~atszezonid INT A csapatszezon azonosítója
szponzorid INT A szponzor azonosítója
osszeg_ INT A támogatási összeg.
42
2.Az SQL nyelv áttekintése lváncsy Renáta
CSAPAT CSAPAT_SZPONZOR
? ~
~ SZPONZOR
CSAPAT_SZEZON PK SZPQ!!IZ:QBIIl NUMBER
PK !;;~é.~AISz:ii;Z:Qttlll NUMBER NEV CHAR(10)
SZEKHELY CHAR(10)
FK1 CSAPAliO NUMBER
FK2 EV NUMBER
FONOKNEV CHAR(10) CSAPAT_P!L.QTA
ABRONCS CHAR(1)
MOTOR CHAR(10) PK,FK1 CSé,Pé,TSZ:EZONIIl NUMBER
PK,FK2 ~ILQIAIIl NUMBER
~ l P!LOTATIPUS CHAR(1)
l
~
)
SZEZON
PILOTA
PK ~ NUMBER
PK PILQIAIQ NUMBER
KEZDODATUM DATE
VE GOATUM DATE NEV CHAR(10)
1------------------ -o+ SZULETES!OATUM DATE
? l
l NEMZETISEG CHAR(10)
~
MAGASSAG NUMBER
2 SULY NUMBER
PK ElJIAMlll
FUTAM
NUMBER
?
)
FK2 HELYSZINIO NUMBER
FK1 EV NUMBER FUTAM_PILOTA
OA TUM DATE
LEGGYORSABBKORIDO FLOAT ~ PK,FK1 EI.!Ié.MIIl NUMBER
FK3 LEGGYORSABBKORPILOT A NUMBER PK,FK2 ~ILQIAIIl NUMBER
~
l
HELVEZES
IDO
NUMBER
FLOAT
TELJESITETTKOROKSZAMA NUMBER
~ RAJTRACS
E SEME NY
NUMBER
CHAR(10)
HELYSZIN
PK HELYSZ:INIIl NUMBER
NAGYDIJ CHAR(10)
PALYA CHAR(10)
PALYAHOSSZ FLOAT
KOROKSZAMA NUMBER
KORREKORD FLOAT
FK1 KORREKOROPILOTAIO NUMBER
43
3.A PUSQL áttekintése Iváncsy Renáta
3. A PL/SQL áttekintése
A PUSQL (Procedural Language/SQL) az Oracle adatbázis-kezelő rendszer procedurális
nyelve. Segítségével létrehozhatunk olyan programokat, amik tartalmaznak programvezérlő
3.1.Biokkok
Egy blokk három fö részből áll: az opcionális deklarációs részből (declare), a kötelező
44
3.A PUSQL áttekintése lváncsy Renáta
BEGIN
<PL/SQL futtatható utasítások;>
[EXCEPTION
<hibakezelés;>]
END;
A dek.larációs részben kerülnek a változók. konstansok. kurzorok és a kivételek
deklarálásra és inicializálásra (kezdeti érték adásra). Erre a blokkon belül máshol nincs mód.
Minden változó deklarációnak meg kell előznie a változó elsö felhasználását. Ezt azért fontos
megjegyezni, mert előfordulhat, hogy egy változó inicializálásakor egy már addig inicializált
változót használunk fel. A futtatható részben a PUSQL utasítások helyezkednek el. A
hibakezelés az EXCEPTION és az END szó közt foglal helyet. Itt lehet megadni azokat a
PUSQL programsorokat, amiket a megadott hiba keletkezésekor szeretnénk végrehajtani.
Például ilyen lekezelendö hiba szokott lenni a nullával való osztás, ZERO _DIVI DE, vagy a
lekérdezés egyetlen sorral sem tért vissza, NO_ DATA_ FOUND rendszer kivétel. Az
alábbiakban egy minta blokkot láthatunk. Figyeljük meg, hogy minden PUSQL utasítást
pontosvessző (;) zár le, és a blokkot bezáró END után is pontosvessző áll.
DECLARE
anyagnev VARCHAR2(20);
anyagid NUMBER(5) :=15;
BEGIN
SELECT anyag_nev INTO anyagnev FROM anyag
WHERE anyag_id anyagid;
EXCEPTION
WHEN NO DATA FOUND THEN
anyagnev := 'Hiba';
END;
A három említett blokktípus a következő szintaktikával rendelkezik:
Anonim blokk:
[<<blokk fejléc>>]
[DECLARE
<deklarációk>]
BEGIN
<utasítások>
[EXCEPTION
<hibakezelés>]
END;
45
3.A PUSQL áttelrintése Iváncsy Renáta
Eljárás:
PROCEDURE nev[(<paraméterek>)] IS
[<deklarációk>]
BE GIN
<utasítások>
[EXCEPTION
<hibakezelés>]
END;
Függvény:
FUNCTION nev[(<paraméterek>)J
RETURN adattípus IS
[<deklarációk>]
BE GIN
<utasítások>
RETURN érték;
[EXCEPTION
<hibakezelés>]
END;
Az alprogramok (ftlggvények, eljárások) a program olyan részei, melyek paramétereket
kaphatnak és több helyröl, többször meghívhatóak. Az eljárás müveletek elvégzésére, a
függvény értékek kiszámítására szolgál.
ABEGIN és az END kulcsszavak között DML (Data Manipulalion Language) utasítások,
programvezérlő utasítások és tranzakció kezelő utasítások szerepelhetnek. Függvények esetén
a DML utasítások közlll csak a SELECT utasítás szerepelbet, az INSERT, UPDATE, vagy
DELETE utasítás nem.
46
3.A PUSQL áttekintése Iváncsy Renáta
3.3.Kurzorok
Az ORACLE az SQL parancsok futtatásához munkaterületet használ, erről a területről
nyerhetjük ki az információt. A Imrzor nevü PUSQL konstrukció lehetőséget ad arra, hogy
elnevezzünk egy ilyen munkaterületet, így kapva lehetőséget az általa tárolt információ
eléréséhez. Kétfajta Imrzor létezik, az implicit és az explicit. A PUSQL m.inden olyan
utasításhoz, ami pontosan egy sort ad vissza. készít egy implicit kurzort. A többsoros
lekérdezésekre a programozónak explicit kell defmiálnia a kurzort.
DECLARE CURSOR Cl IS
SELECT anyag nev,anyag id FROM anyag;
A kurzort, a deklarációs részben hozzá kell rendelni egy lekérdezéshez. Használat előtt
meg kell nyitni (OPEN), ekkor a kurzor az eredményhalmaz legelső sorára mutat. Az egyes
sorokat a FETCH utasítással nyerjük ki belőle, ilyenkor visszaadja azt a sort, amin állt, majd a
következő sorra ugrik. Használat után a kurzort le kell zámi (CLOSE). A kurzorokat általában
ciklusban szokták felhasználni, ahol m.inden egyes iterációban egy sort dolgozunk fel.
A kurzorváltozók hasonlóak a kurzorokhoz, azzal a különbséggel, hogy a kurzorváltozót
több lekérdezésre is meg lehet nyitni, új értéket kaphat, és alprogramok paramétere is lehet. A
kurzorváltozókhoz, ellentétben a kurzorokkal, nem a deklarációs részben rendelünk
lekérdezéseket, hanem a futás során.
3.4.Attribútumok
A PUSQL változóknak és kurzoroknak attribútumai vannak, aminek segítségével
utalhatunk egy elem adattipusára és struktúrájára anélkül, hogy azt állandóan
megismételnénk. Az attribútum jelölésére a %jel szolgál. Példaként nézzük meg a változókra
használható %TYPE és %ROWTYPE attribútumokjelentését.
ltfo TYPE: A %TYPE attribútum egy változó vagy adatbázisbeli tábla oszlopának
adattípusát adja meg.
ltfoROWTYPE: A PUSQL-ben rekordok szolgálnak a logikailag összetartozó adatok
csoportba gyűjtésére. A %ROWTYPE egy rekordot ad meg, melynek elemeinek típusa rendre
megegyezik a hivatkozott tábla oszlopainak a tfpusával.
l anyag rec anyag%ROWTYPE;
47
3.A PUSQL áttekintése Iváncsy Renáta
3.5.Programvezérlő utasítások
A programvezérlő utasítások a PUSQL legfontosabb kiterjesztése az SQL-hez képest. A
PUSQL nem csak azt engedi meg, hogy az adatot manipuláljuk az adatbázisban, hanem
lehetőséget ad ciklusok. feltételek definiálására, használatára. Ezáltal az adatokat könnyen fel
lehet dolgozni.
A feltételes utasítás
Gyakran egy feltétel alapján más utasítást akarunk végrehajtani. Ennek megoldására
szolgál az IF-THEN-ELSE utasítás, ami az IF kulcsszó mögött álló kifejezést kiértékeli, és
ha annak az eredménye igaz, elvégzi a THEN lrulcsszó után álló utasításokat, ha hamis, az
ELSE után állókat hajtja végre.
Ciklusok
Ciklusok segítségével egy utasítássorozatot tetszőleges számban ismételhetünk meg. Erre
valók a LOOP, a WHILE LOOP és a FOR LOOP utasítások. A LOOP segítségével egy
végtelen ciklust szervezhetünk meg. A WHILE LOOP addig hajtja végre az utasításokat, amig
a WHILE után álló kifejezés igaz. A FOR LOOP segítségével pontosan meghatározhatjuk a
végrehajtandó ciklusok számát.
3.6.Modularitás
A modularitás segítségével a programot logikailag kisebb egységekre lehet bontani. Így
egy komplex problémát meg lehet oldani több, egyszerű probléma megoldásávaL A PUSQL-
ben a modularitást a blokkokkal (blocks), alprogramokkal (subprograms) és csomagokkal
(packag es) biztosították.
Az alprogramokról (filggvények. eljárások) már esett szó, és későbbiekben részletesen
lesz tárgyalva.
A csomagok két részből állnak. A specifikációból és a törzsből. A specifikáció az
interfész a csomag és a program között, deklarálja a típusokat, konstansokat, változókat,
kivételeket, lrurzorokat és az elérhető filggvényeket és eljárásokat. A törzs definiálja a
lrurzorokat és megvalósítja a filggvényeket, eljárásokat.
A csomagok lényege, hogy a programok csak a deklarációt látják és érik el, a törzs rejtve
marad előlük. Csomagokat az Oracle szerveren is lehet fordítani és tárolni, ahol a tartalmukat
több program is megoszthatja egymás közt.
48
3.A PUSQL áttekintése lváncsy Renáta
adatokat tartalmaznak.
3.8.0bjektumok
Az objektumok magukba foglalnak egy adatstruktúrát, és az adatok manipulálásához
szükséges filggvényeket, eljárásokat. Az objektumok változóit attribútumoknak (attributums)
nevezzük. a filggvényeket, eljárásait metódusoknak (methodes). Az objektumok, hasonlóan a
csomagokhoz szintén két részből állnak, egy specifikációból és egy törzsből.
3.9.Hibakezelés
A prograrnak végrehajtása során előfordulhatnak hibák. A PUSQL segítségével ezek a
hibák könnyen kezelhetők. Alapvetöen kétféle hiba létezik:
• rendszer által definiált hibák, amik két csoportra bonthatók tovább:
o az előre definiált (névvel ellátott) Oracle szerver hibákra, és
o az előre nem definiált (csak számmal azonosított) Oracle szerver hibákra,
• felhasználó által definiált hibák.
A rendszerhibák megadott eseményekre hívódnak meg, amiket a blokk EXCEPTION
részébe lehet lekezelni. A felhasználói hibákat deklarálni kell, majd a program egy részén a
RAISE utasítással generálni kell öket. Elkapni a felhasználói hibákat is az EXCEPTION
részben kell.
49
4.A PUSQL alapjai Iváncsy Renáta
4. A PL/SQL alapjai
4.1. Karakterek
Egy PUSQL program írásához a következő karaktereket használhatjuk:
• kis és nagybetük: a .. z, A. .Z,
• számok: 0 .. 9,
• szimbólumok: ( ) + - • l<> = ! -l\ ; : • ' @ % , " # S& _l { } ? [ ].
A PUSQL nem érzékeny a kis és nagybetükre, tehát a következő változókat azonosnak
tekinti:
LocalName
localname
l LOCALNAME
4.2.Megjegyzések
Mint minden programozási nyelvben, természetesen a PUSQL-ben is lehetőség van
megjegyzések (comments) írására a programban. Az egysoros kommenteket a dupla
minuszjellel jelölhetjOk (--). Ezzel megjelölhetünk egy kommentet a sor elején, vagy akár egy
programkód után is.
--itt kezdődik egy blokk
DECLARE
my student varchar2(20); --a my student változó deklarálása
Többsoros kommenteket a/* *l jelek közé zárva tehetünk.
/*
LOOP
i:=i+l;
END LOOP;
*l
A többsoros kommentekre megkötés. hogy nem lehet öket egymásba ágyazni.
4.3.Azonosítók
Azonosítókat a változók, konstansok, kivételek, kurzorok, kurzorváltozók, alprogramok
és csomagok azonosítására hasmálunk. Minden azonosítónak betllvel keD kezd6dnie, amit
50
4.A PUSQL alapjai Iváncsy Renáta
további betük. számok, dollátjel vagy aláhúzás követhet. Egyéb szimbólum használata az
azonosilókban nem megengedett. Az azonosiló mérete maximálisan 30 karakter lehet.
local-name --nem megengedett a kötőjel miatt
local name --megengedett
A PUSQL-ben szálnos foglalt szó van, amit nem használhatunk azonosílóként llyenek
például a tipusok. a programvezérlés szavai stb. (CHAR. BOOLEAN, WOP, IF, END,
THEN stb.).
Lehetőség van azonosítókat dupla aposztrófok (") közölt megadni. Ekkor az azonosító
bármilyen nyomtatható karaktert tartalmazhat, kivéve a dupla aposztrófot. Ezeknek az
azonosítóknak. is maximálisan 30 karakter lehet a hossza, beleértve a nyitó és záró
aposztrófokat is.
"on/off switch"
l. "local-name"
A PUSQL foglalt szavak az SQL -ben nem foglaltak, így lehetőség van olyan tábla, vagy
oszlopnevet definiálni, ami a PUSQL-ben foglalt szó. Gond akkor lép fel, ha a PUSQL-ben
ezekre a táblákra, mezők:re akarunk hivatkozni. Ha csak egyszeruen leújuk a nevüket, hibát
kapunk. Helyette aposztrófok (") közé kell őket tenni, és csupa nagybetüvel írni. Noha
megoldható, mégsem ajánlatos PUSQL foglalt szavakat használni SQL-ben.
SELECT ace, type, bal INTO ... FROM account --hibát okoz
SELECT ace, "TYPE",bal INTO _ FROM account --helyes megoldás
4.4.Literálok
A !iterál egy olyan explicit karakter, szám vagy boolean érték. ami nincs azonosílóhoz
kötve.
• Szám literálok: 6 -14 O +32568 -6.666 3,142857 2e4.
• Karakter literálok: 'z' '7' 'a'.
• Sztring literálok: 'Hello world! •.
Minden sztring, kivéve az üres és az egybetüs sztringet, ami karakter tipusú.
• Boolean literálok: true, false, null.
• Dátum literálok: '1998-12-25' '1997-10-13 10:22:14'.
51
4.A PUSQL alapjai Iváncsy Renáta
blokk, alprogram és csomag deklarációs részében lehet deklarálni. A deklaráció helyet foglal
az értéknek, a típusának megfelelően, és elnevezi a tárolás helyét, hogy tudjunk hivatkozni rá.
Néhány példa:
szuletesi datum DATE;
eletkor SMALLINT:=l;
Az első deklaráció elnevez egy dátum típusú változót. A második elnevez egy
SMALLINT tipusú változót, és értéket ad neki az értékadó operátor segítségéveL
A következő példában látható, hogy változó értékadó utasítás jobb oldalán állhat komplex
kifejezés is, és akár korábban deklarált, és érték.kel ellátott változó is.
pi REAL:=3.14159;
sugar REAL:=l;
terulet REAL:=pi * sugar**2;
Ha deklaráláskor nem adunk értéket egy változónak. akkor az NULL értékű lesz.
Megtehetjük azt is, hogy egy változónak megtiltjuk, hogy NULL értéket vegyen fel, ezt a NOT
NULL kulcsszó használatával érhetjük el. Ekkor azonban deklaráláskor mindenképp értéket
kell adni a változónak.
Konstans deklarálása a CONSTANT kulcsszó segítségével történik, és rögtön értéket kell
neki adni. Késöbb már nem is lehet, hiszen a konstans értéke a program során nem változhat.
Változók, konstansok inicializálására az értékadó operátor (:=) helyett használhatjuk a
DEFAULT kulcsszót is. Ez megadja az alapértelmezett értéket. Lássunk most néhány példát az
itt elmondottakra:
szuletesi datum DATE; --NULL az értéke, mert nincs
inicializál va
szuletesi datum DATE:=NULL; --NULL az értéke, mert NULL-ra
inicializáltuk
szuletesi datum DATE NOT NULL:='1979-may-02';
pi CONSTANT REAL:=3.14; --konstans deklarálása
vercsoport CHAR DEAFULT '0'; --alapértelmezett értékadás
%TYPE
A %TYPE attribútum egy változó vagy adatbázisbeli tábla oszlopának adattipusát adja
meg. Tegyük fel, hogy szeretnénk létrehozni egy változót az anyagok nevének tárolására. Az
anyag lábiában a anyag_nev oszlopban tároljuk az anyag nevét. Ehhez létrehozunk egy
my _ anyagnev változót, és azt szeretnénk, hogy típusa egyezzen meg az adatbázisban tárolt
oszlop típusával :
52
4.A PUSQL alapjai lváncsy Renáta
%ROW1YPE
A PUSQL-ben rekordok szolgálnak a logikailag összetartozó adatok csoportba
gyűjtésére. A %ROWTYPE egy rekordot ad meg, melynek elemeinek típusa rendre
megegyezik a hivatkozott tábla oszlopainak a tipusávaL Tegyük fel, hogy létrehoztunk egy
táblát az adatbázisban:
CREATE table diak (azonosito number(6), vezeteknev
varchar2(50), keresztnev varchar2(20));
A PUSQL programunkban szeretnénk egy rekordot létrehozni, amiben el tudjuk tárolni
ezen tábla egy sorát. Ezt a következöképpen tehetjük meg:
lmy student diak%ROWTYPE;
Ekkor a my _st u den t rekord egyes mezöinek a tipusa megegyezik a tábla oszlopainak a
tipusávaL A %ROWTYPE a lrurzorokkal is mük.ödik:
DECLARE CURSOR cl IS SELECT azonosito, vezeteknev FROM diak;
diak kurzor rec cl%ROWTYPE;
Ha a lrurzor úgy kap értéket, hogy a SELECT utasításban nem egyszerűen egy név van
megadva, hanem valamilyen kifejezés, akkor azt a kifejezést el kell nevezni (alias), hogy a
rekord mezöjeként késöbb tudjunk rá hivatkozni.
DECLARE
CURSOR my_cursor IS SELECT anyag_maxraktardb - anyag_raktardb
rendeles FROM anyag;
Ebben a példában az alias a rendeles, hiszen a SELECT listában egy kifejezés
szerepel.
4.6.Név konvenciók
A névkonvenciók egyformán vonatkomak minden program elemre, beleértve a
változókat, konstansokat, lrurzorokat, kurzorváltozókat, kivételeket, eljárásokat, fiiggvényeket
és csomagokat. Nevek lehetnek egyszerűek (simple/unqualified), azaz nem minösítettek,
minösítettek (qualified) és távoliak (remote). Tegyük fel, hogy van egy eljárásunk, a
fizetes _ emeles (),ekkor k:ülönbözö helyről k:ülönbözö módon hivatkozhatunk rá.
53
4.A PUSQL alapjai lváncsy Renáta
fizetes_emeles(); --simple/unqualified
dolgozo_esemenyei.fizetes_emeles(); --qualified
fizetes_emeles@miskolc(); --remete
dolgozo_esemenyei.fizetes_emeles@miskolc(); --qualified and
--remote
A:z elsö esetben egyszerűen használjuk az eljárás nevét. A második esetben az eljárás az
dolgozo_ esemenyei nevü csomagban van. ezért ha hivatkozni akarunk rá, azt úgy tudjuk
megtenni, hogy megnevezzük a csomagot, egy pontot teszünk, majd megnevezzük az eljárást
Minösített nevet olyan esetben is szokás alkalmazni, amikor a séma megjelölésével
hivatkorunk egy-egy adatbázis objektumra vagy tárolt programrészre. A harmadik esetben a
@ jellel egy távoli adatbázisban tárolt eljárásra hivatkozunk. A negyedik esetben együtt
használjuk a minösitett nevet és a távoli nevet.
4. 7.N évelfedés
Egy SQL utasításban az oszlop neve elfedi a PUSQL változó nevét. Például a következő
példában a DELETE utasítás hatására az összes anyag ki lesz törölve az anyag táblából,
nem csak a 'CUKOR' nevü, mivel az SQL a WHERE feltételben szereplö mindkét
anyag_ nev változót oszlopnévnek tekinti.
DECLARE
anyag nev VARCHAR2(10) :='CUKOR';
BEGIN
DELETE FROM anyag WERE anyag . anyag nev=anyag nev;
Ennek elkerülésére érdemes mindig más változónévvel elnevezni a PUSQL változónkat,
mint az oszlopokat. A másik megoldás, ha blokk címkét használunk. és a WHERE feltételben a
PUSQL változóra a címkével hivatkozunk.
<<main>>
DECLARE
anyag nev VARCHAR2(10) : ='CUKOR';
BEGIN
DELETE FROM anyag WERE anyag.anyag nev=main.anyag nev;
54
4.A PUSQL alapjai lváncsy Renáta
55
4.A PUSQL alapjai lváncsy Renáta
4.9.Értékadás
A változókat és konstansokat m.inden blokkban vagy alprogramban inicializálni kell.
Amig egy változó nincs inicializálva, értéke NULL. Dyen a konstansoknál nem fordulhat elő,
END;
A változó értéket kaphat egy adatbázis lekérdezés során is. Itt nagyon fontos azt
megjegyezni, hogy a lekérdezésnek pontosan egy sorral kell visszatémie, különben hibát
kapunic Ha a lekérdezés egyetlen sorral sem tér vissza. a NO_DATA_FOUND hibát dobja a
rendszer, ha több mint egy sorral tér vissz a lekérdezés, akkor a TOO_MANY _ROWS kivétel
generálódik. (A kivételekről részletesen egy késöbbi fejezet szól). A lekérdezés eredményét
változóha a következő szintaktikával tehetjük:
SELECT oszlopl,oszlop2, ... INTO valtozol,valtozo2, •• FROM tabla ...
A SELECT és az INTO kulcsszavak között a lekérdezendő oszlopok nevei állnak. Az
INTO kulcsszó után állnak a változók, amibe az oszlopok értékét tároljuk el. Az oszlopok
számának, sorrendjének és típusának meg kell egyezni az I NTO kulcsszó mögött álló
változók számával, sorrendjével és típusávaL
Megjegyzendő, hogy más módon lekérdezést PUSQL blokkban nem is lehet megadni,
mindenképpen vagy egy kurzorban, vagy egy változóban el kell tárolni a lekérdezés
eredményét.
DECLARE
termekid INT;
tnev VARCHAR2(20);
tmennyiseg INT;
BEGIN
56
4.A PUSQL alapjai lváncsy Renáta
termekid := l;
SELECT termek_nev, termek_mennyiseg INTO tnev, tmennyiseg
FROM termek WHERE termek id = termekid;
END;
Hasonlóan az egysoros lekérdezéshez, a változó értéket kaphat lrurzorokból is. A
lrurzorokról késöbb még részletesen lesz szó. Az értékadás szintaktikája a következő, a
változókra vonatkozó feltételek megegyeznek a SELECT INTO esetén elmondottakévaL
FETCH kurzor INTO val tozol, val tozo2, ...
Az értékadás negyedik módja, ha a változó egy eljárás vagy egy filggvény kimenő
57
4.A PUSQL alapjai lváncsy Renáta
8+6/2=11
1 (8+ 6) /2=7
AND OR
TRUE
NULL FALSE TRUE NULL FALSE
TRUE TRUE NULL FALSE TRUE TRUE TRUE TRUE
NULL NULL NULL FALSE NULL TRUE NULL NULL
FALSE FALSE FALSE FALSE FALSE TURE NULL FALSE
..
Ha egy kifeJezés több logikat operátort használ, és már az elsö lépésekben eldől, hogy mi
a kifejezés eredménye, akkor a PUSQL nem megy végig az összes operátoron, hanem ahol
megvan az eredmény, ott abbahagyja a Iciértékelést Például, ha több V AGY kapcsolatban a
PUSQL legalább egy TRUE értékűt talál, akkor nem folyatatja tovább a kiértékelést, hiszen
mindenképp TRUE lesz az eredmény.
A LIKE operátor
A LIKE operátor karakterek, sztringek és CLOB értékek összehasonlítására szolgál.
Értéke TRUE, ha az összehasonlított sztringek megegyeznek, és FALSE, ha nem. Az
összehasonlító kifejezés két speciális karaktert tartalmazhat. A _ egy karaktert jelent, aminek
az értéke bármilyen lehet, a % nulla vagy több tetszőleges karaktert jelent. A LIKE operátor
után megadható egy escape karakter az ESCAPE kulcsszó segitségével. Dyenkor ennek a
karakternek a segítségével tudunk olyan karakterekre is rákeresni, amik eredetileg valamilyen
jelentéssei bírnak ( pl. aláhúzás, százalékjel, aposztróf).
l SELECT kamat from szamla WHERE kamat LIKE '5\%' ESCAPE '\'
58
4.A PUSQL alapjai lváncsy Renáta
A BETWEEN operátor
A BETWEEN operátor azt vizsgálja, hogy egy érték a megadott határokon belül van-e.
Nagyobb vagy egyenlö, mint az alsó határ és kisebb vagy egyenlö, mint a felsö határ. Ha igen,
TRUE-t ad vissza, ha nem FALSE-t.
Az IN operátor
Azt vizsgálja, hogy az adott érték egy halmazban megadott értékek valamelyikével
egyenl ö-e.
59
5.PUSQL programvezérlö utasítások lváncsy Renáta
S.l.Feltételes utasitások
Az IF utasítás segítségével feltételtől ftlggően lehet végrehajtani egy utasítás sorozatot,
vagy egy másikat. Az IF utasitásnak három formája van. Az IF-THEN, az IF-THEN-ELSE
és az IF-THEN-ELS IF.
IF feltétel THEN
<utasítások;>
END IF;
Ha a feltétel eredménye igaz, a THEN és az END IF kulcsszavak közötti utasítások
hajtódnak végre. Ha a feltétel eredménye hamís, vagy NULL, az END IF kulcsszó utáni
utasítással folytatódik a program. A feltétel részben több feltétel is megadható az AND vagy
az OR kulcsszavak hasmálatával. Az első esetben ÉS kapcsolatba, a második esetben V AGY
kapcsolatba kerülnek az egyes feltételek.
IT feltétel THEN
<utasitásokl;>
ELSE
<utasitások2;>
END IF;
Ha a feltétel kiértékelésének eredménye igaz, az utasí tá so kl fut Je, majd az END IF
után folytatódik a program. Ha a feltétel hamís vagy NULL eredményt ad, az utas i tások2
fog )efutni. Az ELSE ág további IF-THEN vagy akár IF-THEN-ELSE utasításokat
tartalmazhat.
60
S.PUSQL programvezérló utasítások lváncsy Renáta
61
5.PUSQL programvezérlő utasltások lváncsy Renáta
dbms output.put_line('Elegseges');
ELSIF osztalyzat = 'l' THEN
dbms_output.put line('Elegtelen');
ELSE
dbms_output.put line('Ilyen osztalyzat nem letezik');
END IF;
CASE osztalyzat
WHEN '5' THEN dbms - output.put line ('Jeles') ;
WHEN l 4 l THEN dbms _output.put_ l i ne ( 'J o' ) ;
WHEN '3' THEN dbms - output. put line('Kozepes');
WHEN '2 THEN dbms - output.put line('Elegseges');
l
utasítások fognak lefutni. Ha nem definiáltunk ELSE ágat, a program a CASE_ NOT_ FOUND
hibát generálja. A CASE utasítás, hasonlóan a blokkokhoz, címkét kaphat.
62
5.PUSQL programvezérlő utasltások Iváncsy Renáta
A CASE utasítás egy másik formája a SEARCHED CASE utasiás. Ennek általános
formája a következő:
[<<címke>>]
CASE
WHEN keresési feltétell THEN utasítások_sorozatal;
WHEN keresési feltétel2 THEN utasítások sorozata2;
5.2.Ciklusok
A cik.lusok segítségével utasítások sorozatát tudjuk lefuttatni többször egymás után. A
ciklusoknak három formája van a PUSQL-ben: a LOOP, a WHILE-LOOP és a FOR-LOOP.
5.2.1. LOOP
A cikJus legegyszerűbb formája a LOOP.
[<<címke>>]
LOOP
<utasítások sorozata;>
END LOOP [címke];
63
5.PUSQL programvezérlő utasítások Iváncsy Renáta
ii:=ii+l;
EXIT WHEN ii=lO; -- kilép a ciklusból, ha a feltétel igaz
END LOOP;
64
S.PUSQL programvezérlő utasítások lváncsy Renáta
<<outer>>
LOOP
LOOP
5.2.3. WIDLE-LOOP
A WH I LE ciklus megad egy feltételt, amíg az igaz, a ciklus lefut, ha hamis vagy NULL ,
az END LOOP utáni utasításon folytatja a program a végrehajtást. Formája:
WHILE <feltétel> LOOP
<uatsitások __ sorozata;>
END LOOP;
Mielött a ciklus lefutna, a feltétel kiértékelődik, és az eredménynek megfelelöen vagy
belép a ciklusba, vagy átugorja azt. Mivel ez elöl tesztelős ciklus, előfordulhat, hogy egyszer
sem hajtódnak végre a cikluson belüli utasítások.
WHILE osszraktar <= 25000 LOOP
5.2.4. FOR-LOOP
Az eddigiekben olyan ciklusokat láttunk, ahol a ciklusok végrehajtásának a számát nem
tudtuk előre, valamilyen kifejezés értéke alapján léptünk ki a ciklusbóL Lehetőség van
azonban olyan ciklus létrehozására, ahol pontosan tudjuk, hogy hányszor fog végrehajtódni.
Ilyen ciklus a FOR-LOOP. Formája a következő:
<<cimke>>
FOR ciklus_ számláló IN [REVERSE) alsó határ .. felső határ LOOP
<utasitások_ sorozata;>
END LOOP;
65
5.PUSQL programvezérlő utasítások lváncsy Renáta
A FOR ciklusban definiálunk egy szám.lálót, amely m.inden egyes ciklus lefutáskor ~
növeli az értékét Az alsó_határ és a felső_határ között veszi fel az értékét,
induláskor az alsó_határ az értéke, és amikor eléri a felső_határ-t, a ciklus leáll.
Lehetőség van arra is, hogy a ciklusváltozó lefele számoljon. Ha a REVERSE kulcsszót is
beleíJjuk a FOR ciklus formájába, akkor a felső_határ-tól fog indulni, és egyesével
csökken, míg el nem éri az alsó_határ-t. Ha a két határérték értéke megegyezik, a ciklus
pontosan egyszer fog végrehajtódni. Ha az alsó_határ értéke nagyobb, mint a
felső_ határ-é, akkor a ciklus egyszer sem hajtódik végre. A FOR ciklus ciklusszámlálóját
nem kell külön deklarálni, az implicit deklarálódik a ciklusba lépéskor. A FOR ciklus
számlálója nem kaphat értéket a cikluson belül, de állhat értékadás jobb oldalán. Ha a ciklus
befejezödött, a ciklus számlálójára már nem is hivatkozhatunk, mert a cikluson kívül
érvénytelen változó. A FOR ciklus számlálójának dinamiirusan is megadhatjuk az értékét
Ha a FOR ciklus számlálójának neve megegyezik a blokk egy globális változójának
nevével, akkor a FOR cikluson belül a számláló elfedi a globális változót. Ha mégis a globális
változóra szeretnénk hivatkozni, akkor a blokknak eimkét kell adni, és azon keresztül kell
hivatkozni a globális változóra:
<<main>>
DECLARE
ctr INTEGER;
BEGIN
FOR ctr IN 1 .• 25 LOOP
IF main.ctr > 10 THEN -- refers to global variable
END IF;
END LOOP;
END main;
A láthatóság ezen szabálya érvényes az egymásba ágyazott ciklusokra is. A FOR ciklus is
kaphat címkét, és ha egy belső cikluson belül a külső ciklus számlálójára szeretnénk
hivatkozni, használni kell a külső ciklus cimkéjét.
Az alábbi példában a járat táblát szeretnénk automatikusan kitölteni. A város tábla
minden városába megy egy járat Budapestről, és másnap visszafele is jön egy járat. A
megoldásban a tábla legkisebb és legnagyobb város azonosítói alapján megyünk végig, és ha
tartozik az adott ciklusváltozóhoz város, akkor a megfelelő adatokat beszúrjuk a járat táblába.
66
S.PUSQL programvezérlö utasítások lváncsy Renáta
DECLARE
Varasminid varas.varas id%TYPE;
Varasmaxid varas.varas id%TYPE;
Isvarasid INT;
Bpid INT;
Cel jarat.jarat celhely%TYPE;
BEGIN
SELECT min(varas id), max(varas id)
INTO varasminid, varasmaxid FROM varas;
SELECT varas id INTO bpid FROM varas
WHERE UPPER(varas_nev) = UPPER('BUDAPEST');
FOF i IN varasminid .. varasmaxid-1 LOOP
IF (i != bpid) THEN
SELECT COUNT(varas_nev) INTO isvarasid
FROM varas WHERE varas id = i;
IF isvarasid != O THEN
SELECT varas nev INTO cel FROM varas
WHERE varas id = i;
INSERT INTO jarat VALUES
(jaratseq.NEXTVAL,50,'Budapest',cel,sysdate);
INSERT INTO jarat VALUES
(jaratseq.NEXTVAL,SO,cel,'Budapest',sysdate+l);
COMMIT;
END IF;
END IF;
END LOOP;
END;
67
5.PUSQL programvezérlö utasítások lváncsy Renáta
<<end_loop>>
NULL; futtatható utasítás
END LOOP;
Megkötések a GOTO utasftásra:
• GOTO utasítással nem ugorhatunk egy IF utasításba be
• GOTO utasítással nem ugorhatunk be a blokkon belüli alblokkba
• GOTO utasítással nem ugorhatunk ki egy alblokkból
• GOTO utasítással nem ugorhatunk az EXCEPTION részből az ahhoz tartozó blokk
futtatható részébe
68
6.PUSQL adattípusok lváncsy Renáta
6. PL/SQL adattipusok
Minden változónak. konstansnak és paraméternek meg kell adni, hogy milyen tipusú. A
típus határozza meg, hogy milyen formában kell tárolni az adatokat, milyen megkötések
érvényesek rá, és hogy milyen tartományon belül vehetik fel az értékeiket. A PUSQL-ben
léteznek előre definiált adattípusok, és a felhasználó által definiált altipusok.
NUMBER[ (precision,scale)]:
Numerikus értékek (fix, lebegőpontos) tárolásának alaposztálya.
69
6.PUSQL adattipusok lváncsy Renáta
Azt is meg kell jegyezni, hogy noha a PUSQL-ben a karakter hossza elég nagy lehet, az
adatbázisban csak 2000 byte hosszú karaktereket tudunk eitároini
V ARCHARl(maximum_Iength[CHARIBYTE])
Változó hosszúságú karakter alaptípusa. Hossza maximálisan 32767 byte lehet. Itt is
megadható, hogy karakterben vagy byte-ban értjük a maximális hosszat. Ha nem adjuk meg,
hogy miben adtuk meg a hosszt, az alapértelmezett érték az NLS_LENGTH_SEMANTICS
inicializáló paraméterben található meg. Az adatbázisban tárolható méret 4000 byte.
LONG
Változó bosszúságú karakter alaptípusa. A LONG adatbázis mezö maximális hossza
214783647 byte lehet. A visszafele kompatibilitás támogatása érdekében használható, helyette
basználjunk inkább LOB típusú oszlopokat adatbázis táblákban.
DATE
Dátumot és időt lehet tárolni benne. Mezői: év, hónap, nap, óra, perc, másodperc, időzóna
óra, időzóna perc, időzóna régió. Tartománya i.e. 4 712 jan. l és 9999. dec. 31 között mozog.
LONGRAW
A bináris adat és byte sztringek alaptípusa. Hossza maximálisan 32760 byte lehet. LONG
RAW nincs a PUSQL-ben interpretálva.
BOOLEAN
Alaptípus, ami három értéket tud tárolni: TRUE, FLASE vagy NULL.
BINARY_INTEGER
Egész számok tárolására alkalmas. Értéktartománya: -2147483647 és 2147483647
(-2 31 -1...2 31 -1) közötti.
PLS INTEGER
Előjeles egészek tárolására alkalmaz. Értéktartománya -2147483647 és 2147483647
(-2 -1...2 -1) között lehet. Tárolása kevesebb erőforrást igényel, mint a NUMBER típusú
31 31
70
6.PUSQL adattipusok Iváncsy Renáta
6.2.LOB típusok
A LOB tipussal strukturálatlan, nagy adathalmazokat lehet tárolni az adatbázisban, vagy
az operációs rendszer fájlrendszerében. Az adat mérete elérheti akár a 4Gbyte-t is. llyen
adathalmaz lehet pl. Text, grafikus kép, videó klipek stb.
B FILE
A BFILE (binary file) nagy bináris fájlok tárolására szolgál az operációs rendszer
fájlrendszerében, az adatbázison kívül.
BLOB
A BLOB (binary large object) nagy bináris objektumok tárolására szolgál az adatbázisban.
CLOB
A CLOB (character large object) egy byte-os karakterek nagy blokkjainak a tárolására
szolgál az adatbázisban.
N C LOB
Az NCLOB (national language character object) NCHAR tipusú adatok nagy blokkjainak
tárolására szolgál az adatbázisban.
6.2.1. Altipusok
Az altípusok az alaptfpusra épülö tipusok, melyek valamilyen megszorítást tartalmaznak
az alaptipushoz képest.
BINARY_INTEGER altipusok
Az alábbi altípusok mind valamilyen megszorítást tartalmaznak az alaptipushoz képest.
NATURAL Nem negativ vagy QOzitiv számok
NATURALN Mint a NATURAL, csak nem veheti fel a O-t értékként.
POSITIVE Pozitiv számok
POSITIVEN Mint a POSITIVE, csak nem veheti fel a O-t értékként.
SIONTYPE Ertéke -1,0,1 lehet.
NUMBER altipusok
DEC Fixpontos szám, maximum 38 tizedes j egyen ábrázolva
DECIMAL Fixpontos szám, maximum 38 tizedes j egyen ábrázolva
DOUBLE PRECISION Lebegőpontos szám, maximum 126 bináris digiten ábrázolva
FLOAT Lebegőpontos szám, maximum 126 bináris digiten ábrázolva
INTEGER Egész szám, maximum 38 tizedes j egyen ábrázolva
INT Egész szám, maximum 38 tizedes j egyen ábrázolva
NUMERIC Fixpontos szám, maximum 38 tizedes j egyen ábrázolva
REAL Lebegőpontos szám, maximum 63 bináris digiten ábrázolva
SMALLINT Egész szám, maximum 38 tizedes j egyen ábrázolva
71
6.PUSQL adattípusok lváncsy Renáta
V ARCHARl altfpusok
STRING
VARCHAR
6.4.Adattfpus konverzió
Néha szükség van egy adattípusból egy másikba váltani. A PUSQL támogatjamind az
explicit, mind az implicit adatkonverziót
72
6.PUSQL adattipusok Iváncsy Renáta
DECLARE
start time CHAR(5);
finish time CHAR(5);
elapsed_time NUMBER(5);
BEGIN
/* Rendszeridő kiolvasása . */
SELECT TO_CHAR(SYSDATE, 'SSSSS') INTOstart time FROM
sys.dual;
valamit csinál
/* Rendszeridő ismételt kiolvasása*/
SELECT TO_CHAR(SYSDATE, 'SSSSS') INTO finish time FROM
sys.dual;
/* Az eltelt idő kiszámítása. */
elapsed_time := finish time - start time;
INSERT INTO results VALUES (elapsed_time, ... );
END;
Noha a PUSQL, amikor lehetséges, megteszi az adatkonverziót, mégis érdemes az
explicit adatkonverziót használni, hiszen így biztosak lehetllnk benne, hogy azt az eredményt
kapjuk, amit vártunk.
73
7.PUSQL összetett adattípusok lváncsy Renáta
END;
A rekord típus deklarálásának formája:
TYPE tipus_név IS RECORD (mez6_deklaráció[,mező_deklaráció] ... )
Ahol a mezö deklaráció formája a következő:
mezó_név mező_tipus [[NOT NULL] {: = l DEFAULT} kifejezés]
A típus_név a rekord típus neve lesz. A mező_név a rekordon belül tárolt mezők
nevei. Egy mező típusa bármely PUSQL típus lehet, kivéve a REF CURSOR típust. A rekord
74
7.PUSQL összetett adattípusok lváncsy Renáta
típus deklarálása után létre kell hozni egy változót, ami az adott típusú változó lesz. Ilyen
módon létrejön egy rekord. A rekord egyes mezöire a
rekord- név.mező - név
szintaktikával hivatkozhatunk.
A rekordnak többféleképpen lehet értéket adni. Az egyik mód, hogy az egyes mezöknek
külön adunk értéket az értékadó operátor segítségéveL Másik lehetőség a rekord
értékadásának a SELECT-INTO vagy a FETCH-INTO utasítás használata. Ekkor ügyelni
kell arra, hogy a rekord és a SELECT-ben vagy a lrurzorban szereplő adatbázis tábla használt
oszlopainak a típusa megegyezzen. Egyik rekordot értékül adhatunk egy másiknak. ha azonos
típusúak.
Mint ahogy arról már korábban volt szó, rekordot létrehozhatunk a %ROWfYPE
operátor segítségéveL Ekkor a rekord mezöinek neve és típusa sorra a hivatkozott tábla
oszlopainak neve és típusa lesz.
Bármely a felhasználó által definiált rekord soha nem lesz azonos típusú egy %ROWTYPE-
allétrehozott rekorddaL
A rekordokra jellemző tulajdonságok:
• Minden rekordnak annyi mezője lehet, amennyire szükség van.
• Rekordnak deklaráláskor is értéket lehet adni, és használhatjuk rá a NOT NULL
kulcsszót.
• Ha a rekord valamelyik mezöjét nem inicializáljuk, értéke NULL lesz.
• A rekord mezöinek definiálásakor használható a DEFAULT kulcsszó.
• Rekordot bármely alprogram, blokk és csomag deklarációs részében
deklarálhatunk.
• Rekord eleme is lehet rekord, így lehetőség van beágyazott rekordok használatára.
Az alábbi példában három rekordot hozunk létre. Az u t as_ re c_ type típus az utasok
adatainak a tárolására szolgál. A hotel_rec rekord a hotel adatai tárolására szolgál, a
%ROWTYPE segítségével került deklarálásra. A jarat_rec_type a járat adatait tárolja,
ahol az egyes mezők deklarálására a %TYPE operátor is felhasználásra került.
DECLARE
TYPE utas rec_type IS RECORD
id int,
nev varchar2(50),
utlevelszam char(8)
75
7.PUSQL összetett adattipusok I váncsy Renáta
) ;
id jarat.Jarat id%type,
ind jarat.jarat indulasihely%type,
cel jarat.jarat_celhely%TYPE,
ferohely int NOT NULL DEFAULT 80
) ;
BEGIN
SELECT utas id, utas nev,utas utlevelszam INTO utas rec
FROM utas where utas id = l;
DBMS OUTPUT. PUT LINE (utas re c. id l l 1
•
1
ll
utas rec.nev);
SELECT * INTO hotel rec FROM hotel WHERE hotel id = l;
DBMS_OUTPUT.PUT_LINE(hotel rec.hotel_nev l l 1 1
ll
hotel rec.hotel_varos);
SELECT jarat.jarat_id, jarat.jarat_indulasihely,
jarat.Jarat celhely, jarat.jarat ferohely
INTO jarat rec
FROM jarat WHERE jarat id = l;
DBMS_OUTPUT.PUT_LINE(Jarat rec.ferohely);
SELECT jarat.jarat_id, jarat.jarat_indulasihely,
jarat.jarat_celhely, jarat.jarat ferohely
INTO jarat_rec
FROM jarat WHERE jarat id = ll;
DBMS OUTPUT.PUT_LINE(jarat rec.ferohely);
END;
76
7.PUSQL összetett adattípusok lváncsy Renáta
tömbünk, amiben NUMBER típusú adatokat tárolunk, akkor a tömb 5. elemére a szamok (5)
szintaktíkával lehet utalni. (Az index kerek zárójelben van!) A tömbök előnye, hogy az
adatokat egyszerre is tudjuk kezelni, de egyesével is tudunk hivatkozni a tömb bármely
elemére. A tömböknek meg kell adni a maximális méretét, amit a deklarációs részben
tehetünk meg. A tömbnek fix alsóhatára van (a legkisebb index mindig l), de növelhető
felső határa. Ha például egy maximum l O hosszúságú tömbben csak 4 elem van, akkor a felső
határa 4, de növelhetö újabb elemek hozzáadásával. Ezt a növelést azonban csak addig
folytathatjuk. míg el nem érjük a maximális méretet.
77
7.PUSQL összetett adattipusok Iváncsy Renáta
78
7.PUSQL összetett adattipusok lváncsy Renáta
tomb.EXTEND;
tomb (i) . - 2* i;
END LOOP;
END;
7.3.PUSQL táblák
A PUSQL-ben kétfajta tábla típust definiáltak, az úgynevezett nested táblát (nested table)
és az index-by táblát (index-by table).
Unbou~lld
Mivel a nested táblából lehet törölni, így lukak maradhatnak benne. Ez azonban nem okoz
gondot az elemek szekvenciális elérésében, mert definiálva van egy NEXT nevü függvény,
aminek segítségével mindig a következő, nem törölt elem indexét kaphatjuk meg.
Egy nested tábla típust a következöképpen adhatunk meg:
TYPE tipus_név IS TABLE OF elern_tipus [NOT NULL];
79
7.PUSQL összetett adattipusok Iváncsy Renáta
80
7.PUSQL összetett adattipusok lváncsy Renáta
és STRING.
A tábla növelésére nem kell külön fiiggvényt használnunk, elég, ha nagyobb indexet
használunk. Az index-by táblák ritkák. így meg van az az előnye, hogy például használhatjuk
indexként a benne tárolt adatok elsődleges kulcsát is.
Ha egy táblában (akár nested akár index-by) rekordokat tárolunk, a rekordok egyes
mezőire a következöképpen tudunk hivatkozni:
tábla_név(index).mez6_név
81
7.PUSQL összetett adattipusok lváncsy Renáta
TRIM
használható az Index-by tábláknáL
Eltávolít egy elemet a kollekció végéről.
.,., .,
.,.,
TRIM(n)
DELETE
Eltávolít n elemet a kollekció végéröl
Minden elemet töröl a kollekcióból
., .,
DELETE{n)
Az n. elemet eltávolitja az index-by vagy
a nested táblából
., .,
DELETE(m,n)
Eltávolítja az m. elemtöl az n.-ig az
elemeket
., .,
82
8.PUSQL kurwrok lváncsy Renáta
8. PL/SQL kurzorok
A szerver oldali programozAst biztosító nyelvekben a kurzorok szolgálnak a több sort
visszaadó lekérdezések eredményének tárolására. A PUSQL-ben kétfajta lrurzor létezik., az
implicit és az explicit. Minden SQL adatmanipulációs utasítás számára a PUSQL implicit
létrehoz egy lrurzort, beleértve azokat a lekérdezéseket is, amiknek csak egy sor az
eredménye. Az olyan lekérdezéseknek, amiknek az eredménye több mint egy sor, a
programozónak kell explicit definiálnia kurzort.
8.l.Explicit kurzorok
Egy lekérdezés eredménye lehet nulla, egy, vagy több sor, attól filggöen, hogy mennyi sor
egyezett meg a felhasználó által megadott feltételnek. Ha a lekérdezés több sort ad vissza,
explicit hozzárendelhetünk egy kurzort. Kurzort bármely PUSQL blokk, alprogram és
csomag deklarációs részében deklarálhatunk.
83
8.PUSQL lrurzorok Iváncsy Renáta
(CLOSE).
A lrurzort az OPEN utasítással kell megnyitni.
OPEN kurzor_név[(<paraméterek>)];
Paramétereket a lrurzor megnyitásakor adhatunk át. Minden definiált paraméternek
értéket kell adni az OPEN utasításkor, ha nem akarjuk elfogadni a DEFAULT értéket: A
következő példában egy lrurzort deklarál unk, aminek két bemenő paramétere van:
DECLARE
student student.stud id%TYPE DEFAULT 'FBSDFH';
year DATE DEFAULT '02-mar-2003'
CURSOR cl (diak VARCHAR2, év DATUM) IS SELECT ...
A következő utasítások bánnelyike megnyitja a lrurzort:
OPEN cl(student, '12-jun-2001');
OPEN cl('DR45TF', year);
OPEN cl(student, year);
A lrurzorból egy sort a FETCH utasítássallehet megkapni. Minden FETCH utasítás után a
kurzor a következő sorra lép.
FETCH kurzor név
[BULK COLLECT)
INTO {változó_név[, változó_név) ... l rekord_név};
Az INTO után álló listában szereplő változók típusának, vagy a rekord mezőinek a
típusának meg kell felelnie a lrurzorban szereplő oszlopok típusávaL A FETCH utasítást
általában ciklusban szokás használni, hogy az összes sort megkapjuk az eredménytáblából. Az
alábbi táblában a ciklusból akkor lépünk ki, ha az utolsó sort is lekérdeztü.k a lrurzorból. Ezt a
%NOTFOUND lrurzor attribútummal tudjuk megtenni. Erről a későbbiekben még részletesen
lesz szó.
DECLARE
CURSOR cl IS SELECT anyag_nev FROM anyag ORDER BY anyag_id;
nev anyag.anyag_nev%TYPE;
BEGIN
OPEN cl;
84
8.PUSQL lrurzorok Iváncsy Renáta
LOOP
FETCH cl INTO nev;
EXIT WHEN cl%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(nev);
END LOOP;
CLOSE cl;
END;
A kunort a CLOSE utasítássallehet bezárni.
CLOSE kurzor_név;
Az explicit kunorok legelterjedtebb használati módja a cikluson belüli FE TCH utasítás. A
cikluson kívül megnyitjuk a kunort, majd a ciklusban addig olvassuk ki az egyes sorokat,
amíg a kunor üressé nem válik. Ekkor kilépünk a ciklusból és bezáJjuk a kunort.
Lehetőség van az eredményhalmaz egy lépésben való kinyerésére is. Ekkor nem kell
ciklust használni, hogy soronként megkapjuk az értéket, viszont definiálni kell egy kollekciót,
amiben az eredményt eltárolhatjuk. Ezt a lehetőséget a BULK COLLECT k:ulcsszó
használatával tudjuk elérni. (Az ORACLE9i-ben BULK COLLECT használata még nem
müködik rekordokra, tehát a kollekció elemei nem lehetnek rekordok.)
DECLARE
CURSOR cl IS SELECT anyag_nev, anyag id FROM anyag;
TYPE nevtype IS TABLE OF anyag.anyag_nev%TYPE;
TYPE idtype IS TABLE OF anyag.anyag_id%TYPE;
nevtomb nevtype;
idtomb idtype;
BEGIN
OPEN cl;
FETCH cl BULK COLLECT INTO nevtomb, idtomb;
CLOSE cl;
END;
A kunorokban használhatunk allekérdezésekel (subquery) is. Az allekérdezés egy olyan
lekérdezés, ami egy másik adatmanipulációs SQL utasításban jelenik meg. Allekérdezésekel
általában a WHERE után vagy a FROM után szoktak használni.
85
8.PIJSQL lrurzorok I váncsy Renáta
8.2.Implicit kurzorok
Az Oracle implicit nyit lrurzort minden olyan SQL utasítás végrehajtásához, amihez nem
rendeltünk explicit kurzort. Implicit Imrzorokra nem használhatjuk az OPEN, FETCH, és
CLOSE utasftásokat. de Imrzor attribútumok segitségével információt nyerhetünk az
legutoljára futtatott SQL utasításróL A Imrzor attribútumokról késöbb lesz szó részletesen.
A kurzor-FOR ciklusban nem használhatunk olyan kurzort, ami épp nyitva van.
Minden iterációs lépésben az eredményhalmaz egy sora bekerül az implicit deklarált
rekordba. A rekord mezöire a rekord név.mezó név szintaktikával utalhatunk. A
- -
rekord csak addig létezik, amíg a FOR cikluson belül vagyunk. Ha kilépünk onnan, a rekordra
már nem hivatkozhatunk. Ha vége a ciklusnak, a Imrzor automatikusan bezárásra kerül. A
Imrzor akkor is bezáródik., ha EXIT, GOTO vagy hibamiatt hagyjuk el a FOR ciklust.
86
8.PUSQL kunorok Iváncsy Renáta
A lrurzor-FOR ciklus egy másik változata, amikor egyáltalán nem hozunk létre explicit
lrurzort, helyette a kurzor lekérdezését a lrurzor-FOR ciklusban fogalmazzuk meg. Ennek
szintaktikája a következő :
FOR ciklusváltozó rekord IN (lekérdezés) LOOP
<ciklusváltozó__ rekord.mezőnév használata, egyéb utasitások >
END LOOP;
8.3.Kurzorváltozók
A kurzorváltozó, hasonlóan a lrurzorboz, egy több sort eredményező lekérdezés eredmény
halmazának egy sorára mutat. A lrurzorok annyiban különböznek a kurzorváltozóktól, mint a
konstansok a változóktót Míg a lrurzor statikus, a lrurzorváltozó dinamikus, mert nincs egy
konkrét lekérdezéshez kötve. Egy lrurzorváltozót bármely azonos típusú lekérdezésre
megnyithatunk. A lrurzorváltozónak új értéket adhatunk, és átadhatjuk paraméterként lokális
és tárolt fiiggvényeknek, eljárásoknak.
A lrurzorváltozó olyan, mint a mutató egy C vagy Pascal programban. azaz nem magát az
elemet tárolja, hanem csak az elem eimét, ahol az megtalálható. A PUSQL-ben a mutatóknak
REF x típusuk van, ahol a REF a REFERENCE (mutató) rövidítése és x egy objektum
osztályát jelöli. Tehát a kurzorváltozónak a típusa REF CURS OR.
Az Oracle megnyit egy munkaterületet, hogy lefuttasson egy több sort visszaadó
lekérdezést. Hogy elérjük az információt, vagy explicit lrurzort használunk, ami elnevezi ezt a
területet, vagy a lrurzorváltozót, ami a munkaterületre mutat. Amíg a kurzor mindíg ugyanarra
a munkaterületre hivatkozik, addig a lrurzorváltozó különböző munkaterületekre is mutathat.
Kurzorváltozókat föként akkor használunk, amikor eredmény halmazokat szerelnénk
átadni PUSQL tárolt alprogramok és kliensek között.
Kurzorváltozót két lépésben tudunk létrehozni. Először definiálni kell egy REF CURSOR
típust, utána deklarálni egy ilyen típusú lrurzorváltozót. Egy REF CURSOR típust az alábbi
szintaktikával tudunk definiálni bármely blokkban, alprogramban vagy csomagban:
TYPE ref_tipus_név IS REF CURSOR [RETURN visszatérési_tipus];
A lrurzor visszatérési típusa azt határozza meg, hogy milyen rekorddal tér vissza az adon
kurzor. A lrurzorra csak akkor használhatjuk a %ROWTYPE operátort, ha megadtuk a
visszatérési típusát.
87
8.PUSQL lrurzorok Iváncsy Renáta
88
8.PUSQL kunorok lváncsy Renáta
8.4.Kurzor attribútumok
Minden explicit k:urzornak és k:urzorváltozónak négy attribútuma van: %ISOPEN,
%NOTFOUND, %FOUND és %ROWCOUNT. A kurzor attribútumokat nem hasmálhatjuk az SQL
utasításokban, csak a procedurális utasításokban.
%FOUND:
LOOP
FETCH cl INTO nev, ev;
IF cl%FOUND THEN -- a FETCH sikeres volt
89
8.PUSQL kurzorok lváncsy Renáta
END LOOP
90
8.PUSQL lrurzorok lváncsy Renáta
END IF;
Fontos! Amennyiben egy lekérdezés egyetlen sorral sem tér vissza, a rendszer a
NO_DATA_FOUND kivételt generálja. Ebben az esetben az SQL%NOTFOUND
attribútumot már csak az EXCEPTION részben lehet használni. A következő példa ezek
alapján hibás, illetve a feltétel felesleges, mert a feltétel belsejébe sosem fog kerülni a
vezérlés!
SELECT utas id INTO myid FROM utas WHERE utas nev 'Kovacs';
IF SQL%NOTFOUND THEN
--ide sosem fog kerülni a vezérlés!!!
END IF;
8.5.Kurzor kifejezések
Egy k:urzor kifejezés beágyazott k:urzorral is visszatérhet. Ez annyit jelent, hogy az
eredményhalmaz m.indegy egyes sora tartalmazhat értékeket, valamint olyan k:urzorokat, amik
allekérdezések eredményeképpen jönnek létre. Dyen módon lehetőség van egy lekérdezésben
összefüggö adatok halmazát megkapni. Az eredményhalmazt egymásba ágyazott ciklusokkal
lehet feldolgozni úgy, hogy a külsö ciklus végigmegy a külsö lekérdezés eredményének
sorain, míg a belső ciklusok a lekérdezésben szereplö k:urzorok által visszaadott értékeken
halad végig.
Kurzor kifejezés használható k:urzor deklarációban, REF CURSOR deklarációban és ref
cursor értékeként egyaránt, szintaktikája a következő:
CURSOR (allekérdezés)
A beágyazott kurzor implicit megnyitásra kerül, amikor a sor feldolgozásra kerül, és a
következő esetekben záródik be:
• A felhasználó explicit bezáJja
• A szülö k:urzor újra lefut
91
8.PUSQL lrurzorok lváncsy Renáta
a listázása. A k:ülső kurzor lekérdezi a félkész termékek nevét ABC sorrendben, a belső
l 1 anyagadat.menny l l 1 1
l l anyagadat.egyseg);
END LOOP;
END LOOP;
CLOSE cl;
END;
92
9.PUSQL alprogramok lváncsy Renáta
9. PUSQL alprogramok
Az alprogramok olyan PUSQL blokk.ok, amik paramétereket tudnak fogadni. A PUSQL-
nek kéttípusú alprogramja van, a filggvények (functions) és az eljárások (procedures).
Általában az eljárások müveletek elvégzésére szolgálnak, a filggvények értékek kiszámítására.
Hasonlóan az anonim blokk.okhoz, az alblokk.ok is három részböl állnak, a deklarációs
részböl, a futtatható részből és a kivételkezelő részböL A deklarációs rész konstansok,
változók, kurzorok, kivételek és beágyazott filggvények deklarációját tartalmazza. Ezek az
elemek lokálisak, és megszünnek, ha kilépünk az alprogrambóL A futtatható rész különbözö
utasításokat, értékadásokat, programvezérlő utasításokat és adatmanipulációs utasításokat
tartalmaz. A kivételkezelő rész a kivételkezelést oldja meg.
Az alprogramok előnye, hogy általuk a feladatot több, kisebb komplexitású feladattá
bonthatjuk, egy-egy különálló feladatra készíthetünk külön eljárásokat és filggvényeket,
amiket aztán a program több helyéről különböző paraméterekkel meghívhatunk.
93
9.PUSQL alprogramok lváncsy Renáta
9.2.PUSQL függvények
A PUSQL filggvény olyan alprogram, ami valamilyen értéket számol ki. A filggvények
és az eljárások szerkezetükben hasonlítanak egymásra, azzal a kivétellel, hogy a
filggvényeknek van visszatérési értékük, valamint a függvényben csak SELECT SQL utasítás
adható ki, adabnódosító nem. A visszatérési értéket a RETURN kulcsszóval lehet megadni.
Egy függvény szintaktikája a következöképpen néz ki:
[CREATE [OR REPLACE]]
FUNCTION függvény_név((paraméter[, paraméter) ... ))
RETURN adattipus} IS
[PRAGMA AUTONOMOUS _ TRANSACTION;]
[<lokális_deklarációk;>)
BEGIN
<futtathat6_ utasitások;>
RETURN visszatérési_érték;
[EXCEPTION
<híbakezelés;>J
END [függvény_név);
94
9.PUSQL alprogramok Iváncsy Renáta
95
9.PUSQL alprogramok lváncsy Renáta
l IF vanhely('VIAU9159','20031') THEN-
9.3.Aiprogramok deklarálása
AJprogramot bármilyen blokk, alprogram vagy csomag deklarációs részében
deklarálhatunk. Ügyelni kell arra, hogy alprogram deklarálása a deklarációs rész végén
történjen, minden más elem deklarálása után. A deklarációnak mindig meg kell előznie a
hivást. Ezért ha egy alprogram törzsében egy másik alprogramot hívunk meg, akkor azt az
alpragramot kell hamarabb deklarálni, amit a másik alprogram használ. Ez nem mindig
járható út. hiszen előfordulhat. hogy két eljárás egymást hívja. Ekkor azt kell tenni, hogy az
egyik eljárást elöre deklarálni kell. Ennek az a módja, hogy csak a ftlggvény vagy eljárás
specifikációját adjuk meg használat előtt, pontosvesszövei lezárva, és csak késöbb magát a
program törzset. Alprogramokat összegyüjthetünk egy csomagba is, ami az adatbázisban van
eltárolva. Az alprogramok specifikációja a csomag specifikációs részébe kerül, az alprogram
törzse pedig a csomag törzsébe. Oyen megoldással az alprogramokat megosztha~a egymás
között több program is. Lehetőség van arra is, hogy egy csomagban úgy deklaráljuk
alprogramot, hogy annak specifikációját nem adjuk meg a csomag specifikációjában. Az ilyen
alprogramokat azonban csak a csomagon belül használha~uk. A csomagokról részletesebb
leírást egy későbbi fejezet tartalmaz.
96
9.PUSQL alprogramok lváncsy Renáta
első aktuális paraméter az első formális paraméterhez lesz rendelve, a második aktuális
paraméter a második formálishoz és így tovább.
A név szerinti paraméter átadás azt jelenti, hogy az aktuális paraméterek sorrendjének
nem kell megegyezni a formális paraméterek sorrendjével, de a=> operátor segítségével meg
kell adni, hogy az adott formális paraméterhez melyik aktuális paraméter tartozik. Ennek az
az előnye, hogy nem kell tudni a paraméterek sorrendjét, viszont tudni kell, hogy a
filggvényben milyen formális névvel szerepeltek.
DECLARE
targy CHAR (8) : = 'VIAU9159';
Szemeszter CHAR(5) DEFAULT '20031';
FUNCTION vanhley (targyid CHAR, ev CHAR) RETURN BOOLEAN IS
BEGIN
IF vanhely (targy, szemeszter) THEN ... END IF;
-- pozíció szerinti paraméterezés
IF vanhely(targyid=>targy, ev=>szemeszter) THEN _ END IF;
-- név szerintin paraméterezés
IF vanhely(ev=>szemeszter, targyid=>targy) THEN_ END IF;
-- név szerintin paraméterezés
IF vanhely(targy,ev=>szemeszter) THEN _ END IF;
-- kevert paraméterezés
IF vanhely(targyid=>targy,szemeszter) THEN _ END IF; --HIBA
END;
A kétfajta paraméter átadási módszert keverni is lehet, de olyan megkOtéssel, hogy a
pozíció alapján történő hozzárendelésnek meg kell előznie a név alapján történőt Tehát a
következő kevert hozzárendelés nem müködik:
l vanhely(targyid=>targy,szemeszter); --HIBÁS!!!!
Paraméter átadáskor nem csak konstansokat vagy változókat használhatunk, hanem
lehetőség van kifejezések megadására is:
9.S.Paraméter módok
A paraméter módokat arra használjuk, hogy meghatározzuk a paraméterek viselkedését.
Három paraméter mód létezik: a bemenő (IN), a kimenő (OUT) és a kétirányú (IN OUT). Ha
nem adunk meg módot, az alapértelmezett mód az IN. Ajánlatos a filggvényeknél elkerülni a
kimenő és a kétirányú paraméter használatát, a függvénynek úgyis van visszatérési értéke.
97
9.PUSQL alprogramok Iváncsy Renáta
9.5.1. Az IN mód
A bemenő paraméterek az alprogramon belill úgy visel.kednek, mint a konstansok. Nem
kaphatnak értéket, de szerepelhetnek kifejezésben. Az aktuális paraméter, ami az adott IN
formális paraméterre utal, lehet konstans, !iterál, inicializált változó vagy kifejezés. A bemenő
paraméternek meg lehet adni alapértelmezett értéket is.
98
9.PUSQL alprogramok Iváncsy Renáta
9.6.Aiprogram túlterhelés
PUSQL-ben lehetőség van az alprogramok túlterhelésére. Ez azt jelenti, hogy ugyanazzal
a névvel létre lehet hozni különböző alprogramokat, azzal a feltétellel, hogy a formális
paramétereik különböző számúak, sorrendűek vagy típusúak legyenek. A túlterhelt
alprogramokat lehet használni azonos blokkon, alprogramon vagy csomagon belül. A PUSQL
a formális paraméterei alapján dönti el, hogy épp melyik lett meghívva.
99
IO.PUSQL hibák kezelése Iváncsy Renáta
egy kivétel generálódik. Ez azt jelenti, hogy a normál futás megáll, és a programvezérlés az
alprogram vagy a blokk kivételkezelő részére kerül. A belső kivételek automatikusan
generálódnak egy hiba keletkezésekor, mig a felhasmáló által definiált kivételeket generálni
(RAISE) kell a megfelelő helyen. Egyébként lehetőség van a belső hibák generálására is. A
hibák kezelésére külön rutinokat kell irni, melynek neve kivételkezelök (exception handlers).
Ha egy kivételkezelő eljárás lefutott, a vezérlés a blokkol tartalmazó blokk (befoglaló blokk)
következő utasítására tér át. Ha nincs befoglaló blokk, akkor a futtató környezet kapja meg a
vezérlést.
A kivételeknek három tipusa van:
• rendszer által definiált hibák
o előre definiált (névvel ellátott) Oracle Server hibák (predefined Oracle Server
Errors)
o előre nem definiált (névvel nem ellátott) Oracle szerver hibák (non predefined
Oracle Server Errors)
• felhasználó által definiált hibák (user defined errors).
BEGIN
100
IO.PUSQL hibák kezelése Iváncsy Renáta
EXCEPTION
WHEN kivetel nevl THEN <utasitasol>;
WHEN kivetel nev2 THEN <utasitasok2>;
WHEN után található. Ezután a vezérlés nem kerül vissza oda, ahol a hiba keletkezett. hanem
kilép a blokkból és a blokkot tartalmazó blokkban folytatódik a program futása. Ha mégis azt
szeretnénk, hogy a hiba kezelése után ott folytatódjon a program, ahol abbahagytuk, tegyük
alblokkba a kívánt részt, saját hibakezelöveL Ha hiba keletkezik, a hibakezelő lefut a belső
!Ol
IO.PUSQL hibák kezelése lváncsy Renáta
102
IO.PUSQL hibák kezelése Iváncsy Renáta
103
l O.PUSQL hibák kezelése Iváncsy Renáta
104
IO.PUSQL hibák kezelése lváncsy Renáta
105
lO.PUSQL hibák kezelése lváncsy Renáta
EXCEPTION
WHEN holtpont volt THEN
-- a hiba kezelése
END;
106
IO.PUSQL hibák kezelése lváncsy Renáta
107
IO.PUSQL hibák kezelése Iváncsy Renáta
llliCiill
8ZG[J1
Il!' Y = l THilll
ll.A[:iZ A ;
lll..::it:l' 'JI = ~ THJU1
JILJJI : : : : :
· )
lllliO Il!' ;
BJ'CBFr [Cll
successful completion.
A két függvényt nem használhatjuk közvetlen SQL utasításban, hanem előtte értékül kell
adni öket egy változónak.
108
IO.PUSQL hibák kezelése Iváncsy Renáta
DECLARE
err num NUMBER;
err_msg VARCHAR2(100);
BEGIN
EXCEPTION
109
11 .PUSQL triggerek Iváncsy Renáta
110
II .PUSQL triggerek lváncsy Renáta
A CREATE TRIGGER utasítással bozhatunk létre új higgert egy táblára vagy nézetre. Az
OR REPLACE kulcsszó használatával egy már meglévő higgert irhatunk felül, igy
van azonban arra is, hogy az utasításokat egy külön tárolt eljárásba újuk meg, és itt csak
meghivjuk az adott eljárást.
szereplő utasítások alapján dől el, hogy a higgert kiváltó utasítás végrebajtódjon-e. Ha azt
szeretnénk, hogy mégse fusson le az adott utasítás, akkor a Iriggerben egy hibát kell generálni,
ilyenkor az utasítás visszagörgetödik. A másik eset BEFORE Irigger használatára, amikor
származtatott oszlop értékét szerelnénk kiszámolni még a beszúrás vagy a módosítás
végrehajtása előtt. BEFORE Irigger esetén a :new értéke irbató, de a :old értéke nem.
l
AFTER higgert akkor célszerü használni, amikor a végrebajtott utasítás alapján lehet
döntést hozni. AFTER Irigger esetén nem irbató sem a :new , sem a :old érték.
ll l
1l.PUSQL triggerc:k Iváncsy Renáta
11.1.4. ON tibianév
Az ON lrulcsszó után kell megadni a táblanevet, vagy nézetnevet, amin a korábban
megadott utasítás végrehajtása esetén a triggemek le kell futnia.
Az opcionális FOR EACH ROW lrulcsszóval adhatjuk meg azt, hogy az adott trigger
minden sorra lefusson-e, ami érintve van a triggert kiváltó utasítás által vagy csak egyszer.
Abban az esetben, ha csak egyszer fut le, utasítás triggemek hívjuk. ha minden sorra, akkor
sor triggemek.
Sor trigger esetén a trigger annyiszor lefut, ahány sort érint a triggert kiváltó utasítás.
Például ha egy módosítás 3 sort érint, sor trigger esetén az adott trigger háromszor fog Iefutni.
Ha a triggert kiváltó utasítás egyetlen sort sem érint, akkor a trigger egyszer sem fut le. Sor
trigger használata akkor hasznos, ha a triggerben szereplő utasítások függenek a triggert
kiváltó utasítás által érintett sor adataitól. Fontos megjegyezni, hogy a new és az old táblák
soraira csak sor trigger esetén hivatkozhatunk.
Utasítás trigger esetén a trigger pontosan egyszer fut le, függetlenül attól, hogy a triggert
kiváltó utasítás hány sort érintett a táblán belül. Ha egyetlen sort sem érint a triggert kiváltó
utasítás, a trigger egyszer akkor is lefut Utasítás triggert akkor érdemes használni, ha a
triggerben szereplő utasítások nem függenek az érintett soroktóL Dyen lehet például komplex
biztonsági ellenőrzés a felhasznáJón vagy az aktuális idön.
112
ll.PUSQL Iriggereit lváncsy Renáta
A WHEN kulcsszó után van lehetőségünk megadni egy feltételt, ami a trigger lefutására
vonatkozik. A feltétel kiértékelésének eredménye IGAZ, HAMIS vagy NULL lehet. A trigger
csak abban az esetben fut le, ha a feltétel eredménye IGAZ.
Az alábbi BEFORE trigger arra felügyel, hogy egy Irurzusra ne tudjon több diák
jelentkezni, mint amennyit a limitben megengednek. A triggeren belül nem megengedett a
tranzakció kezelő utasítások használata, így ha meg szeretnénk akadályozni, hogy egy utasítás
lefusson, azt hiba generálásával tudjuk megoldani.
CREATE OR REPLACE TRIGGER kurzus limit
BEFORE INSERT ON student course
FOR EACH ROW
DECLARE
mylimit INT;
db INT;
BEGIN
SELECT cou_limit INTO mylimit FROM course
WHERE cou id = :new.sc_courseid FOR UPDATE;
SELECT count(*) INTOdb FROM student_course
WHE~ sc courseid = :new.sc_courseid;
IF db = limit THEN
RAISE APPLICATION_ERROR(-201002,'Mar betelt');
END IF;
END;
113
11.PUSQL triggerelr. lváncsy Renáta
SEKVERERROR
Segitségével egy szerver hibára állíthatunk triggert. A következő hibákra nem fut le a
trigger:
• ORA-01403: Data not found
• ORA-01422: Exact fetch returns more than requested number ofrows
l
• ORA-01423: Error encountered white checking for extra rows in exact fetch
• ORA-01034: ORACLE not available
• ORA-04030: out of process memory
A triggeren belül a kiváltó hiba számára az IS_SERVERERROR(hiba_szám)
filggvénnyel kereshetünk rá, aminek az eredménye TRUE, ha a zárójelben megadott pozitív
szám egyezik a szerver hibaszámávaL Csak AFTER trigger használható a
SERVERERROR adatbázis eseményre.
CREATE OR REPLACE TRIGGER hiba trigger
AFTER SERVERERROR ON SCHEMA
BEGIN
IF IS_SERVERERROR(00001) THEN
END IF;
END;
LOGON
A trigger akkor fut le, ha egy kliens alkalmazás belépett az adatbázisba. Csak AFTER
t r igg e r használható rá.
LOGOFF
A trigger akkor fut le, ha egy kliensalkalmazás kilép az adatbázisbóL Csak BEFORE
trigger használható rá.
114
II.PUSQL triggerek lváncsy Renáta
STARTUP
A trigger akkor fut le, ha az adatbázis megnyitásra került. Csak AFTER trigger
használható rá. Csak adatbázisra állítható be.
SHUTDOWN
A trigger lefut, ha az adatbázis egy példánya leáll. Csak BEFORE trigger használható
rá. Csak adatbázisra állítható be.
SUSPEND
A trigger akkor fut le, ha egy szerver hiba egy tranzakciót felfilggeszt. Csak AFTER
t r i g ge r használható rá.
ALTER
A trigger akkor fut le, ha agy ALTER utasítással valamilyen adatbázis objektumot
megváltoztatunk. ALTER DAT ABASE utasítás esetén a trigger nem fut le.
CREATE
A trigger akkor fut le, ha CREATE utasítással valamilyen adatbázis objektumot
létrehozunk. A CREATE DATABASE és a CREATE CONTROLFILE utasítás esetén a
trigger nem fut le.
DROP
A trigger akkor fut le, ha a DROP utasítással valamilyen adatbázis objektumot letörlünk.
GRANT
A trigger lefut, ha a GRANT utasítással valamilyen rendszer szintű vagy objektum szintű
jogot vagy szerepet adunk valamely felhasználónak vagy szerepnek.
RENAME
A trigger lefut, ha a RENAME utasítással valamely adatbázis objektum nevét
megváltoztatj uk.
REVOKE
A trigger lefut, ha a REVOKE utasítással megvonunk valamilyen rendszer szintű,
felhasználói szintű jogot vagy szerepet valamely felhasználótól vagy szereptöl.
115
11 .PUSQL ttiggerek Iváncsy Renáta
116
12.Tranzakciók PUSQL-ben Iváncsy Renáta
igényelte a hozzáférést. Mindezt addig, amíg az be nem fejezte a müveletet. Sosem kell
explicit igényelni a zárolást, azt megteszi az Oracle automatikusan. Lehetőség van azonban
adat zárak explicit kérésére, hogy ha az jobb, mint az előredefiniált zárolás.
Holtpont (deadJock) akkor alakulhat ki, ha két vagy több felhasználó egymás erőforrásaira
vár. Például A zároljaa student táblát, és a teacher táblából szeretne olvasni, míg B
117
12.Tranzakciólr. PUSQL-ben Iváncsy Renáta
el, hogy vagy mindenki által láthatóvá, vagy meg nem történtté tegyük a változtatásokat.
Lehetőség van biztonsági pontokat (SAVEPOINT) tenni a tranzakcióba, ami elnevezi az adott
pontot a tranzakcióban.
A COMMlT utasftás
voltak, m.ielött a változtatásokat megtettük volna. A COMMIT hatására az összes tábla és sor
zár felszabadul.
Szintén véglegesítésre kerülnek az adatok (implicit COMMIT) ba egy DDL utasítást
hajtunk végre (CREATE, DROP, RENAME, ALTER), vagy ha a felhasználó szabályosan
bezálja az adatbázis kapcsolatot.
BEGIN
END;
118
12.Tranzakciólr. PUSQL-ben lváncsy Renáta
A ROLLBACK utasítás
A SAVEPOINT
SAVEPOINT do insert;
INSERT INTO emp VALUES (emp_id, ... );
EXCEPTION
WHEN DUP VAL ON INDEX THEN
ROLLBACK TO do insert;
END;
Ha visszafejtjük az utasításokat egy biztonsági pontig, akkor az utána levő biztonsági
pontok megszünnek. Egy egyszerű ROLLBACK vagy egy COMMIT az összes biztonsági
pontot megszünteti.
Ha egy rekurzív függvényben használunk biztonsági pontot, minden egyes szinten
létrejön egy, de csak a legutolsóig lehet a visszafejtést megtenni. A biztonsági pontok nevei
nem deklaráltak és újra felhasználhatóak egy tranzakción belül. Ezzel a régi biztonsági pontot
az új helyére mozgatjuk.
Egy tranzakción belül korlátlan számú biztonsági pontot tehetünk.
119
12.Tranzakciók PUSQL-ben Iváncsy Renáta
Minden SQL utasítás előtt az Oracle egy implicit biztonsági pontot (SAVEPOINT) tesz le.
Így, hogy ha egy utasítás valamilyen okból nem tud végrehajtódni (például egy egyedi
indexbe két azonos értéket akarunk beszúrni), akkor a hibás utasítást visszafejti az utasítás
elötti állapotokig. Így nem vész el semmilyen módosítás, csak az, ami a hibás utasításban volt.
A másik ok SQL utasítások visszafejtésére a holtpontok elkerülése. Holtpont kialalrulását az
adatbázis-kezelő automatikusan detektálja, és az egyik tranzakció utolsó utasítását utasítás
szinten visszafejti. Így a tranzakció többi utasítása nem fejtődik vissza, csak az, ami a holtpont
kialalrulásában közvetlen szerepet játszott.
PUSQL nem fejti vissza az adatbázist, ha egy alprogram kezeletlen kivétellel tér vissza.
A legjobb megoldás, ha kezeljük a tranzakciókat Ha ezt nem tesszük meg, a futtató
környezet dönti el, hogy mi történjen. Például az SQL •PLUS környezetben, ha egy PUSQL
blokk nem tartalmazza a COMMIT vagy a ROLLBACK utasítást, a tranzakció állapota attól fog
filggeni, hogy a blokk futtatása után mit csinálunk. Ha adat definiáló, adat vezérlő vagy
COMMIT utasítást adunk ki, vagy EXIT, DISCONNECT vagy QUIT parancsot adunk ki, az
Oracle láthatóvá teszi a módosításokat (commit). Ha ROLLBACK utasítást hajtunk végre, vagy
megszakítjuk az SQL•PLUS kapcsolatot, az Oracle visszafejti a tranzakciót.
!20
12.Tranzalr.ciók PUSQL-ben lváncsy Renáta
• Nem ismételhető olvasás: egy tranzakció egy sort többször egymás után kiolvas,
miközben egy másik tranzakció azt az adatot megváltoztatja, ennek hatására a
többszöri olvasás más-más eredményt ad. Annyiban k:ülönbözi.k ez a probléma a
piszkos olvasástól, hogy ebben az esetben az adatot módosftó tranzakció a módosítását
kommitálta. A probléma megoldható, ha a második tranzakció nem olvashatná addig
az adatot, amíg az első be nem fejezte az adott adat írását.
• Faotom olvasás: akkor fordul elö, ha az egyik tranzakció kitöröl vagy beszúr sorokat
egy adathalmazba, míg egy másik tranzakció az adathalmazt olvasta. Ebben az esetben
a második tranzakció olyan adatokat "lát", amik esetleg már nem is léteznek, mert a
másik tranzakció kitörölte, vagy olyan adatot nem "lát", ami már létezik, mert a másik
tranzakció létrehozta. A probléma megoldható, ha a második tranzakció megválja, míg
az első tranzakció befejezi a munkát, és az olvasást is csak akkor kezdi el.
Az SQL92 szabvány négy izolációs szintet definiál a k:ülönböző konkurencia problémák
megoldására, ezek a következők :
tranzakció egy későbbi lekérdezéskor láthat is. Mivel a konkurencia szint ebben az esetben
alacsonyabb, mint az alapértelmezett esetben, csak akkor érdemes használni, amikor feltétlen
szükséges.
SERIALIZABLE: Az adathalmazra zárat tesz, ezáltal megakadályozva, hogy más
tranzakció módosítson, vagy sort szWjon be az adathalmazba, míg a zárral rendelkező
121
12.Tranzakciók PUSQL-ben lváncsy Renáta
Az alábbi táblázat összefoglalja, hogy melyik izolációs szinttel milyen probléma fordulhat
elö, és m.i az, ami ellen védelmet nyújt. Az adott sorban és oszlopban akkor szerepel IGEN, ha
az adott probléma (oszlop) előfordulhat az adottszint esetén (sor):
Izolációs szint Piszkos olvuás Nem ismételbetli olvasás Fantom
Read uncommitted Igen Igen Igen
Read committed Nem Igen Igen
Repeatable read Nem Nem Igen
Serializab le Nem Nem Nem
Az Oracle a fent definiált négy tzoláctós szmt közül kettőt valósit meg, a Read coDlDlJtted
és a Serializable izolációs szinteken. Ezen kivül definiált egy nem szabványos izolációs
szintet is, a Read Only izolációs szintet.
A tranzakciós szintet az alábbi utasítással állíthatjuk be egy tranza.kcióra:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
Dletvea
SET TRANSACTION READ ONLY
utasítással állítható be, hogy egy tranzakció csak olvasó tranzakció legyen.
Ha egy folyamatban minden tranzakciónak egyszerre szeretnénk állítani az izolációs
szintjét, azt is megtehetjük kapcsolat szinten a következő utasítással:
ALTER SESSION SET ISOLATION_LEVEL {READ COMMITTED
SERil\LIZABLE}
Az Oracle rendszerben az alapbeállítási szint a Read committed izolációs szint. Ekkor egy
tranzakció minden lekérdezése olyan adatot lát, amit a lekérdezés előtt (és nem a tranzakció
megkezdése előtt) véglegesítettek. Dyen módon elmondható, hogy Oracle-ben egy lekérdezés
sosem tud piszkos adatot olvasni. A Read comm.itted izolációs szintet olyankor érdemes
használni, ha kevés tranzakció ütközik egymással.
A Read comm.itted izolációs szint sor szintű zárolásokat használ, és a tranzakció
várakozik, ba egy olyan adatot szeretne módosítani, amit egy másik, még nem véglegesített
módosított. Amennyiben a másik tranzakció véglegesítésre került, az eredeti tranzakció is
végrehajtja a módositást.
Az Oracle által támogatott másik szabványos izolációs szint a Serializable. Ekkor egy
tranzakció lekérdezése csak olyan adatokat láthat, amik a tranzakció kezdete előtt
véglegesitve lettek, valamint természetesen látja a saját maga által végrehajtott INSERT,
122
12.Tranzakciók PUSQL-ben Iváncsy Renáta
A Read only izolációs szint esetén egy tranzakció csak azokat az adatokat látja, amik a
tranzakció megkezdése előtt véglegesítve lettek, nem enged meg azonban INSERT, UPDATE
vagy DELETE utasítások futtatását.
A csak olvasható tranzakciók akkor hasznosak, ba többszörös lekérdezést akarunk futtatni
egy vagy több táblán, míg más felhasznáJók módosítják ugyanazt a táblát. A csak olvasható
tranzakció alatt az összes lekérdezés ugyanarra a pillanatképre hivatkozik (snapshot),
biztositva ezáltal a read consistent nézetet. Más felhasználók ugyanúgy lekérdezhetik és
módosíthatják az adatot, mint máskor. A COMM IT vagy a ROLLBACK befejezik a tranzakciót.
A SET TRANSACTION utasításnak kell lennie az első utasításnak a csak olvasható
ROLLBACK.
123
12.Tranzakciók PUSQL-ben lváncsy Renáta
Zárolások
124
12.Tranzakciók PUSQL-ben lváncsy Renáta
más felhasználők által, akkor ne várakozzon rá, hanem térjen vissza, így más müveleteket el
lehet végezni, mielőtt újra megpróbálnánk a zárolást. Egy lrurzor megnyitásakor minden sor
zárolva lesz, nem csak az, amelyiket éppen kiolvastuk (FETCH). COMM! T vagy ROLLBACK
után a sorokellesznek engedve, így nem lehet egy FOR UPDATE lrurzorra a FETCH utasítást
kiadni COMM! T után.
Az alábbi példában az eljárás segítségével lehet egy lrurzusra jelentkezni. A jelentkezést
jelentő sor beszúrása előtt azonban össze kell számolni, hogy van-e még hely az adott
lrurzuson. Ha a CO URS E tábla co u _l im i t mezőjénél kevesebben vették eddig fel a tárgyat,
akkor az új felvétel érvényes lesz, be lehet szúrni az új sort a STUDENT _ COURSE táblába.
Annak érdekében, hogy amig az egyik felhasználó tárolt eljárása összeszámolja a
jelentkezetteket, mások ne tudjanak felvenni az adott lrurzusra új hallgatót, a COURSE tábla
adott lrurzusra vonatkozó sorát zároljuk a FOR UPDATE utasítással. Feltételezve, hogy
mindenki a tárolt eljárás segítségével próbál jelentkezni egy tárgyra, biztositva van, hogy
amig valaki elkezdte a tranzakciót, más nem fog jelentkezni az adott kurzusra, hiszen a lrurzus
táblából csak akkor tudja más meghatározni a limit értékét, ha a tranzakció elengedte az adott
sort.
!25
12.Tranzakciók PUSQL-bcn Iváncsy Renáta
126
12.Tranzakciók PUSQL-beo Iváncsy Renáta
zárolási módban, hogy ezáltal megosszuk, vagy megtagadjuk a tábla használatát A row
share mód megengedi a konkurens hozzáférést a táblához és megakadályozza, hogy más
felhasznáJók ex c l us i ve módra zárolják a táblát. Egyszerre több felhasználó is használhatja
a row share módot egy táblán, de csak egy felhasználó adhat ki exclusive zárat egy
táblára. Az exclusive zár segítségével megtilthatjuk a többi felhasználónak, hogy
beszúrjanak. töröljenek, vagy módosítsanak a táblában.
127
13.PUSQL csomagok (packages) )váncsy Renáta
128
13.PUSQL csomagok (packages) lváncsy Renáta
129
13 .PUSQL csomagok (packages) Iváncsy Renáta
13.1. A specifikáció
A csomag specifikációja nyilvános (public) deklarációkat tartalmaz. Ezeknek a
deklarációknak a láthatósága lokális az adatbázis séma számára, de globális az egész
csomagra nézve. A deklarált elemek elérhetőek a programjainkból és az egész csomagból.
A specifikáció felsorolja azokat az elemeket, amiket a programok használhatnak. A
programnak elég tudnia azokat a dolgokat, amik a specifikációban meg vannak adva. Például
ha adva van egy fiiggvény, annak elég tudni, hogy mi a bemenő paramétere és mivel tér
vissza. Az, hogy a filggvény konkrétan hogyan van megvalósítva, az a programot nem érdekli.
A törzs csak akkor szükséges, ha kurzorokat vagy alprogramokat tartalmaz egy csomag. Ezek
nélkül elég csak a specifikáció. Így olyan globális változókat tudunk definiálni, amik az egész
kapcsolat alatt létemek.
A csomag tartalmára a következő formában lehet hivatkomi:
csomagnev.elemnev
A csomag tartalmára hivatkozhatunk adatbázis triggerekből, tárolt eljárásokból, 3GL
programokból és néhány Oracle kliensbőL Megkötés, hogy távoli csomagra nem lehet
hivatkozni, illetve csomagon belül nem hivatkozhatunk környezeti változókra (host variable).
130
13.PUSQL csomagok (packages) lváncsy Renáta
olyankor szokták alkalmazni, amikor sok felhasználó jogosultságait akaijuk kezelni, de nem
akarunk minden egyes felhasználónak külön adatbázis felhasználót és sémát létrehozni.
llyenkor egy felhasználót hozunk létre mindenkinek, és egy saját lábiában tároljuk el a
felhasználói neveket és jelszavakat. A csomag ehhez tartalmaz eljárásokat és filggvényeket.
create table jelszavak
-- csomag specifikaeia
create or replace package userlogin is
procedure login (id int, passwd varchar2);
function is logged_in(dobhibat boolean) return boolean;
end userlogin;
-- csomag torzs
create or replace package body userlogin is
loggedin boolean;
131
13.PUSQL csomagok (pack.ages) lváncsy Renáta
end;
132
13.PUSQL csomagok (packages) Jváncsy Renáta
133
13.PUSQL csomagok (paclr.ages) Iváncsy Renáta
A nyilvános pipe
A nyilvános pipe implicit vagy explicit létrehozható. Az implicit létrehozás azt jelenti,
hogy automatikusan létrejön, ha hivalkozunk rá, és megszüník, ha nem tartalmaz adatokat. Az
explicit pipe a CREATE_PIPE filggvénnyel hozható létre.
CREATE_ PIPE(
Pipename VARCHAR2,
Maxpipes i ze INT DEFAULT 8192,
Private BOOLEAN DEFAULT TRUE) RETURN INT;
A pipename paraméter lesz a pipe neve. Ennek segítségévellehet hivatkozni a pipe-ra,
ennek segítségével lehet üzenetet küldeni és fogadni. A névnek egyedinek kell lennie az
Oracle példányon belül. A maxpipesize határozza meg az üzenet maximális méretét. A
p r i v a t e paraméter azt határozza meg, hogy nyilvános pi pe lesz-e (ba értéke FALSE) vagy
nem nyilvános (ez az alapértelmezett). A visszatérési érték O, ha a sikeres a pipe létrehozása,
vagy már létezik. és a felhasználó használhatja. Egyébként az ORA-23322 hiba generálódik.
Az explicit létrehozott pipe-t megszűntetni a REMOVE_PIPE fiiggvénnyellehet:
REMOVE_PIPE(pipename VARCHAR2) RETURN INT;
A pipe akkor is megszűnik, ha a példányt lekapcsolják.
Minden nyilvános pipe aszinkron módon müködik. Azok írhatnak egy pipe-ba, akiknek
futtatási joguk van a DBMS_PIPE csomagra, és ismerik a pi pe nevét. Amennyiben egy adatot
kiolvastak a pipe-ból, akkor az eltünik onnan.
A küldö a PACK_MESSAGE eljárással a lokális üzenet butferébe teszi az adatokat. Ezt
egymás után többször is meghívhatja, az üzenetek a lokális butferben gyűlnek. Elküldeni a
pipe-ba a SEND_MESSAGE filggvénnyel lehet. A PACK_MESSAGE háromszorosan
túlterhelt eljárás, bemenete lehet VARCHAR2, NUMBER és DA TE tipusú. Az üzenetre
plussz 4 byte overbead kerül, l byte a típus jelzésére, 2 byte a hossz jelzésére és l byte az
üzenet vége jelzésére. A SEND _ MESSAGE filggvény szintaktikája:
SEND MESSAGE(
Pipename VARCHAR2,
Timeout INT DEFAULT MAXWAIT,
Maxpipesize INT DEFAULT 8192) RETURN INT;
A pipename paraméter a pipe neve, a timeout másodpercben értelmezve azt adja meg,
hogy sikertelen üzenetküldéskor mennyit váJj on. Az alapértelmezett érték l OOO másodperc. A
filggvény visszatérési értéke O, ha siker volt, l, ha timeout volt, vagy nem tudott zárat rakni,
és ORA-23322 máskor.
Üzenetet megkapni a RECEIVE_MESSAGE filggvénnyel lehet. Az üzenetet a lokális
bufferbe teszi, és eltávolítja azt a pipe-ból. Ha a pipe nem létezett, az Oracle implicit
létrehozza, és egy üzenetre vár.
134
13.PUSQL csomagok (packages) Iváncsy Renáta
RECEIVE_MESSAGE(
Pipename VARCHAR2,
Timeout INT DEFAULT MAXWAIT) RETURN INT;
A lokális butferből az UNPACK_MESSAGE eljárással lehet kivenni az üzenetet Ez
szintén háromszorosan túlterbelt eljárás, kimenő paramétereinek tipusa lehet VARCHAR2,
NUMBER vagy DATE.
Nem nyilvános pipe
A nem nyilvános pipe-t a CREATE_PIPE függvénnyellehet létrehozni. A hozzáféréséhez
az alábbi korlátozások vannak:
• Azok a folyamatok férbetnek hozzá, amik azonos felhasználói név alatt futnak,
mint a pipe létrehozója.
• Azok a tárolt alprogramok férhetnek hozzá, amik olyan felhasználói jogok
tartományában futnak, mint a pipe létrehozója.
• A SYSDBA felhasználők használhatják.
Amennyiben mások próbálnak hozzáférni a nem nyilvános pipe-hoz, hiba generálódik.
135
\3 .PUSQL csomagok (packages) lváncsy Renáta
Mivel az UPDATE és az INSERT utasíts előtt a LOB oszlop értéke nem lehet NULL, így
már a tábla létrehozásakor használjuk az inicializáló filggvényt, ami egy üres LOB lokátort
tesz be az adott oszlopba. A három használható filggvény az EMPTY _ BLOB (), az
EMPTY CLOB és az EMPTY NCLOB.
A LOB típusú adatok kezeléséhez először ki kell választani egy LOB lokátort:
DECLARE
Kep BLOB;
BEGIN
SELECT haz kep INTO kep FROM haz WHERE haz id l;
END;
Másolni WB értéket az alábbi módon tudunk:
INSERT INTO haz (haz_id, haz _ kep) (SELECT haz id + l, haz_kep
FROM haz WHERE haz id= 20);
Ebben az esetben a LOB lokátor és a LOB értéke is átmásolásra kerül. Az UPDATE
hasonlóan müködik.
A BFILE típusú LOB adatot a következő módon lehet beszúrni:
CREATE OR REPLACE DIRECTORY tempdir AS '\oracle\rdbms'
GRANT READ ON DIRECTORY tempdir TO valaki
FOPEN (
Location VARCHAR2,
Filename VARCHAR2,
Open_mode VARCHAR2) RETURN UTL_ FILE . FILE_ TPE
136
13.PUSQL csomagok (packages) lváncsy Renáta
GET _LINE (
File FILE_TYPE,
Suffer OUT VARCHAR2)
A fájlt bezárni az FCLOSE utasítással lehet:
FCLOSE(file FILE_TYPE)
137
14.A PUSQL objektum tipusok Iváncsy Renáta
Az objektum típus
Az objektum típus egy felhasználó által definiált összeten adattipus, ami magában
foglalja az adatstruktúrát és az adatok kezeléséhez szükséges filggvényeket és eljárásokat. A
változókat, amik az adatstruktúrát alkotják. attribútumoknak nevezzük. A ftlggvényeket és
eljárásokat, amik meghatározzák az objektum viselkedését, metódusoknak nevezzük. Egy
objektum tehát attribútumokból és metódusokból áll. Egy objektum általában a valós világ
egy részének egy absztrakciója. Ha például veszünk egy k:utyát leíró objektumot, akkor ennek
az attribútumai a következök lehetnek: név, fajta, kor, míg a metódusai: eszik, iszik, gazdát
cserél és beoltják. Természetesen egy k:utyával nagyon sok minden egyéb is történhet, az
objektumunk csak azokat az attribútumokat és metódusokat tartalmazza, ami az adon feladat
elvégzéséhez feltétlen szükséges.
Futás időben, amikor az adatstruktúrákat értékekkel töltjük fel, az absztrakt objektum egy
példányát (instance) hozzuk létre. Annyi példányt lehet létrehozni, amennyire szükségünk
van.
!38
14.A PUSQL objektum tipusok lváncsy Renáta
139
14.A PUSQL objektum típusok lváncsy Renáta
BE GIN
RETURN Complex(rpart * x.rpart - ipart * x.ipart,
rpart * x.ipart +ipart* x.rpart);
END times;
14.2.1. Attribútumok
!40
14.A PUSQL objektum tipusok lváncsy Renáta
14.2.2. Metódusok
A metódus egy ftlggvény vagy eljárás, amit az objektum típusban deklarálnak a MEMBER
vagy STATIC kulcsszó hasmáJatávaL Egy metódusnak nem lehet azonos a neve, mint az
objektum tipusnak, vagy bármely attribútumának.
A MEMBER metódusok példányra hivatkomak:
l instance_expression.method()
A STATIC metódusok objektumra hivatkoznak, nem annak pédányára:
object_type_name.method()
A metódusok két részböJ állnak a specifikációból és a törzsből. A specifikáció a metódus
nevét és az opcionális paraméter listáját tartalmazza, ftlggvények esetén pedig még a
visszatérési értéket. A törzsben található a kód, ami elvégzi a metódus feladatát. Minden
metódusnak, ami szerepel a specifikációs részben, meg kell lennie a megvalósilásnak a
törzsben, vagy pedig NOT INSTANTIABLE-ként kell deklarálni, ami megadja, hogy ez a
metódus csak ennek a típusnak az altípusaiban van jelen. A formális paraméterek nevükkel és
típusukkal vannak megadva, azzal a kikötéssel, hogy egy típusra nem lehetnek méret
megszorítások. Az adattípus bármilyen Oracle adattípus lehet, kivéve azokat, amiket az
attribútumoknál is felsoroltunk.
Oracle-ban objektumokat létre lehet homi PUSQL nyelven, Javaban és C-ben. A
metódusok lehetnek túlterheltek is.
Minden objektumnak van egy konstruktora, ami egy rendszer által definiált metódus. A
konstruktor metódus neve megegyezik az objektum típus nevével. A konstruktort az objektum
típus inicializálására és példányosítására használjuk. Az Oracle automatikusan elkészíti
minden objektum típusnak a konstruktorát. A konstruktor formális paraméterei az objektum
típus attribútumai. Az attribútumok és a formális paraméterek azonos sorrendben, azonos
névvel és azonos típussal szerepelnek. A PUSQL soha nem hívja meg implicit a
konstruktorokat, azt mindig nekünk kell explicit meghívni. A komplex példára a konstruktor:
DECLARE
K complex;
C complex;
D complex;
BEGIN
K := complex(5,2); - - a k objektum letrehozasa
141
14.A PUSQL objektum típWIOk Iváncsy Renáta
Az ALTER TYPE utasítással új attribútumot lehet adni egy objektum tlpushoz, egy létező
attribútumot lehet módosítani vagy törölni. Ezzel az utasítássallehet egy új metódust felvenni,
vagy egy létezőt törölni.
CREATE TYPE Person_typ AS OBJECT
( name CHAR (20),
ssn CHAR(l2),
address VARCHAR2(100));
CREATE TYPE Person nt IS TABLE OF Person_typ;
CREATE TYPE dept_typ AS OBJECT
( mgr Person_typ,
emps Person_ nt);
CREATE TABLE dept OF dept_typ;
142
14.A PUSQL objektum típusok Iváncsy Renáta
14.2.6. Öröklés
Lehetőség van öröklés megadására az objektum típusok között. Egy objektum típus
altípusaként definiálhatunk egy típust, ami örökli a szülö összes attribútumát és metódusát, de
ezen kívül még újabb attribútumokkal és metódusokkal rendelkezhet. Lehetőség van arra is,
hogy a szülö metódusát felülúja a gyerek metódus.
143
14.A PUSQL objektum típusok Iváncsy Renáta
Ha létrehoztunk egy objektum típust, utána a PUSQL blokkból úgy deklaráhatjuk. mint
bármely más beépített típust. Az alábbi példában deklarálunk egy Ra tional objektum
típusú változót, majd meghívjuk rá a konsttuktort. A konsttuktorban a két szám a racionális
szám számlálója és nevezője.
DECLARE
r Rational;
BEGIN
r := Rational(6, 8);
dbms output.put line(r.num); -- prints 6
Az r értéke deklaráláskor NULL, a konsttuktor meghivása után kap inicializált érétket.
Egy NULL objektum sosem lesz egyenlő egy másik objektummal, ha tehát összehasonlítanánk
öket, az eredmény NULL lenne.
Az attribútumokra a nevük alapján hivatkozhatunk, ahogy azt a fentebbi példában is
láttuk. a képemyöre csak a számlálót írattuk ki az r. num hivatkozással. Az attribútum
hivatkozásokat láncolni is lehet. Ha például egy objektumnak egy attribútuma rekord tipusú,
akkor a rekord egy mezöjére a következő szintaktikával hivatkozhatunk:
példánynév.attribútumnév.mez6név.
Metódusokat is a pont hivatkozással hivhatunk meg: egyednev. metodus formában.
144
15.PUSQL dinamikus SQL Iváncsy Renáta
adódnak:
• Az utasítások nincsenek elöoptimalizálva
• A végrehajtási terv a futtatáskor alakul ki
• Csak futtatáskor van szintaktikai és jogosultság ellenőrzés
Az EXECUTE IMMEDIATE utasítás szintaktikája:
EXECUTE IMMEDIATE dinamikus sztring
[INTO valtozol, valtozo2,_]
[USING [INIOUTIIN OUT] kotesl,
[IN l OUT l IN OUT] kotes2, ...
[{RETURNING l RETURN} INTO kotesl,kotes2]
A dinamikus sztring tartalmazza a lefuttatandó SQL utasítást. Az opcionális INTO
kulcsszó utáni változókba kerülnek be az adatok, ba az SQL utasítás visszatér valamilyen
egysoros eredménnyel. Az opcionális USING kulcsszó után bemenő paramétereket lehet
145
15.PUSQL dinamikus SQL lváncsy Renáta
megadni, amiket a lekérdezésen belül ott lehet hasmálni, ahol kifejezést lehet hasmálni. A
kimenő paraméterek visszatérési értékeket kaphatnak.
A dinamikus sztring bármilyen SQL utasítást tartalmazhat, ami után nem kell a
pontosvesszőt kitenni. Amennyiben azonban PUSQL blokkot tartalmaz, a pontosvesszöket ki
kell tenni.
Az alábbi példában egy tárolt eljárás segítségével adjuk fel az anyagra a rendelést a
cukrász adatbázisban. Amennyiben még nem létezik a rendelés tábla, azt is létrehozzuk. Ezt a
Data Dictionary us e r_ tables nevü táblájából kérdezhetjük Ie. Ezek után beszWjuk a
kivánt értékeket hasmálva a dinamikus SQL-t paraméterkötésseL A paraméterek neve
irreleváns a dinamikus SQL utasításban, csak a sorrendjük számí t.
CREATE PROCEDURE rendeles sp (anyagid INT, mennyiseg FLOAT)
AS
Tabladb INT;
Sqlstm VARCHAR2(500);
BEGIN
SELECT COUNT(*) INTO tabladb FROM user_tables
WHERE UPPER(table_name) = 'RENDELES';
IF tabladb = 0 THEN
EXECUTE IMMEDIATE ' CREATE TABLE rendeles
146
IS.PUSQL dinamikus SQL lváncsy Renáta
147
16.A Transact-SQL alapjai Iváncsy Renáta
16.1. Kommentek
A Transact-SOL kétfajta megjegyzést támogat. A dupla minusz, (--) jellel egysoros
megjegyzést tehetünk, míg a , .. l jelek között több sorban is elhelyezhetünk megjegyzést,
amelyek akár egymásba ágyazhatóak.
16.2. Azonosftók
Az SOL szerveren minden adatbázis objektum kaphat azonosítót, mínt például az
adatbázisok, táblák, tárolt eljárások, indexek, oszlopok, megkötések és így tovább. A legtöbb
esetben kötelező azonosítóval ellátni az objektumot, de vannak olyan objektumok, amelyek
esetében az azonosító megadása opcionális (ilyenek pl. a megkötések). Az objektum
azonosítója akkor kerül létrehozásra, amikor az objektumot definiáltuk. Ezek után az
!48
16.A Transact-SQL alapjai lváncsy Renáta
16.3. Konstansok
A konstans (más néven literál) egy szimbólum, ami megadott értéket reprezentál. A
konstans formátuma fiigg az általa reprezentált értéktőL
149
16.A Transact-SQL alapjai Iváncsy Renáta
Dátum konstans
A dátum kanstansok megadott formátumú, aposztrófok közötti kifejezések.
Például: '021ll 12002 ', vagy '15 April, 2002 'stb.
Integer konstans
Az integer konstans számok, amik nincsenek aposztrófok között, valamint nem
tartalmaznak tizedes pontot.
Például: 23, 45 stb.
Decimális konstans
A decimális konstans számok sorozata, ami tartalmazhat tizedespontot is.
Például: 1234.56, 0.23 stb.
Float és real konstans
A float és real konstans megadott formátumúak lehetnek.
Példálc real és float lconstansolcra: 123.5E5, 0. 5E-2 stb.
ISO
16.A Transact-SQL alapjai Iváncsy Renáta
16.6. Operátorok
151
16.A Transact-SQL alapjai Iváncsy Renáta
16.6.3. Bitmáiveletek
Jelentés
Bit szintü S kapcsolatot hajtja végre. Kimenetének típusa megegyezik
a bemenetének ti usával.
Bit szintü VAGY kapcsolat. Kimenetének típusa megegyezik a
bemenetének ti usával.
Kizáró VAGY kapcsolat. Kimenetének típusa megegyezik a
bemenetének ti usával.
152
16.A Transact-SQL alapjai Iváncsy Renáta
Operátor Jelentés
+ Pozitiv előjel
- Negatív előjel
- Bit szerinti negálás (Csak INTEGER típuson lehet használni.)
153
17 .T-SQL programvezérl ö utasítások Iváncsy Renáta
154
17.T-SQL programvezérlő utasítások Iváncsy Renáta
155
17 .T -SQL programvezérlő utasfiások lváncsy Renáta
ELSE
CONTINUE
END
PRINT 'Too much for the market to bear'
17.4. A GOTO
A GOTO utasítás segítségével egy címkére lehet ugrani. A GOTO utasítás és a címke
között egyetlen egy utasítás sem lesz végrehajtva. A GOTO gyakori használata nehezen
követhetövé teszi a kódot, ezért érdemes egyéb programvezérlő utasítás segítségével
megoldani a feladatokat. GOTO utasítást akkor érdemes használni, ha mélyen beágyazott
programvezérlő utasításokban járunk. és onnan szeretnénk ki ugrani_
A címke definiálása:
Cimke név:
A GOTO utasítás:
GOTO cimke nev
Példa:
DECLARE @tablename sysname
SET @tablename = N'authors'
table_loop:
IF (@@FETCH STATUS <> -2)
BE GIN
SELECT @tablename RTRIM(UPPER(@tablename))
EXEC ("SELECT """ t @tablename + """ = COUNT(*) FROM "
t @tablename
PRINT " "
END
FETCH NEXT FROM tnames cursor INTO @tablename
IF (@@FETCH STATUS <> -1) GOTO table loop
17.5. A RETURN
A RETURN utasítás feltétel nélkül megszakítja a lekérdezést, a tárolt eljárást vagy a
batchet. A RETURN utasítás után álló utasítások nem kerülnek végrehajtásra. Tárolt
eljárásban a RETURN értékéül egy INTEGER szám adható. Amennyiben nem adunk meg
visszatérési értéket, a tárolt eljárás O-val tér vissza. Általános szokás, hogy a RETURN kóddal
adjuk meg, hogy a tárolt eljárás sikeres volt-e. Siker esetén a visszatérési érték nulla, minden
nem nulla visszatérési érték hibát jelent.
156
17.T -SQL programvezér ló utasfiások Iváncsy Renáta
17.7. A WAITFOR
A WAITFOR utasítás megad egy időpontot vagy egy idö intervallumot ameddig az
utasítások végrehajtása felfüggesztödig.
Példa:
BEGIN
WAITFOR TIME '22:20'
EXECUTE update_all_stats
END
157
17.T -SQL programvezérlő utasítások Iváncsy Renáta
• a CASE kulcsszóból,
• annak az oszlopnak a nevébő!, amit át akarunk alakítani,
• a WHEN és a THEN kulcsszavakból,
• az END kulcsszóból,
• és az opcionális ELSE kulcsszóból.
A CASE utasításnak két formája van, az egyszerű CASE és a SEARCHED CASE
utasítás. Az egyszerű CASE utasítás esetén a bemeneli változóra teszünk különböző
feltételeket. Amennyiben az egyik feltétel teljesül, a feltétel mögött álló kifejezéssel tér
vissza.
CASE bemeneti_ kifejezés
WHEN feltétell THEN visszatérési_ kifejezés l
WHEN feltétel2 THEN visszatérési __ kifejezés 2
END
A bemeneli kifejezés akkor lesz végrehajtva, ha az egyszerű CASE utasítást használjuk.
Bármilyen érvényes SQL Server kifejezés lehet. A feltétel bármilyen érvényes kifejezés,
amivel a bemeneli kifejezés össze lesz hasonlítva. A bemeneli kifejezés tipusának és az
összehasonlító kifejezés tipusának meg kell egyeznie vagy implicit adatkonverziónak kell
életbe lépnie ahhoz, hogy az utasítás helyes legyen. A kimenet az a kifejezés, ami visszatérési
értéke lesz a CASE kifejezésnek, ha a feltétel és a bemeneti kifejezés megegyeztek. Az ELSE
után található visszatérési érték abban az esetben lesz az eredmény, ha egyetlen feltétel sem
lett igaz. Ha ez a rész hiányzik, és a bemeneli kifejezés nem illeszkedett egyetlen feltételre
sem, a CASE visszatérési értéke NULL lesz. A visszatérési értékek tipusának meg kell
egyezniOle vagy implicit konverzióval átkonvertálhatónak kell lenniük.
Az utasítás müködése:
• Kiértékeli a bemeneli kifejezést.
• A megadott sorrendben kiértékeli a bemeneti_kifejezés=feltétel egyenlőséget, minden
egyes WHEN kulcsszóra.
• Azzal a visszatérési kifejezéssel tér vissza, amelyik legelőször IGAZ értéket adott.
• Ha egy feltétel sem volt igaz, az SQL Server az ELSE ágban megadott kifejezéssel tér
vissza, ha volt megadva, egyébként pedig NULL értékkel.
A CASE utasítás lekérdezésen belül is használható.
!58
17.T-SQL programvezérlő utasítások lváncsy Renáta
Példa:
SELECT Category
CASE type
WHEN 'popular comp' THEN 'Popular Computing'
WHEN 'mod cook' THEN 'Modern Cooking'
WHEN 'business' THEN 'Business'
WHEN 'psychology' THEN 'Psychology'
WHEN 'trad cook' THEN 'Traditional Cooking'
ELSE 'Not yet categorized'
END,
CAST(title AS varchar(25)) AS 'Shortened Title',
price AS Price
FROM titles
WHERE price IS NOT NULL
ORDER BY type, price
IGAZ-at adott.
• Ha egyetlen BOOLEAN kifejezés értéke sem lett IGAZ, akkor az ELSE ágban
megadott visszatérési kifejezéssel tér vissza, ha volt ELSE ág, egyébként pedig NULL
értékkel.
159
17.T-SQL programvezérlő utasilásolt lváncsy Renáta
Példa:
SELECT 'Price Category'
CASE
WHEN price IS NULL THEN 'Not yet priced'
WHEN price < 10 THEN 'Very Reasonable Title'
WHEN price >= 10 and price < 20 THEN 'Coffee Table
Title'
ELSE 'Expensive book!'
END,
CAST(title AS varchar(20)) AS 'Shortened Title'
FROM titles
ORDER BY price
Az eredmény:
Price Category Shortened Title
160
18.T-SQL adattípusok lváncsy Renáta
161
18.T-SQL adattípusok lváncsy Renáta
162
IS.T-SQL adattípusok lváncsy Renáta
163
19.T-SQL lrurzorok Iváncsy Renáta
164
19.T-SQL kurzorok lváncsy Renáta
minden kurzor müveletre ebből a táblából kapjuk a választ, így ezzel a lrurzorral nem tudjuk
módosítani az adatokat. Ha nem adjuk meg ezt a kulcsszót, akkor komnúttáJt törlések és
módosítások megtehetőek a ,,kurzor alatti" táblákon.
A SCROLL kulcsszó segítségével az adható meg, hogy a Irurzoron minden típusú FETCH
utasítás (FIRST, LAST, PRIOR. NEXT, RELATIVE, ABSOLUTE ld, később) érvényes. Ha
a SCROLL nincs megadva, akkor az egyetlen támogatott FETCH utasítás a NEXT.
A lekérdezés az a lekérdezés, ami meghatározza a Imrzor adathalmazát. A COMPUTE,
COMPUTE BY, FOR BROWSE és az INTO Irulesszavak használata nem megengedett a
lekérdezésben.
A READ ONLY kulcsszó megadása esetén a k:urzoron nem adhatóak meg módosítások.
Az UPDATE OF oszlopnév kulcsszó segítségével meg lehet adni azokat az oszlopokat,
amik módosíthatóak a lrurzoron keresztül. Ha nincsen megadva oszlop lista, az összes oszlop
módosítható.
A Transact-SQL deklaráció:
DECLARE kurzornév CURSOR
[ LOCAL l GLOBAL l
[ FORWARD_ ONLY l SCROLL l
[ STATIC l KEYSET l DYNAMIC l FAST_ FORWARD
[ READ_ONLY l SCROLL_ LOCKS l OPTIMISTIC J
[ TYPE_WARNING J
FOR lekérdezés
[FOR UPDATE [OF oszlopnév [ , ... n J J J
A LOCAL kulcsszóval megadható, hogy a lrurzor lokális legyen a triggerben, tárolt
eljárásban vagy batch-ben, ahol deklaráltuk. Ha a batch, tárolt eljárás vagy a trigger
befejeződik. a lokális kurzor implicit deallokálásra kerül. Amennyiben egy tárolt eljárás
ki.menö paramétere volt, úgy csak akkor kerül deallokálásra, ha az utolsó referencia is
megszünt rá.
A GLOBAL kulcsszóval megadható, hogy a lrurzor a kapcsolatra nézve globális, a kurzor
bármely tárolt eljárásból, triggerböl vagy batch-böl elérhető. Csak disconnect esetén
deallokálódi.k implicit a lrurzor.
A FORWARD ONLY kulcsszó azt adja meg, hogy a kurzor csak az első sorától az
utolsóig érhető el, így csak a FETCH NEXT utasítást támogatja.
A STATIC kulcsszó segitségével az adható meg, hogy a lrurzor által használt adat
átmeneti másolata az eredeti adatnak. Ez az átmeneti tábla a tempdb adatbázisban van, és
minden lrurzor müveletre ebböl a táblából kapjuk a választ, így ezzel a kurzorral nem tudjuk
165
19.T-SQL lrurzorok lváncsy Renáta
módosítani az adatokat. Ha nem adjuk meg ezt a lrulcsszót. akkor kommittált törlések és
módosítások megtehetőek a ,,kurzor alatti" táblákon.
A KEYSET lrulcsszó segitségével az adható meg, hogy a kurzoron belüli sorok tagsága és
sorrendje meghatározott, ha a kurzort kinyitottuk. A sorokat egyértelmüen azonosító lrulcsok
halmaza a tempdb adatbázis egy táblájában kerülnek eltárolásra, ezeket nevezik keyset-nek.
A nem Irules oszlopok módositása láthatóvá válik a kurzorban való mozgás során.
A DYNAMIC kulcsszó megadása esetén a kurzoron tett minden módosítás azonnal
látszódik, ahogy a kurzoron haladunk végig. Az adat értékek. sorok sorrendje és tagsága
minden egyes FETCH esetén változhat.
A FAST FORWARD lrulcsszó egy csak előre haladó (FORWARD ONLY), csak
olvasható (READ ONLY) kurzort deklarál.
A READ ONLY kulcsszó egy csak olvasható kurzort deklarál.
A SCROLL LOCKS lrulcsszó garantálja. hogy a pozicionált módositások vagy törlések
biztosan sikeresek lesznek a kurzorban. Az SQL Server zárolja a sorokat. amint azok be lettek
olvasva a kurzorba. hogy biztosítsa az elérhetőségüket
utasítás ne hajlódjon végre, ha az adott sor az utolsó beolvasás óta módosftásra került. Az
SQL Server ilyenkor nem zárolja a sorokat, amikor beolvassa azokat a kurzorba. helyette
időbélyegeket használ.
A TYPE W ARNING lrulcsszó megadásával megadható az az opció, hogy a kliens oldalra
egy figyelmeztető üzenet kerüljön elküldésre, ha a kurzor implicit adatkonverzión esett át.
166
19.T-SQL kurzorok lváncsy Renáta
FE TCH
[ [ NEXT l PRIOR l FIRST l LAST
l ABSOLUTE { n l @nvar }
l RELATIVE { n l @nvar }
l
FROM
sorral tér vissza, és az aktuális sor értékét az elsö sorra állítja. A LAST kulcsszó megadása
esetén a legutolsó sorral tér vissza, és azt teszi meg az aktuális sornak.
Az ABSOLUTE lrulcsszó megadása esetén az adathalmaz elejétől vagy végétöl számított
adott sorszámú sorát kapjuk meg. Ha a szám az ABSOLUTE lrulcsszó után pozitív, az
abszolút sorszámot a kunor elejétől számítja, ha negatív, akkor a végétől. Ha a paraméter
értéke nulla, az aktuális sorral tér vissza.
Ha a REALTIVE lrulcsszó után megadott n szám pozitiv, az aktuális sor utáni n-dik sort
adja vissza, ha negatív, akkor az aktuális sor előtti n-dik sort. Ha n értéke nulla, az aktuális
sorral tér vissza.
Az INTO kulcsszó segítségével adhatók meg azok a változók. amikbe az adott sor kerülni
fog. Balról jobbra a megfelelő változókba a kunor oszlopai kerülnek a megfelelő sorrendben.
A változók és az oszlopok típusának vagy meg kell egyeznie, vagy implicit adattípus
konverziónak kell müködni rájuk. A változók számának meg kell egyeznie a kurzorban
kiválasztott oszlopok számávaL
!67
19.T-SQL lrurzorok Iváncsy Renáta
19.7. Korzorváltozók
A lrurzorváltozókat a batch vagy eljárás DECLARE utasításában lehet deklarálni.
Deklarálás után az alapértelmezett értékük a NULL. Értéket a SELECT vagy a SET utasításon
belül kaphatnak.
DECLARE kurzor változó név CURSOR
open cl
fetch cl into @id, @nev, @egyseg, @ar
168
19.T-SQL kurzorok Iváncsy Renáta
169
20.T-SQL tárolt eljárások Iváncsy Renáta
tulajdonságaihoz:
• Lehetnek ki és bemenő paraméterei egyaránt.
• Utasításokat tartalmazhat, amik az adatbázison hajtanak végre müveleteket, és
természetesen más tárolt eljárást is meghívhat A tárolt eljárások, ellentétben az
ORACLE-lel, tartalmazhatnak DDL és DCL utasításokat is.
• Státusz információval térhet vissza az öt hívó eljárás vagy batch felé, ezzel jelezve a
sikerességet vagy a hibát.
Az SQL Server öt csoportba sorolja a tárolt eljárásokat. [l]
• A rendszer tárol eljárások a master adatbázisban vannak eltárolva. Minden rendszer
tárolt eljárás az sp_ prefixszel kezdődik. Segítségükkel lehetőség nyilik a
rendszertáblák adatainak lekérdezésére, az adminisztrátoroknak a rendszertáblák
módosítására, noha nincs joguk a táblákat közvetlen módosítani. A rendszer tárolt
eljárásokat bármely adatbázisban futtathatjuk.
• A lokális tárolt eljárások az egyes felhasználói adatbázisokban vannak eltárolva.
• Az átmeneti tárolt eljárások lehetnek lokálisak, ekkor a nevük egy #-kal kezdődik.
• A távoli tárolt eljárás (remote) az SQL Server egy korábbi sajátossága volt, most az
elosztott lekérdezések támogatják ezt a funkcionalitást.
• A kO.lső tárol eljárások (extended) DLL-ként vannak implementálva, és az SQL
Server környezetén kívül futnak le. Ezek az eljárások az xp_ prefixszel rendelkeznek.
A tárolt eljárást az EXECUTE utasítás segitségével futtathatjuk. A tárolt eljárások abban
különböznek a filggvényektöl, hogy nevük helyén nem térnek vissza értékkel, és nem
használhatóak kifejezésekben sem.
170
20.T-SQL tárolt eljárások lváncsy Renáta
WITH
{ RECOMPILE ENCRYPTION l RECOMPILE 1 ENCRYPTION } l
FOR REPLICATION
AS sql_utasítások [ ... n l
A ;number opcionális paraméter segítségével lehetőségünk van azonos nevü eljárásokat
létrehozni más sorszámmal, majd egyszerre le tudjuk törölni az egészet, csak az eljárás nevére
kell hivatkozni, szám nélkül (külön-külön nem is lehet letörölni öket). A létrehozáskor a
sorszámokat egytől kezdve kell megadni . Ha futtatáskor nem adjuk meg az eljárás számát,
akkor az egyes számmal ellátott eljárás fog lefutni.
171
20.T-SQL tárolt eljárások Iváncsy Renáta
A bemeneli paraméter núndig @-al kezdődik, és meg kell adni mind a típusát, mind a
típus hosszát, ha van ilyen. Az eljárás meghívásakor núnden bemenő paraméternek értéket
kell kapnia.
A VARYING Irulcsszó csak Irurzor paraméter esetén használható, megadja a kimeneti
paraméterként támogatott eredményhalmazt.
Az = jel után adható meg, hogy mi legyen az adott paraméter alapértelmezett értéke.
Amennyiben van egy paraméternek alapértelmezett értéke, úgy híváskor nem kell feltétlen
értéket kapnia. Az alapértelmezett értéknek konstansnak kell lennie, vagy lehet NULL érték
is. Tartalmazhat "wildcard" karaktereket(%, _. stb.) is, ha a paramétert az eljáráson belül a
LIKE operátorban használják.
Az OUTPUT lrulcsszó azt adja meg, hogy az adott paraméter kimeneti paraméter.
RECOMPILE l ENCRYPTION l RECOMPILE , ENCRYPTION: A RECOMPLIE
lrulcsszóval adható meg, hogy a tárolt eljárás futási időben legyen újrafordítva, azaz ne
tárolódjon el a futási terve. Az ENCRYPTION lrulcsszó használata esetén a tárolt eljárás
kódja titkosítva lesz, hogy elosztott adatbázisok esetén a kód ne kerüljön nyilvánosságra.
Egy tárolt eljárás mérete maximálisan 128Mb lehet. A CREATE PROCEDURE utasítás
nem keveredhet egy hatch-en belül semmilyen más T-SQL utasítással. A paraméterek
alapértelmezés szerint felvehetik a NULL értéket.
van azonban a pozíció szerinti paraméter átadásra. llyenkor a hívó értékek sorrendjének meg
172
20.T-SQL tárolt eljárások lváncsy Renáta
173
21.T-SQL filggvények Iváncsy Renáta
Az oszlopftlggvények értékek egy halmazán hajt végre számításokat és egy értékkel tér
vissza. A COUNT ftlggvény kivételével az oszlopfiiggvények a NULL értékeket figyelmen
kívül hagyjálc Leggyakrabban egy SELECT lekérdezésben szoktá.k használni.
A T-SQL-nek a következő oszlopftlggvényei vannak:
FüEEVény Jelentés
AVG Átlagot számítja ki.
BINARY CHECKSUM Bináris ellenőrzö összeg számítása.
CHECKSUM Ellenőrzö összeg számítása
CHECKSUM AGG Csoportokra ellenőrzö összeg számítása.
CO UNT Elemek számát adja meg egy csoportban. Az eredményt int-ben
adja.
COUNT BIG Ugyanaz, mint a COUNT, csak az eredményt bigint-ben adja me_g.
GROUPING Megjelöli a sort, hogy a ROLLUP vagy a CUBE eredményeként
jött-e létre. (Csak olyan lekérdezésben használható, a hol a
GROUP BY a CUBE vagy a ROLLUP kulcsszóval szerepel.)
MAX A maximummal tér vissza.
MIN A minimummal tér vissza.
SUM Az összeggel tér vissza.
STDEV Az elemek szórását adja meg.
STDEVP Az elemek populációjának szórását adja meg.
VAR A statisztikai varianciát (szórásnégyzetet) adja meg a kifejezés
elemeire.
VARP Az elemek populációjának szórásnégyzetét adja meg.
A skalár ftlggvények egyetlen egy értékkel dolgoznak, és egy értékkel is térnek vissza. A
skalár fiiggvényeket a következő osztályokba sorolhatjuk:
174
21. T-SQL fiiggvények Iváncsy Renáta
• Konfigurációs fiiggvények
• Kurzor ftlggvények pl. @@FETCH_STATUS
• Dátum és idö függvények pl. GETDATE, DATEADD, DATEDIFF
• Matematikai ftlggvények pl. ABS, SIN, FLOOR
• Metaadat fiiggvények pl. COL_NAME, COL_LENGTH, DB_NAME
• Biztonsági ftlggvények pl. HAS_ DBACCESS, USER, USER_ ID
• Sztring ftlggvények pl. CHAR, LTRIM, LOWER, UPPER
• Rendszer ftlggvények pl. CAST, CONVERT, CURRENT_USER, ISNULL
• Rendszer statisztikai függvények pl. @@IDLE, @@TOTAL_WRITE
• Text és kép ftlggvények pl. PATIND EX, TEXTPTR, TEXTVALID
függvények visszatérési értéke egy tábla. A ftlggvénynek ebben az esetben nincs törzse, a
visszatérési érték egyetlen SELECT utasítás eredménye. A több utasításból álló tábla értékű
függvények visszatérési értéke szintén egy tábla, de ezt több SELECT utasítás hozza létre.
Nagyon fontos megjegyezni, hogy SQL Serveren a ftlggvényeket csak úgy lehet
meghívni, ha legalább két tagból álló nevével hivalkozunk rá. Ez tipikusan a fiiggvény
tulajdonosa előtaggal való ellátást jelenti. Az alábbi feladatokban a ftlggvény tulajdonosa
minden esetben az ap60 felhasználó lesz.
!75
21.T -SQL filggvények Iváncsy Renáta
176
21.T-SQL fiiggvények Iváncsy Renáta
177
21.T-SQL fllggvények lváncsy Renáta
178
21.T-SQL filggvények lváncsy Renáta
IF @hallgatodb != O
IF (@egyesdb/@hallgatodb)*lOO > @szazalek
BEGIN
INSERT INTO @selTeacher values
(@teaid,@teaname,@couid)
END
FETCH cl INTO @teaid, @teaname, @couid
END
CLOSE cl
179
21. T -SQL filggvények Iváncsy Renáta
lDe.LLOCATE cl
RETURN
END
A ftlggvény hivása:
l SELECT * FROM getTeachers(20)
21.2.2. A függvéayek módosftáaa
!80
22.T-SQL triggerek lváncsy Renáta
181
22.T-SQL triggerek Iváncsy Renáta
mind nézetre definiálva vannak. A trigger létrehozásakor legalább egy eseményt meg
kell adni.
c) Az eseményhez képest a trigger időben mikor fut le
A trigger lefuthat a triggert kiváltó esemény után (AFfER vagy FOR. a kettő
182
22.T-SQL triggerek lváncsy Renáta
található bit tartozik a táblázat második oszlopához, és így tovább. A ftlggvény eredménye
egy egész számként megadott bitmaszkkal (módosítonbit_maszlc) maszkolható egy bit szintü
operátor (bitszintű_operátor) segitségével, és a kapott eredményt egy összehasonlító
operátorral összehasonlíthatjuk egy kívánt bitmintával (egész számként megadott érték).
A harmadik módja az eseményben részt vevő adatokról információt nyerni a deleted és az
inserted táblák használata. Ezeket a táblákat a szerver automatikusan hozza létre, és a
memóriában tárolja, amig a trigger aktiv. Mindkét tábla struktúrája megegyezik annak a
táblának a struktúrájával, amire a triggert definiáltuk, tehát ugyanazok az oszlopok,
ugyanabban a sorrendben szerepeinek benne. Az inserted táblából az éppen beszúrt adatokat
lehet elérni, míg a deleted táblából az éppen kitörölt adatokat lehet kinyerni. Mivel az SQL
Server triggerek utasítás triggerek, így figyelni kell arra, hogy mind az inserted mind a
deleted tábla több sort is tartalmazhat, így pontosan úgy kell kezelni öket, mint egy táblát
(JOIN). Amennyiben egyesével szecetnénk ezeket az információkat feldolgozni, érdemes
kurzort definiálni a táblák bejárására.
Egy táblára több triggert definiálhatunk ugyanarra az eseményre. A triggerek futási
sorrendje véletlenszerű lesz, kivéve az elsőt és az utolsót, mert az sp_settriggerorder tárolt
eljárással be lehet állítani egy triggert, hogy az legyen az első, ami lefut, és egy triggert, hogy
az legyen az utolsó ami lefut.
Megkötések, korlátozások triggerekre:
• A CREATE TRI GG ER utasitásnak a hatchen belül az első utasításnak kell lennie, és a
batch összes utasítása hozzá tartozik.
• Egy triggert csak egyetlen táblára lehet definiálni.
• A trigger csak az aktuális adatbázisban kerül létrehozásra, de hivatkozhat más
adatbázisbeli objektumokra is.
• Egy triggert több eseményre is definiálhatunk ugyanabban a CREATE TRI GG ER
utasításban.
• INSTEAD OF DELETFJUPDATE trigger nem definiálható olyan táblákra, amire
olyan idegeokules lett definiál va, ami kaszkádosítva lett (ON UPDATE CASCADE,
ON DELETE CASCADE).
• A trigger futása során, hasonlóan a tárolt eljárásokboz, eredménnyel térhet vissza. Ez
általában ketillendö, ezért kerülni kell a lekérdezéseket a triggerben, ami eredménnyel
tér vissza a felhasználó felé.
183
22.T-SQL triggerek Iváncsy Renáta
184
23.T-SQL tranzakciók Iváncsy Renáta
23.1. Tranzakciómódok
Az SQL Serveren három tranzakciómód létezik:
• Autokommit tranzakció: minden egyes utasítás egy tranzakció.
• Explicit tranzakció: minden egyes tranzakciót explicit el kell indítani a BEGIN
TRANSACTION utasítással, és be kell fejezni a COMMIT vagy a ROLLBACK
utasltásokkal.
• Implicit tranzakció: Egy új tranzakció indul, amint egy előző befejezödött, de
minden tranzakciót explicit be kell fejezni a COMMIT vagy a ROLLBACK
utasításokkal (ez hasonlít a leginkább az Oracle tranzakció módjára).
Az SQL Server alapértelmezésben az autokommit tranzakció módban müködik. Ebben az
esetben minden egyes utasítás egy különálló tranzakció. Explicit tranzakció módba úgy
válthatunk. ha kiadjuk a BEGIN TRANSACTION utasítást. Implicit tranzakciós módba a
SET IMPLICIT_TRANSACTIONS utasítással válthatunk. Ennek szintaktikája a következő :
SET IMPLICIT_TRANSACTIONS {ON l OFF}
185
23 .T-SQL tranzakciók Iváncsy Renáta
23.2.3. A SA VE TRANSACTION
Egy explicit vagy implicit tranzakciót fejt vissza a tranzakció kezdetéig vagy a
tranzakción belüli biztonsági pontig.
ROLLBACK [ TRAN [ SACTION
[ transaction_name l @tran name __ variable
l savepoint_name l @savepoint_variable J
A transaction_name a tranzakció nevét adja meg, amihez a BEGIN TRANSACTION
tartozik. Ha egymásba ágyazott tranzakciók vannak, akkor a legkülső tranzakció nevét kell
megadni. A savepoint_name annak a biztonsági pontnak a neve, ameddig a tranzakciót vissza
szeretnénk fejteni.
Ha nincsen megadva sem tranzakció név, sem biztonsági pont név, akkor a legkülső
tranzakció kezdetéig fejtődik vissza a tranzakció. Ha két azonos nevű biztonsági pont van egy
tranzakcióban, akkor a ROLLBACK a legutolsó biztonsági pontig fejtődik vissza.
Ha a visszafejtés egy biztonsági pontig történik, akkor a zárolások nem kerülnek
felszabadításra.
186
23.T-SQL tranzakciók Iváncsy Renáta
23.4. Zárolások
A különbözö zároJási típusok az SQL Server 2000 esetén:
Zárolási mód Leírás
Osztott (shared) Csak olvasható müveletek:re hasmálatos, mint pl. a SELECT.
Módosító (update) Olyan erőforrásokra használatos, ami módositható.
Kizárólagos Kizárólagos jog, INSERT, UPDATE és DELETE utasítások esetén.
(exclusive) Biztosítja, hogy többen nem módosithatják egyszerre ugyanazt az
adatot.
lnten t ZároJási hierarchia kialakítására hasmálatos. Különbözö módjai:
intent shared, intent exclusive, és shared intent exclusivval.
Séma (schema) Akkor hasmálatos, ha a müvelet a végrehajtandó tábla sémájától
függ.
Bulk Update Táblába tömeges adatmázolás esetén hasmálatos, ha a T AB LOCK
zárolás meg van adva.
.. .
A zárolást módok kompabbtiltást mátnxa:
Létez6w
Kért úr IS s u IX SIX x
IntentsharedOS) I I I I I N
Shared (S) I I I N N N
Update (U) I I N N N N
Intent Exclusive (IX) I N N I N N
Shared with lntent Exclusive (SIX) I N N N N N
Exclusiv@ N N N N N N
A táblazárolást ttppek (table lock hmts) segitségével felülírhatók az aktuáhs tzoláctós
szint szabályai az adott tábla esetén. A táblazároJási tippeket a SELECT, INSERT, UPDATE
vagy DELETE utasításokkal lehet kiadni. A következő táblázat összefoglalja a táblazároJási
tippeket:
Zárolás Le fr ás
HOLDLOCK A tranzakció végéig megosztott zárat tart fenn.
NO LOCK Nem ad ki osztott zárat és nem vesz figyelembe kizárólagos zárat.
Csak SELECT utasítás esetén hasmálható.
187
23 .T-SQL tranzakciók Iváncsy Renáta
PAG LOCK Lapot zárol, amikor alap esetben tábla lenne zárol va.
READCOMMmED A READ COMMilTED izolációs szintnek megfelelő zárolást
használ.
READPAST Kihagyja azokat a sorokat, amiket más tranzakció zárol, ahelyett,
hogy megvárná, míg a másik tranzakció elengedi. Csak SELECT
esetén használható.
READUNCOMMITfED Megegyezik a NOLOCK-kal.
REPEATABLEREAD A REPEATABLE READ izolációs szintnek megfelelő zárolázi
mechanizmust használja.
ROWLOCK A tábla vagy lap szintü zárolás helyett sor szintü zárat ad ki.
SERIALIZABLE Megegyezik a HOLDLOCK-kaL
TABLOCK Tábla szintü zárolást tart fenn a sor vagy a lap szintü zárolás
helyett. A zár az utasítás végéig marad fenn, de ha együtt
használják a HOLDLOCK-kal, akkor a tranzakció végéig.
TABLOCKX Kizárólagos zárat hasmái a táblára. Meggátolja, hogy más
tranzakció olvassa, vagy módosftsa a táblát, az utasítás vagy a
tranzakció végéig tart.
UPOLOCK Módosító zárat használ az osztott zár helyett. A zárat az utasítás
vagy a tranzakció végéig tartja fenn. Azért hasznos, mert úgy
olvashatjuk az adatot, hogy közben mások is olvashatják, hogy
aztán késöbb módosítsuk, és biztosak lehetünk benne, hogy
közben az adat nem módosult.
XLOCK Kizárólagos zárat tesz a tranzakció általhasznált összes adatra a
tranzakció végéig. PAOLOCK-kal vagy TABLOCK-kal
használható, ezzel állítva be, hogy m.ílyen szintü legyen a zárolás.
A zárolást az egyes utasításokban a tábla neve után kell megadni a WITH kulcsszó után
zárójelben. PL.
l SELECT oszlopnév FROM tábla WITH (TABLOCKX) WHERE ....
188
23.T-SQL tranzakciók lváncsy Renáta
189
24.T-SQL hibakezelés lváncsy Renáta
24.3. Az sp_addmessage
Az sp_addmessage tárolt eljárást csak a sysadm.in vagy serveradm.in szerepekhez
tartozó felhasznáJók futtathatják le. Ennek segítségével adható egy hiba üzenet a sysmessages
táblához.
sp_addmessage ( @msgnum = l msg_ id ,
@severity = l severity ,
@msgtext = l 'msg'
, [ @lang = J 'language•
190
24.T-SQL hibakezelés lváncsy Renáta
[ , [ @with_log = l 'with_log' l
[ , [ @replace = l 'replace' l
A tárolt eljárás paraméterei a hiba azonosítója, aminek értéke 5000 1-töl kezdödhet. Ennek
alapértelmezett értéke NULL A második paraméter a hiba fontossága, aminek értéke l és 25
között lehet, alapértelmezett értéke NULL. A harmadik paraméter a hiba szöveges üzenete. A
negyedik paraméter a nyelv. Ha nem adunk meg nyelvet, a kapcsolat alapértelmezett nyelve
lesz a hiba nyelve. A hibának a nyelvének és az azonosítójának együtt egyedinek kell lennie.
A következő paraméter azt adja meg, hogy a hiba bekerüljön-e a log fájlba.
Alapértelmezésben FALSE az értéke. Dyenkor nem minidig kerül be a log fájlba, csak akkor,
ha a hiba úgy generálódott. TRUE érték esetén mindenképp bekerül a log fájlba. Ha a hatodik
paraméter a REPLACE kulcsszó, akkor a hiba felülúja a táblában ilyen azonosítóval
rendelkező hibát.
24.4. Az sp_altermessage
A sysmessages táblában található hiba állapotát változtathatjuk meg vele. Csak sysadmio
vagy serveradmin jogosultsággal hívható meg.
sp __al termessage [ @message_ id = l message _number
, [ @parameter = l 'write_ to_log'
, [ @parameter_value = l 'value'
A message_number a módosítandó hiba hibaszáma. A második paraméter mindig
WITH_LOG kell, hogy legyen. Ha a value értéke TRUE, a hibamindig bekerül a Windows
NT log-jába, ha FALSE, akkor a hiba generálásától filggöen kerül be a log-ba.
24.5. Az sp_dropmessage
Kitöröl egy megadott hibát a sysmessages táblából. Csak sysadmin vagy serveradmín
jogosultsággal hívható meg. Mivel a táblában egy hibát az hibaszáma és a nyelv együtt
határoz meg, igy törlésnél is ezt a két paramétert kell megadni:
sp dropDessaqe [ @. . gnWil • l message number
- [ , [ @lanq = l 'language' l -
24.6. A FORMATMESSAGE
A FORMATMESSAGE a sysmessages tábla üzenetét formázza meg. Funkcionalitása
megegyezik a RAISERROR használatával, annyi különbséggel, hogy míg a RAISERROR az
üzenetet azonnal ki úja, addig a FORMATMESSAGE visszatér a módosított üzenettel további
felhasználásra.
FORMATMESSAGE msg_ number, param_value [ , ... n l )
191
24.T-SQL hibakezelés Iváncsy Renáta
A fllggvénynek meg kell adni a formázandó hiba hibaszámát., majd a paramétereket, amik
a szimbólumok helyére kerülnek.
el.
A @@ERROR csak hiba esetén generálódik. figyelmeztetések esetén nem.
A @@ERROR szokásos használata a tárolt eljárás sikerességének vagy hibájának jelzése.
A tárolt eljárás minden egyes utasitása után megvizsgáljuk a @@ERROR értékét, és amikor
az nem nulla, eltároljuk egy nullára inicializált változóban. Az eljárás a változóval tér vissza.
Ha a tárolt eljárás utasításaiban nem volt hiba, a változó értéke nulla marad, ha volt benne
hiba, az utolsó hiba számát tartalmazza.
A @@ERROR használatát kiegészítheti a @@ROWCOUNT függvény használata, ami
azt adja meg, hogy az utolsó utasítás hány sort érintett.
24.8. A RAISERROR
A RAISERROR segítségével kétféleképpen küldhetünk hibaüzenetet az alkalmazásnak:
• Egy felhasználó által definiált hibaüzenetet, amit korábban az sp_addmessage tárolt
eljárással a sysmessages táblához adtunk.
• A RAISERROR utasításban megadott hibaüzenetet.
A RAISERROR a hibaüzenelen kívül hibaszámot, fontosságot és állapotot is rendel a
hibához. Ezen kívül lehetőség van arra, hogy a RAISERROR által generált hiba a Microsoft
SQL Server log-ban ketilljön eltárolásra.
192
24.T-SQL hibakezelés lváncsy Renáta
A RAISERROR szintaktikája:
RAISERROR ( { msg_ id l msg_ str } { 1 severity , state }
[ , a rgumen t [ , . . . n l l )
[ WITH option [ , .. . n l l
Az msg_id a felhasználó által definiált hiba, ami a sysmessages táblában került
eltárolásra. A felhasználó által definiált hibának a hibaszáma nagyobb kell, hogy legyen, mint
50000. Az alkalmi hiba (amit a RAISERROR generál) hibaszáma 50000.
Az msg_str az alkalmi hiba üzenete. Ez az a hiba, amit nem a sysmessages táblából
nyerünk ki, hanem a RAISERROR segítségével a hiba keletkezésekor definiálunk, és küldünk
el az alkalmazás felé. A hiba üzenete 400 karakter hosszú lehet. Ha a hibaüzenet hosszabb,
mint 400, akkor csak az elsö 397 karakter kerül megjelenitésre, és utána egy ellipszis, ami azt
jelzi, hogy az üzenet csonkolva lett. Minden alkalmi üzenetnek az üzenet azonosítója 14000.
Az alkalmi üzenetet, hasonlóan a C nyelv printf filggvényéhez, formattáló karakterek
segítségével formázható. Ennek segítségével a konstans szöveg közé változókat is
befiízhetün.k. A következö formázó szintaktika használható:
% [ [ flagl [widthl [preci si on l [{h l l} ll type
Af/ag meghatározza, hogy a mezöben melyik oldalra legyen rendezve a szöveg, illetve,
hogy milyen módon legyenek benne a szóköz karakterek. A width adja meg a szöveg
minimális szélességét. A precision megadja, hogy mennyi a maximális karakterszám, illetve
hogy mennyi a minimális digitek száma, amit a kimenetre kür. A különbözö típusú adatok
kiírására a következő szimbólumok szolgálnak:
Karakter tipus Jelentés
d vagy I Elöjeles integer szám.
o Elöjel nélküli oktális szám.
p Mutató.
s Sztring.
u Elöjel nélküli integer szám.
X vagy x Elöjel nélküli hexadecimális szám.
A severity határozza meg a htba fontosságát. Mmden felhasználó O és 18 értékig
határozhatja meg a hibaüzenet fontosságát. 19 és 25 közötti értéket olyan felhasznáJók
adhatnak a hibáiknak, akik sysadmin szerver szerephez tartoznak. A 19.. 25 mértékhez a
WITH LOG opciót meg kell adni.
A state a hiba állapotát jelenti, 1.. 127 lehet az értéke.
Az argument azok a paraméterek. amik a hiba üzenet részében szimbolikusan, a formázó
karakterek segítségével lettek helyettesítve. Ez lehet akár az aktuális hibaüzenet (msg_str)
vagy az msg_id által meghatározott üzenet a sysmessages táblában. A paraméterek száma O és
20 között lehet.
193
24.T·SQL hibakezelés Iváncsy Renáta
194
2S.SQL Sc:rver 2005 újdonságok lváncsy Rc:náta
25.1. Új adattípusok
Az SQL Server 2005 bevezette az XML adattipust, és nagy értékek tárolására szolgáló
adattipusokat (large value data types).
Az XML adattípus XML dokumentumok és XML dokumentum darabokat képes tárolni
oszlopként, változóként, paraméterként vagy fiiggvény visszatérési értékeként Az XML
adattípussal össze lehet rendelni egy séma leírást, ami validálja az adott dokumentumot. Az
XML adattípusokat az XQuery nyelv segitségével és XML adatmódosító utasításokkal (XML
DML) kezelhetjü.k. Az XML DML az XQuery kitetjesztése insert, delete és repiace value of
utasításokkal.
A nagy adatok tárolására szolgáló új adattipusok a varchar(max), az nvarchar(max) és a
varbinary(max). Az SQL Server 2000-ben ezek helyett a varchar(n), nvarchar(n) és a
varbinary(n) volt használható, ahol n a maximális tárolási kapacitást defmiálta, aminek értéke
8000 byte lehetett varchar és varbinary típusok esetén és 4000 byte az nvarchar esetén. Ha
ennél nagyobb adatokat szerenünk volna tárolni, akkor LOB tipusú objektumokat kellett
használni, mint a text, ntext és image. Ezek azonban korlátozott kezelési lehetöségekkel
rendelkeznek. Az új adattípusok bevezetésével lehetőség van nagy szöveges és bináris
!95
25.SQL Server 2005 újdonságok lváncsy Renáta
adatokat tárolni és kezelni pontosan olyan módon, ahogy a kisebb verziójukat (például a
varchar(max)-ra és az nvarchar(max)-ra használhatóakasztring kezelő műveletek is).
25.2.1. TOP
A TOP klauzula használatával lehetőség van egy lekérdezés első meghatározott sorát
megkapni. Az SQL Server 2000-ben a sorok számát csak konstansként lehetett megadni. Az
SQL Server 2005-ben már lehetőség van kifejezésként meghatározni a sorok számát. A TOP
klauzula szintaktikája a következő:
TOP (kifejezés) [PERCENT] [WITH TIES)
A kifejezés határozza meg, hogy hány sorral térjen vissza a lekérdezés, illetve a sorok
hány százalékával. Amennyiben a kifejezés nem konstans, a zárójeleket nem lehet elhagyni.
Százalékos értéket úgy lehet megadni, ha az opcionális PERCENT kulcsszót is kitesszük a
lekérdezés ben.
A WITH TIES opcióval a következő eset valósítható meg. Ha a lekérdezés tartalmaz
ORDER BY kifejezést. akkor lehetőség van arra, hogy a lekérdezés a TOP kifejezésében
1%
25.SQL Server 2005 újdonságok Iváncsy Renáta
meghatározott sorok számánál többel térjen vissza, ha ezek a többlet sorok azon oszlopa, ami
alapján rendeztünk, megegyezik az utolsó sor értékéveL
25.2.2. OUTPUT
Az OUTPUT ldauzula segítségével lehetőség van visszakapni azokat a sorokat, amiket az
INSERT, UPDATE vagy DELETE utasítások érintettek.
Az alábbiakban a három utasítás egyszerűsített szintakti.kája található, ahol a lényeg az
OUTPUT használatán van.
INSERT INTO táblanév (oszlopok_ listája) OUTPUT kifejezés
VALUES értékek
Az OUTPUT kulcsszó után meg kell határozni, hogy mely oszlopok értékeivel szeretnénk
visszatérni. Amennyiben ezen kívül mást nem határozunk meg, akkor az érintett sorok
eredményhalmazként kerülnek a kliens felé. Lehetőség van azonban ezeket a sorokat egy
tábla típusú változóha vagy egy átmeneti táblába tenni az INTO kulcsszó segitségével.
Az érintett sorok oszlopainak a kiválasztására a DELETED és az INSERTED prefix
használata szolgál. A DELETED prefixet DELETE vagy UPDATE esetén lehet használni, és
a kitörölt adatokat tartalmazza. Az INSERTED prefix INSERT és UPDATE utasítások esetén
használható, és az új adatokat tartalmazza.
Az alábbi példában definiálunk egy tábla típusú változót, majd egy módosító utasítással
csökkentjOk a l 00 forintnál olcsóbb termékek árát l 0%-kal. Az érintett sorokból az anyag
nevét, régi és új árát az átmeneti táblába töltjük. A szkript utolsó lekérdezésében pedig
felhasználjuk ezt a tábla változót, hogy a 30 forintnál olcsóbb anyagok régi és új árát
lekérdezzük.
197
25.SQL Server 2005 újdonságok Iváncsy Renáta
25.2.3. EXECUTE AS
!98
25.SQL Server 2005 újdonságok lváncsy Renáta
'login_name'
A modul belsejében található utasítások az itt meghatározott login jogosultságaival
futnak.
25.3. Hibakezelés
Az SQL Server 2000-ben a hibakezelés lényegében hiba dobásának lehetőségére
korlátozódik. ami egy programozási nyelv esetén nem kielégitő. Az SQL Server 2005-ben
ezért bővítették a rendszer hibakezelési lehetőségeit. Az alábbiakban ezt tekintjük át röviden.
Az SQL Server 2005-ben a hibakezelés megvalósításának módja hasonlít a már sokak
által megszokott programozási nyelvekben (C#, C++) megismert hibakezeléshez. Az SQL
utasítások egy csoportját egy TRY blokkba zárhatjuk. és az itt keletkezett hibákat a CATCH
blokkban tudjuk lekezelni. A TR Y-CATCH blokk szintaktikája a következő:
BEGIN TRY
{SQL utasítások sorozata}
END TRY
BEGIN CATCH
{SQL utasítások sorozata}
END CATCH
A TRY-CATCH blokk minden olyan hibát elkap, aminek hiba fontossági értéke
(severity) nagyobb, mint 10, és nem bontja a kapcsolatot. A BEGIN CATCH utasításnak
közvetlen az END TRY utasítást kell követnie, különben szintaktikus hiba keletkezik.
Egy TRY-CATCH blokkra az alábbi megkötések vannak:
• Nem tarthat több hatch-en keresztül.
• Nem tarthat több blokkon keresztül (nem lehet több BEGIN és END benne).
• Nem tarthat IF-ELSE programvezérlő utasításon keresztül sem.
• Nem használható felhasználó által definiált függvényben.
Amennyiben nem keletkezik hiba a TRY részben, akkor a vezérlés közvetlen az END
CATCH utasítás utáni első sorra kerül (ha ez az utolsó sor az eljárásban, akkor az eljárás
visszatér). Amennyiben keletkezett hiba, akkor aBEGIN CATCH blokk első sorára kerül a
vezérlés. A CATCH blokk utasításainak végrehajtása után a vezérlés közvetlen az END
CATCH utáni elsö sorra kerül. A CATCH blokkon belüli elkapott hibák nem térnek vissza a
hívó alkalmazáshoz. Ha mégis valamilyen módon értesíteni szeretnénk a hibáról a hívó
alkalmazást, akkor a RAISERROR vagy a PRINT utasítást kell használni, vagy egy SELECT
utasítással egy eredmény halmazt kell a hívó fél számára biztositani.
A TRY-CATCH blokkok egymásba is ágyazhatóak, vagy a TRY vagy a CATCH blokk
tartalmazhat további blokkokat A GOTO utasítással nem léphetünk be egy TRY-CATCH
199
25.SQL Server 2005 újdonságok Iváncsy Renáta
blokkba, de azon belül használható címkére ugrásra, vagy lehetőség van ennek az utasításnak
a segítségével kiugrani a blokkból.
2S.3.l.lnformáció kinyeréseabibáról
A CATCH blokkban számos rendszer függvény segítségével tudunk információt kinyerni
arról, hogy milyen hiba keletkezett. Ezek a következők:
Függvény neve Visszatérési érték
ERROR NUMBERO A hiba számával tér vissza.
ERROR SEVERITYQ A hiba fontossági számával tér vissza.
ERROR STA TE0 A hiba állapot számával tér vissza.
ERROR_PROCEDUREQ Annak a tárolt eljárásnak vagy triggernek a nevével tér vissza,
ahol a hiba keletkezett.
ERROR LINEO A rutinon belüli sorszámmal tér vissza, ami a hibát okozta.
ERROR MESSAGE() A hibaüzenet teljes szövegét tartalmazza.
Amennyiben a fenti függvényeket nem a CATCH blokkon belül híVJuk meg, visszatérési
értékük NULL.
200
25.SQL Server 2005 újdonságok Iváncsy Renáta
elvégzésére szaktak definiálni, mint mondjuk az auditálás. Az alábbi események DDL Irigger
készítését indokolják:
• Meg szeretnénk akadályomi, hogy bízonyos módositásokat hajtsanak végre az
adatbázis sémában.
• Szeretnénk, ha bizonyos műveletek végrehajtódDának abban az esetben, ha valami
megváltozik az adatbázis sémáhan.
• Naplómi szeretnénk eseményeket vagy módositásokat. amik az adatbázis
sémában történtek.
A DDL trigger létrehozásának szintaktikája a következő :
CREATE TRIGGER trigger ..név
ON { ALL SERVER l DATABASE }
[ WITH {ENCRYPTION l {EXECUTE AS (CALLER l SELF l
'felhasználói név'}}}
{{{FOR l AFTER} { esemény_tipus esemény_csoport} [, ... n)
AS
sql_utasítás [ ... n)
Mint látható, DDL trigger esetén is el kell nevezni a triggert, majd meghatározni, hogy mí
legyen a hatásköre. Ez lehet az adott adatbázis, amiben a trigger definiál va lett (DAT ABASE
kulcsszó használata) vagy az egész szerver (ALL SERVER). Az adatbázis hatókörrel
rendelkező DDL triggerek abban az adatbázisban kerülnek eltárolásra, ahol a létrehozó
utasítást kiadtuk., de létrehozhatjuk a MASTER adatbázisban is. A szerver hatókörrel
rendelkező DDL triggerek mindenképpen a MASTER adtabázisban kerülnek eltárolásra.
Az EXECUTE AS lrulcsszóval azt adhatjuk meg, hogy milyen jogosultságokkal fusson le
a trigger.
Mint ahogy az a szintaktikából is látható, a DDL trigger csak az esemény után lefutó
triggerként lehet definiálni. Ezek után kell definiálni az eseményt, amire az adott triggemek le
kell futnia. Az alábbi táblázatban azok az események láthatók, amikre adatbázis hatókörrel
rendelkező DDL trigger futtatható :
CREAlll_APPUCATION_ROU! ALlllR_APPUCATION_ROLE DROP_APPUCATION_ROLE
ALTF.R_AUTHORIZATioN_DATABASE
201
25.SQL Server 2005 újdonságok Iváncsy Renáta
CRF.ATE_I!VI!IIIT_NOTIFICATION DROP_EVENT_NOTIFICATION
CRF.ATE_SYNONYM DROP_SYNONYM
CREAri:_UsER ALT'Ili_USER
CRRATE_VIEW ALTER_ VIEW
Az alábbi táblázatban azok az események vannak felsorolva, amire szerver hatókörű DDL
triggert használhatunk.
ALTER_AI.TilfORIZATION_ SI!RVER
202
26.lrodalom jegyzék Iváncsy Renáta
203