Adatbázis példatár

Barabás Péter (4.2, 5., 6.1, 7.1, 7.3, 7.4, 8.2. fejezetek)

Kovács László (3., 4.1, 6.2, 7.2, 8.1, 9. fejezetek)

Szűcs Miklós (3., 4.1, 6.2, 7.2, 8.1, 9. fejezetek)

2011, Miskolci Egyetem, Általános Informatikai Tanszék

Új Széchenyi Terv logó.

Kelet-Magyarországi Informatika Tananyag Tárház

Nemzeti Fejlesztési Ügynökség http://ujszechenyiterv.gov.hu/ 06 40 638-638

Lektor

Dr. Pap-Szigeti Róbert

Kecskeméti Főiskola, főiskolai docens.

A tananyagfejlesztés az Európai Unió támogatásával és az Európai Szociális Alap társfinanszírozásával a TÁMOP-4.1.2-08/1/A-2009-0046 számú Kelet-Magyarországi Informatika Tananyag Tárház projekt keretében valósult meg.


Tartalom

1. Feladatok
Tervezési, modellezési feladatok
ER modell készítése
EER modell készítése
Hierarchikus adatmodel készítése
Konvertálás ER modellről hierarchikusra
Hálós adatmodell készítése
Konvertálás ER modellről hálósra
Relációs adatmodell készítése
Konvertálás ER modellről relációsra
Normalizálás
Lekérdezési feladatok a hálós adatmodellben
Relációs algebra
SQL feladatok
DDL (Data Definition Language) parancsok
DML (Data Manipulation Language) parancsok
DQL (Data Query Language) parancsok
DCL (Data Control Language) parancsok
OO modellezés
UML osztály diagram feladatok
ODL modellezés
OQL műveletek
Oracle adatbázis ORDBMS műveletek
DBMS telepítés, karbantartás
MySQL adatbáziskezelő
Oracle adatbáziskezelő
PL/SQL
PL/SQL blokk feladatok
Vezérlési szerkezet feladatok
Hibakezelés feladatok
Lekérdezés feladatok
Tárolt eljárások, függvények, aktív elemek
Tárolt eljárások, függvények
Triggerek
Alkalmazás programozói interfészek (API)
PHP
SQLJ
JDBC
ADO.NET
ORM framework-ök, perzisztencia felületek
Hibernate
JPA
LINQ
Működési környezet
Mintaparancsok
2. Megoldások
Tervezési, modellezési feladatok
ER modell készítése
EER modell készítése
Hierarchikus adatmodel készítése
Konvertálás ER modellről hierarchikusra
Hálós adatmodell készítése
Konvertálás ER modellről hálósra
Relációs adatmodell készítése
Konvertálás ER modellről relációsra
Normalizálás
Lekérdezési feladatok a hálós adatmodellben
Relációs algebra
SQL feladatok
DDL (Data Definition Language) parancsok
DML (Data Manipulation Language) parancsok
DQL (Data Query Language) parancsok
DCL (Data Control Language) parancsok
OO modellezés
UML osztály diagram feladatok
ODL modellezés
OQL műveletek
Oracle adatbázis ORDBMS műveletek
DBMS telepítés, karbantartás
MySQL adatbáziskezelő
Oracle adatbáziskezelő
PL/SQL
PL/SQL blokk feladatok
Vezérlési szerkezet feladatok
Hibakezelés feladatok
Lekérdezés feladatok
Tárolt eljárások, függvények, aktív elemek
Tárolt eljárások
Triggerek
Alkalmazás programozói interfészek (API)
PHP
SQLJ
JDBC
ADO.NET
ORM framework-ök, perzisztencia felületek
Hibernate
JPA
LINQ
Működési környezet
Mintaparancsok
3. Animációk

Az ábrák listája

1.1. ER modell
1.2. ER modell
1.3. ER modell
1.4. ER modell
1.5. ER modell
1.6. ER modell
1.7. ER modell
1.8. Hálós modell
1.9. Relációs modell
1.10. Relációs modell
1.11. Relációs modell
1.12. Relációs modell
1.13. UML modell
1.14. ER modell
2.1. ER modell
2.2. ER modell
2.3. ER modell
2.4. ER modell
2.5. ER modell
2.6. ER modell
2.7. ER modell
2.8. EER modell
2.9. EER modell
2.10. EER modell
2.11. EER modell
2.12. Hierarchikus modell
2.13. Hierarchikus modell
2.14. Hierarchikus modell
2.15. Hierarchikus modell
2.16. Hierarchikus modell
2.17. Hierarchikus modell
2.18. Hierarchikus modell
2.19. Hálós modell
2.20. Hálós modell
2.21. Hálós modell
2.22. Hálós modell
2.23. Hálós modell
2.24. Relációs modell
2.25. Relációs modell
2.26. Relációs modell
2.27. Relációs modell
2.28. Relációs modell
2.29. Relációs modell
2.30. Relációs modell
2.31. Relációs modell
2.32. Relációs modell
2.33. Relációs modell
2.34. Relációs modell
2.35. UML diagram
2.36. UML diagram
2.37. UML diagram
2.38. UML diagram
2.39. UML diagram
2.40. Oracle XE telepítő űrlapja: adatbázis jelszavak beállítása
2.41. Oracle XE telepítő űrlapja: bejelentkezés
2.42. Oracle XE telepítő űrlapja: object browser
2.43. Oracle XE űrlapja: tábla létrehozás
2.44. Oracle XE űrlapja: kulcs megadása
2.45. Oracle XE űrlapja: user menedzsment
2.46. Oracle biztonság
2.47. Oracle Label Security

1. fejezet - Feladatok

Tervezési, modellezési feladatok

ER modell készítése

  1. Tervezze meg a VaKer – élelmiszerekkel kereskedő cég raktárhelyeinek ER modelljét. A cég külön raktárakban tárolja a fagyasztott, a hűtött élelmiszereket, az italokat, a zöldségeket, és többi terméket. Minden termék külön vonalkóddal rendelkezik, egy termékből több raktárhelyen is lehet készlet (pl. más-más lejárati dátummal), és az egyes raktárhelyeken többféle termék is lehet. Az egyértelmű azonosíthatóság miatt az egyes raktárakban nem lehetnek egyforma kódú raktárhelyek, és raktárhelyet csak raktárban lehet kialakítani. Előfordulhat olyan eset, amikor néhány raktárhely vagy akár a teljes raktár nem használható, pl. ha elromlik a fagyasztó. A statisztikák miatt szükség lehet az egyes raktárakban lévő, és az egy adott napon betárolt termékek listájára. A termékek mennyiségén kívül tárolni kell a mennyiségi egységet is (darab, kg, liter…).

  2. Tervezze meg a VaKer – élelmiszerekkel kereskedő cég számlázási rendszerének ER modelljét. A számlákon legyen egyedi azonosító, dátum, a pénztáros kódja, a vevő adatai, a vásárolt tételek adatai (terméknév, mennyiség, mennyiségi egység, egységár, tétel összege), és az összár. A vevők adatait tároljuk le.

  3. Tervezze meg a VaKer – élelmiszerekkel kereskedő cég raktári megrendeléseinek ER modelljét. Minden termék külön vonalkóddal rendelkezik, de kategóriákat alkotnak, pl. többféle tej és sajt lehet a tejtermék kategóriában. A rendelésben szerepeljen a rendelésszám, a kiállítás dátuma, a megrendelés határideje, a beszállító adatai, a rendelést készítő dolgozó adatai, és minden megrendelt tételnél a termék neve, mennyiségi egysége és mennyisége. Egy rendelés az egy beszállítótól igényelt termékeket tartalmazza.

  4. Tervezze meg a VaKer – élelmiszerekkel kereskedő cég raktári beszállításainak ER modelljét. Az egyes beszállítások mindig egy beszállítótól érkeznek, a beszállított árukat valamelyik raktáros veszi át. Minden tétel esetén tárolni kell a mennyiséget és az egységárat is. A tételek átvétel és betárolás után növelik a raktári készletet.

  5. Tervezze meg a VaKer – élelmiszerekkel kereskedő cég dolgozói adatbázisának ER modelljét. Vannak fix munkakört betöltő dolgozók, és olyanok is, akik többféle munkakörben is dolgozhatnak. A tervezett és a tényleges munkabeosztást tárolni kell.  Vannak olyan dolgozók, akik fix havibért kapnak (alapbér), több munkakörben viszont az alapbéren felül a ledolgozott órákkal arányos juttatás is jár (órabér alapján). Az egyes dolgozóknál havonta meg kell határozni a ledolgozott munkaidőt, és a fizetést. Szinte minden dolgozónak van céges telefonja, és sok dolgozó használhat céges autót. Akik céges autót használnak útnyilvántartást vezetnek, az autóknál nyilván kell tartani, hogy mikor melyik autót ki vezette.

  6. Tervezze meg a VaKer – élelmiszerekkel kereskedő cég webáruházának ER modelljét. Tárolni kell a megrendelők adatait, a rendelések dátumát, határidejét, tételeit, a rendelést összekészítő és a kiszállítást végző dolgozó azonosítóját. A könnyebb eligazodás miatt a weblapon a termékek kategóriákba vannak sorolva. A rendelést összekészítő dolgozó mindig kiállít egy számlát is, a megrendelő adatai alapján.

  7. Tervezze meg a VaKer – élelmiszerekkel kereskedő cég bolti átszállításának egyszerűsített ER modelljét. Az átszállítási feladatról tárolni kell, hogy ki mikor kezdeményezte, és melyik tételt melyik dolgozó mikor teljesítette. A raktárból kikerült áruk mennyisége a bolti áruk mennyiségét növeli.

EER modell készítése

  1. Tervezze meg a VaKer – élelmiszerekkel kereskedő cég raktárának EER modelljét. A cég külön raktárakban tárolja a fagyasztott és a hűtött élelmiszereket, van egy többszintes raklapos raktár, és polcos, amelynek egy részén kenyereket, másik részén dobozos árukat, harmadik részében zöldségféléket tárolnak. Minden termék külön vonalkóddal rendelkezik, egy termékből több raktárhelyen is lehet készlet (pl. más-más lejárati dátummal), és az egyes raktárhelyeken többféle termék is lehet. Az egyértelmű azonosíthatóság miatt az egyes raktárakban nem lehetnek egyforma kódú raktárhelyek, és raktárhelyet csak raktárban lehet kialakítani. Előfordulhat olyan eset, amikor néhány raktárhely vagy akár a teljes raktár nem használható, pl. ha elromlik a fagyasztó. A statisztikák miatt szükség lehet az egyes raktárakban lévő, és az egy adott napon betárolt termékek listájára. A termékek mennyiségén kívül tárolni kell a mennyiségi egységet is (darab, kg, liter…).

  2. Tervezze meg a VaKer – élelmiszerekkel kereskedő cég dolgozói adatbázisának EER modelljét. Vannak fix munkakört betöltő dolgozók, és olyanok is, akik többféle munkakörben is dolgozhatnak. A tervezett és a tényleges munkabeosztást tárolni kell.  Minden dolgozónak van havi alapbére, több munkakörben viszont az alapbéren felül a ledolgozott órákkal arányos juttatás is jár (órabér alapján). Akik céges autót használnak, azoknak vezetni kell az autóhoz tartozó útnyilvántartást.

  1. Tervezze meg a VaKer – élelmiszerekkel kereskedő cég ajándékkosarainak EER modelljét. Minden ajándékkosár magából a kosárból, a bele kerülő termékekből, és a csomagoláshoz használt díszekből áll. Fontos azt is tárolni, hogy melyik dolgozó, mikor, hány darab, és milyen típusú kosarat készített.

  2. Tervezze meg a VaKer – élelmiszerekkel kereskedő cég számlázási rendszerének EER modelljét. A számlákon legyen egyedi azonosító, dátum, a pénztáros kódja, a vásárolt tételek adatai (terméknév, mennyiség, mennyiségi egység, egységár, tétel összege), és az összár. A cég 3 féle számlát használ:

    1. Egyszerű bolti eladáskor nem kerülnek a vevő személyes adatai a számlára.

    2. Áfás számla, melyet az adószámmal rendelkező vevők igényelnek.

    3. Lakossági számla, melyen nincs adószám, csak kód, név és cím.

Hierarchikus adatmodel készítése

  1. Tervezze meg a VaKer – élelmiszerekkel kereskedő cég dolgozói adatbázisának hierarchikus modelljét. Bizonyos munkakörökhöz autót biztosít a cég, az autó mindig a munkakört betöltő személynél van, akinek útnyilvántartást kell vezetnie. A dolgozóknál nyilván kell tartani a ledolgozott munkaidőt, és szinte minden dolgozónak van céges telefonja.

  2. Tervezze meg a VaKer – élelmiszerekkel kereskedő cég raktári beszállításainak hierarchikus modelljét. Az egyes beszállítások mindig egy beszállítótól érkeznek, az egyes tételek esetén tárolni kell a mennyiséget és az egységárat is. A termékek kategóriákba vannak sorolva, minden termék egy-egy kategóriába tartozik. Készítse el mind a klasszikus mind a fejlettebb változat modelljét.

Konvertálás ER modellről hierarchikusra

  1. Alakítsa át az alábbi ER modellt hierarchikus modellé! Készítse el mind a klasszikus mind a fejlettebb változat modelljét.

    1.1. ábra - ER modell

    ER modell

  2. Alakítsa át az alábbi ER modellt hierarchikus modellé! Készítse el mind a klasszikus mind a fejlettebb változat modelljét.

    1.2. ábra - ER modell

    ER modell

Hálós adatmodell készítése

  1. Tervezze meg a VaKer – élelmiszerekkel kereskedő cég raktárának hálós adatmodelljét. A cég külön raktárakban tárolja a fagyasztott és a hűtött élelmiszereket, a raklapos és a dobozos árukat. Minden termék külön vonalkóddal rendelkezik, egy termékből több raktárhelyen is lehet készlet (pl. más-más lejárati dátummal), és az egyes raktárhelyeken többféle termék is lehet. Az egyértelmű azonosíthatóság miatt az egyes raktárakban nem lehetnek egyforma kódú raktárhelyek. A termékek kategóriákba vannak sorolva, minden termék egy-egy kategóriába tartozik.

  2. Tervezze meg a VaKer – élelmiszerekkel kereskedő cég számlázási rendszerének hálós modelljét. A számlákon legyen egyedi azonosító, dátum, a pénztáros kódja, a vevő adatai, a vásárolt tételek adatai (terméknév, mennyiség, mennyiségi egység, egységár, tétel összege), és az összár. A dolgozóknál több telefonszám is lehet, a vevő címe összetett érték.

  3. Tervezze meg a VaKer – élelmiszerekkel kereskedő cég autóflotta nyilvántartási rendszerének hálós modelljét. Az autókhoz különböző események tartoznak (kötelező szerviz, hibajavítás, gumicsere), mely munkálatokat különböző szervizekben szoktak elvégeztetni. A kötelező szervizek esedékességét a vezetett útnyilvántartásokból lehet kideríteni. Az útnyilvántartást havonta adják le a sofőrök, de közben nemcsak egy, hanem több autót is használhatnak.

Konvertálás ER modellről hálósra

  1. Alakítsa át az alábbi ER modellt hálós modellé!

    1.3. ábra - ER modell

    ER modell

  2. Alakítsa át az alábbi ER modellt hálós modellé!

    1.4. ábra - ER modell

    ER modell

Relációs adatmodell készítése

  1. Tervezze meg a VaKer – élelmiszerekkel kereskedő cég tanfolyamainak relációs adatmodelljét. A dolgozóknál kódjukon és nevükön kívül tároljuk a végzettségeiket is. A tanfolyamokat több témában tartják, egy-egy témából különböző időpontokban és általában más helyszínen többet is. Egy tanfolyamot általában több oktató tart, bizonyos oktatók több tanfolyamban is részt vesznek. Az oktatóknál nevükön és kódjukon kívül tároljuk címüket is, ami összetett tulajdonság. Adja meg a relációk sémáját is.

  2. Tervezze meg a VaKer – élelmiszerekkel kereskedő cég raktárának relációs adatmodelljét. A cég külön raktárakban tárolja a fagyasztott és a hűtött élelmiszereket, a raklapos és a dobozos árukat. Minden termék külön vonalkóddal rendelkezik, egy termékből több raktárhelyen is lehet készlet (pl. más-más lejárati dátummal), és az egyes raktárhelyeken többféle termék is lehet. Az egyértelmű azonosíthatóság miatt az egyes raktárakban nem lehetnek egyforma kódú raktárhelyek. A termékek kategóriákba vannak sorolva, minden termék egy-egy kategóriába tartozik. A készlet mellett tárolni kell a betárolási és a lejárati dátumot. Adja meg a relációk sémáját is.

  3. Tervezze meg a VaKer – élelmiszerekkel kereskedő cég számlázási rendszerének relációs adatmodelljét. A számlákon legyen egyedi azonosító, dátum, a pénztáros kódja, a vevő adatai, a vásárolt tételek adatai (terméknév, mennyiség, mennyiségi egység, egységár, tétel összege), és az összár. Adja meg a relációk sémáját is.

  4. Tervezze meg a VaKer – élelmiszerekkel kereskedő cég raktári megrendeléseinek relációs adatmodelljét. Minden termék külön vonalkóddal rendelkezik, de kategóriákat alkotnak, pl. többféle tej és sajt lehet a tejtermék kategóriában. A rendelésben szerepeljen a rendelésszám, a kiállítás dátuma, a megrendelés határideje, a beszállító adatai, a rendelést készítő dolgozó adatai, és minden megrendelt tételnél a termék neve, mennyiségi egysége és mennyisége. Egy rendelésben több beszállító is részt vehet.

Konvertálás ER modellről relációsra

  1. Alakítsa át az alábbi ER modellt relációs modellé!

    1.5. ábra - ER modell

    ER modell

  2. Alakítsa át az alábbi ER modellt relációs modellé!

    1.6. ábra - ER modell

    ER modell

  3. Alakítsa át az alábbi ER modellt relációs modellé!

    1.7. ábra - ER modell

    ER modell

Normalizálás

  1. Normalizálja az alábbi sémát 3NF-ig: R(X,Y,Z,Q,W) ahol Y → W, X → (Q,Z), Z → Y.

  2. Normalizálja az alábbi sémát BCNF-ig: R(A,B,C,D,E) ahol C→E, A→D, E→B, (A,E)→A.

  3. Normalizálja az alábbi sémát BCNF-ig: R(X,Y,Z,Q,R,S) ahol (Y,Q) → Y , Q → Z, Y → S,  (Y,Q) → R, S → X.

  4. Normalizálja az alábbi sémát BCNF-ig: R(A,B,C,D,E,F) ahol A → C, E → B, C → (F,C),  (A,E) → D.

  5. Normalizálja az alábbi sémát BCNF-ig: R(A,B,C,D,E) ahol A → B, A → C, B → A,  B → C, C → D, D → E.

Lekérdezési feladatok a hálós adatmodellben

Adott a következő hálós adatmodell, a feladatokat ezen kell megoldani!

1.8. ábra - Hálós modell

Hálós modell

  1. Mely raktárhelyeken van 10000 Ft-nál drágább termék?

  2. Mely raktárhelyeken mekkora mennyiség van a Gumikolbász nevű termékből?

  3. Hányféle termék van az A40-es raktárhelyen?

  4. Mekkora értékű készlet van az A40-es raktárhelyen?

Relációs algebra

Adott a következő relációs modell, a feladatokat ezen kell megoldani.

Magyarázat: a projektek egy havi időtartamúak, általában minden hónapban újraindulnak, így a dátum mindig az adott hónap első napja. A projektben a Tbér az egy havi teljesítménybér.

1.9. ábra - Relációs modell

Relációs modell

  1. Adja meg az osztályok nevét!

  2. Adja meg a könyvelés dolgozóinak nevét, alapbérét!

  3. Hány Osztály van?

  4. Hányan dolgoznak a könyvelésen?

  5. Kik vettek részt a 2010 májusi raktártakarítás projektben?

  6. Adja meg a legnagyobb teljesítménybérű projektben részt vevők nevét!

  7. Kik nem vettek még részt projektben?

  8. Összesen mennyibe került már a fásítás projekt?

  9. Hányan vettek részt a 2010 májusi projektekben projektenként?

  10. Ki vett részt már legalább ötször projektekben?

A relációk ugyanazok, de a mezőnevek megváltoztak!

1.10. ábra - Relációs modell

Relációs modell

  1. Adja meg a könyvelés dolgozóinak nevét, alapbérét!

  2. A pénztárosok mely projektekben vettek részt 2010 májusában?

  3. Mennyi volt a fizetése Kiss Dezsőnek 2010 májusában?

  4. Az egyes osztályokon hány miskolci dolgozó van?

  5. Az egyes projekteken dolgozóknak mennyi az átlagéletkora?

  6. Van olyan projekt, amelynek neve megegyezik egy osztály nevével?

  7. Ki (név és osztály) és mikor vett részt fásítás projekten?

  8. A projekteken részt vettek közül kinek a legmagasabb az alapbére?

  9. Ki hány projekten vett már részt?

  10. Adja meg annak a dolgozónak a nevét, aki 2010 májusában az alapbére felénél több jövedelmet szerzett projektekből!

SQL feladatok

DDL (Data Definition Language) parancsok

A feladatokat az alábbi modellnek megfelelően kell megoldani.

Magyarázat: a projektek egy havi időtartamúak, általában minden hónapban újraindulnak, így a dátum mindig az adott hónap első napja. A projektben a Tbér az egy havi teljesítménybér, az aktív mező értéke I vagy N lehet. Ha I, akkor fel lehet iratkozni rá.

1.11. ábra - Relációs modell

Relációs modell

  1. Hozza létre a táblákat!

    A projekt táblában a tbér értéke nem érheti el a 30000 Ft-ot, az aktív mezőbe pedig csak az I és az N betűket lehessen bevinni. A Dolgozó táblában a kor 18 és 62 év közötti lehet, az alapbér pedig nem lehet 85000-nél kevesebb. A Résztvesz táblában írjuk elő, hogy egy dolgozó egy projektre egy adott hónapban csak egyszer jelentkezhessen.

  2. A vezetés úgy dönt, hogy  ne a dátumot tároljunk a Résztvesz táblában, hanem számként az évet és a hónapot. Törljük a táblát, és hozzuk létre ennek megfelelően. Alakítsuk úgy ki a hónap mezőt, hogy csak a hónapoknak megfelelő számok kerülhessenek bele.

    1.12. ábra - Relációs modell

    Relációs modell

  3. Írjunk elő olyan megszorítást, hogy az év 2011 és 2020 között lehessen!

  4. Miután megoldottuk, újabb vezetői döntés: az év inkább 2010 és 2020 között lehessen!

  5. Írjon elő olyan feltételt, hogy egy projektre maximum négyen jelentkezhessenek.

  6. Írja elő azt a feltételt is, hogy csak aktív projektre lehessen jelentkezni!

DML (Data Manipulation Language) parancsok

  1. Vigye fel az alábbi adatokat az osztály táblába:

    b01-Bolt, b02-Bérügy, s01-Számlázás, s02-Szállítás, r01-Raktár.

  2. Mi az eredménye a következő parancsoknak? Működnek? Hibásak? Miért?

    1. insert into Osztály values('b01', 'Beszerzés');

    2. insert into Osztály values('b03');

    3. insert into Osztály values('b03',’’);

    4. insert into Osztály values('b03', null);

    5. insert into Osztály (Kód) values('b04');

  3. Vigyen be minden táblába néhány rekordot!

  4. Kiadjuk egymás után a következő három parancsot:

    1. insert into Dolgozó values('d66', 'Barna Barna', null, 'számlázó', 31, 180000, 's01');

    2. insert into Dolgozó (Kód, Név, Beosztás, Kor, Alapbér, Oszt) values('d67', 'Fehér Hannibál', 'számlázó', 31, 180000, 's01');

    3. update dolgozó set Város='Miskolc' where Város is null;

    Kérdések:

    1. Az update parancs hatására mindkét rekordban megváltozik a város Miskolcra?

    2. Hogyan lehet a d25 és a d32 közötti kódú rekordokban kijavítani a várost Miskolcra?

    3. Hogyan lehet kitörölni Kék Alma rekordjából a várost?

    4. Hogyan lehet évváltáskor mindekinél a kort megnövelni 1-el?

    5. Mindig, minden rekordra működik az előző parancs?

    6. Hogyan lehet kitörölni Kék Alma rekordját?

    7. Bármikor ki lehet törölni Kék Almát?

DQL (Data Query Language) parancsok

  1. Adja meg a következő lekérdezéseket megvalósító SQL parancsokat!

    1. A nem Béla keresztnevű raktárosok vagy eladók neve

    2. Hány olyan dolgozó van, akinek a kódjában a középső karakter 2-es?

    3. A 2010 3. negyedévében futó projektek neve (egy név csak egyszer szerepeljen!)

    4. Osztályok és dolgozóik neve, abc sorrendben

    5. A 04-re vagy 07-re végződő kódú 30-as korú dolgozók neve, alapbére, alapbér szerinti csökkenő sorrendben

  2. Adja meg a következő lekérdezéseket megvalósító SQL parancsokat!

    1. A bérügy dolgozóinak neve, éves alapfizetése

    2. Az összes különböző beosztás kiírása (csak létező beosztások!)

    3. A raktáros beosztásúak átlag alapbére

    4. A nem miskolci dolgozók száma, városonként csoportosítva

    5. A legmagasabb alapbérű dolgozó(k) neve, alapbére

  3. Mi az eredménye a következő SQL parancsoknak?

    1. Select osztály.név, avg(alapbér) from osztály, dolgozó where oszt=Osztály.kód group by osztály.név order by avg(alapbér);

    2. select dolgozó.név from dolgozó, résztvesz, projekt where dolg=dolgozó.kód and proj=projekt.kód and projekt.név='Fásítás';

    3. select név from dolgozó where név not in(select dolgozó.név from dolgozó, résztvesz, projekt where dolg=dolgozó.kód and proj=projekt.kód and projekt.név='Fásítás');

    4. select osztály.név, projekt.név from osztály, dolgozó, résztvesz, projekt where oszt=osztály.kód and dolg=dolgozó.kód and proj=projekt.kód and év=2010 and hónap=12 group by osztály.név, projekt.név;

    5. Select dolgozó.név, sum(tbér)+sum(alapbér)/count(alapbér) from dolgozó, résztvesz, projekt where dolg=dolgozó.kód and proj=projekt.kód and év=2010 and hónap=12 group by dolgozó.név;

  4. Adja meg a következő lekérdezéseket megvalósító SQL parancsokat!

    1. Azon osztályok neve és létszáma, ahol 10-nél kevesebben dolgoznak

    2. A legmagasabb átlagos alapbérű osztály neve, és átlag alapbére

    3. Az egyes osztályokon hány 300000 Ft-nál többet kereső személy van

    4. Az egyes projektekre hányszor jelentkeztek (kellenek azok a projektek is, amelyekre még sosem jelentkeztek!)

    5. Kék Alma az egyes projektekre hányszor jelentkezett (kellenek azok a projektek is, amelyekre még sosem jelentkezett!)

    6. Ki hány projektekre jelentkezett már (azok neve is kell, akik még nem jelentkeztek sosem projektre!)

    7. Az egyes osztályokról hányszor jelentkeztek már projektre (azon osztályok neve is kell, ahonnan még sosem jelentkeztek projektre!)

DCL (Data Control Language) parancsok

  1. Adja meg a szükséges SQL parancsokat!

    1. Engedélyezze Péter5-nek, hogy lekérdezzen a dolgozó táblából.

    2. Engedélyezze mindenkinek a lekérdezést a dolgozó táblából.

    3. Engedélyezze a beszúrást és a módosítást Péter5-nek a projekt és a résztvesz táblára.

    4. Vonja vissza a beszúrás jogot a projekt tábla esetén Péter5-től.

    5. Tiltsa le Péter5 minden jogát a résztvesz táblával kapcsolatban.

    6. Engedélyezze Péter5-nek, hogy lekérdezzen a résztvesz táblából.

OO modellezés

UML osztály diagram feladatok

  1. Készítsen UML diagramot járművek és tulajdonosok kapcsolati sémájának leírására.

  2. Készítsen UML diagramot járművek specializációs kapcsolati sémájának leírására

  3. Készítsen UML diagramot egy csomagküldő szolgálat sémájának leírására

  4. Készítsen UML diagramot egy hallgatói index és eredmény nyilvántartásra

  5. Értelmezze az alábbiakban megadott UML folyamatdiagramot (3.1.1 ábra)

  6. Készítsen UML folyamatdiagramot egy termékrendelés felvételre, ahol ellenőrizni kell, hogy az ügyfél megbízható-e és van-e elegendő darabszám a készletben

1.13. ábra - UML modell

UML modell

ODL modellezés

  1. Értelmezze az alábbiakban megadott séma definíciót (3.2.1 lista).

  2. Készítsen adattagot egy hónapot tároló osztályban a napok átlaghőmérséklet értékeinek tárolására.

  3. Hozzon létre egy diákot leíró osztályt.

  4. Egészítse ki a diák osztályt úgy, hogy a diákok halmazában lehessen lekérdezést végezni.

  5. Készítsen egy érdemjegy nyilvántartó osztályt a létező diák oszály mellé, melyhez kezelő metódusokat is definál.

  6. Készítsen ODL sémát egy könyv/CD/DVD terjesztő cég termékválasztékának és rendelés nyilvántartásának leírására.

  7. Hozzon létre adatmodellt könyv, kiadó és szerző osztályokkal

         
   INTERFACE hallgató {
      STRUCT cím { STRING kollégium, STRING szoba };
      
      ATTRIBUTE STRING név;
      ATTRIBUTE cím elérés;
   
      RELATIONSHIP SET < szak> tanulja
        INVERSE szak::hallgatja;
      
      EXCEPTION kurzus_tele();
      EXCEPTION nem_lézet#_kurzus ();
      
      BOOLEAN regisztrál ( IN SHORT kurzus, IN SHORT szak)
         RAISES (kurzus_tele, nem_lézet#_kurzus);
   }
   
   CLASS oktato {
   
      ATTRIBUTE STRING tanszék;
      ATTRIBUTE ENUM beosztás (tanár,docens, adjunktus, tanársegéd);
   
      RELATIONSHIP SET<kurzus> tanit;
   }
   
   CLASS doktorandusz EXTENDS oktato : hallgató
      ( EXTENT doktoranduszok)
   {
      ATTRIBUTE STRING név;
      ATTRIBUTE cím elérés;
      ATTRIBUTE SHORT oraszam;
      
      RELATIONSHIP SET <szak> tanulja
         INVERSE szak::hallgatja;
   
      BOOLEAN regisztrál ( IN SHORT kurzus, IN SHORT szak)
         RAISES (kurzus_tele, nem_lézet#_kurzus);
   }
         

3.2.1 lista

OQL műveletek

  1. Adja meg a könyv sémára vonatkozólag a 2004-ben kiadott könyvek cimeit visszaadó lekérdezést. (3.3.2 lista)

  2. Kérdezze le a könyv sémára vonatkozólag, hogy van-e 2003-ben kiadott könyv.

  3. Kérdezze le a könyv sémára vonatkozólag, hogy vajon minden könyv 2000 után lett-e kiadva.

  4. Kérdezze le a könyv sémára vonatkozólag, mennyi a könyvek átlagára.

  5. Kérdezze le a könyv sémára vonatkozólag, mennyi a 2002 előtt kiadott könyvek átlagára.

  6. Kérdezz ele a könyv sémára vonatkozólag, melyek az átlagárnál drágább könyvek címei és kiadásuk évei.

  7. Adja meg a könyv sémára vonatkozólag, a könyvek adatait év szerinti csoportban.

  8. Adja meg a könyv sémára vonatkozólag, a könyvek címei ár szerint növekvő sorrendben..

  9. Adja meg a könyv sémára vonatkozólag, az azonos országbeli kiadók és szerzők neveit

  10. Adja meg a könyv sémára vonatkozólag, a 2004-ben kiadott könyvek szerzőinek neveit.

  11. Adja meg a könyv sémára vonatkozólag azon magyarországi kiadókat, melyek adtak ki 2004-ben könyvet.

  12. Adja meg a könyv sémára vonatkozólag, mely kiadók nem adtak ki könyvet 2004-ben.

  13. Adja meg a könyv sémára vonatkozólag, a kiadók neveit és a 2004-ben kiadott könyveik darabszámát.

  14. Adja meg a könyv sémára vonatkozólag, azon országok és kiadóik darabszámát, amelyben legalább 3 kiadó van.

   CLASS könyv
      ( EXTENT könyvek)
   {
      ATTRIBUTE STRING cím;
      ATTRIBUTE SHORT év;
      ATTRIBUTE FLOAT ár;
   
      RELATIONSHIP kiadó kiadta INVERSE kiadé.kiadványok;
      RELATION SET < szerz# > szerz#k INVERSE szerz#.m#vek
   }
         

3.3.2 lista

Oracle adatbázis ORDBMS műveletek

  1. Készítsen egy lakcím leíró T_LAKCIM osztályt, amely a fontosabb postai cím komponenseket tartalmazza.

  2. Szüntesse meg az előzőleg létrehozott T_LAKCIM osztályt.

  3. Hozzon létre egy emberek táblát, melyben szerepelnek a név, születési év és lakcím mezők. Ez utóbbi adattípusa legyen a T_LAKCIM osztály.

  4. Vigyen fel egy új rekordot a dolgozok táblába.

  5. Listázza ki a dolgozók nevét és a városukat, város szerinti sorrendben.

  6. Kérdezze le a dogozók létszámát városonkénti bontásban.

  7. Hozzon létre egy t_ember osztályt, melyben adattagként szerepel a név, születési év, igazolványszám és lakcim.

  8. Hozzon létre egy táblát, amely t_emberek típusú objektumokat tartalmaz.

  9. Vigyen fel egy új embert a emberek táblába.

  10. Kérdezze le az ember objektumok OID-jét és az objektumban tárolt ember nevét.

  11. Módosítsa az IG1 igazolványszámú ember lakcímét egy új értékre.

  12. Hozzon létre egy t_ember osztályt, melyben adattagként szerepel a név, születési év, igazolványszám és lakcim. A létrehozott osztályhoz később leszármazott osztályokat kívánunk majd létrehozni.

  13. Hozzon létre egy t_ugyfel osztályt, amely a t_ember osztályból származik, és tartalmaz ügyfékód és ügyféltipus valamint belepési dátum adattagokat

  14. Hozza létre az ügyfelek objektumainak tábláját.

  15. Vigyen fel egy új ügyfél objektumot az ügyfelek táblába.

  16. Kérdezze le az ügyfelek létszámát városonként.

  17. Hozzon létre olyan t_ugyfelek osztályt, amely ügyfelek halmazát tartalmazza.

  18. Hozzon létre egy ügyek táblát, melyben az ügy paraméterei között szerepel az érintett ügyfelek listája.

  19. Vigyen fel egy új rekordot az ügyek táblába.

  20. Listázza ki a 'Macskavita' leírású ügy ügyfeleinek nevét és városát.

  21. Vegye ki az IG3-as kódú személyt az 1-es kódú ügyek ügyfelei közül (ügyfél kitörlése az ügyfelek listájából)

  22. Vigyen fel egy új ügyfelet az 1-es kódú ügyhöz.

  23. Hozzon létre egy olyan panaszok táblát, ahol a panasz benyújtó ügyfélre hivatkozás tárolódik.

  24. Vigyen fel egy új rekordot a panaszok táblába, melynek ügyfele a Zoltan nevű ügyfél.

  25. Kérdezzük le a panaszok leírását és az ügyfél nevét.

  26. Kérdezze le a ugyek leírását a részvevő nevével egy eredmény táblázatba.

  27. Definiálon egy olyan osztályt, amely ügyfelekre történő hivatkozások listáját tartalmazza.

  28. Hozzon létre egy olyan panaszok táblát, ahol több hivatkozott ügyfél is lehet.

  29. Vigyen fel egy új panasz rekordot.

  30. Vigyen fel olyan új panasz rekordot, amelyhez nem tartozik ügyfél.

  31. Addjon egy új ügyfelet egy panaszhoz.

  32. Listázzi ki a panaszok leírását és az ügyfeleinek létszámát.

  33. Adja meg a panaszok leírását és az ügyfelek nevét egy tábláztban.

  34. Listázza ki az ügyfelekénti panaszok darabszámát.

  35. Hozzon létre olyan t_ember leszármaztatható osztályt, melyhez tartozik két lekérdező metódus. Az egyik metódus az életkort, másik a lakcímet adja vissza.

  36. Hozza létre az emberek táblát és vigyen fel rekordokat.

  37. Listázza ki az emberek nevét, életkorát és lakcímét.

  38. Készítsen t_ugyfel osztályt az alábbi metódusokkal: pénz_felvétel, pénz_behelyzés és hitelbírálat.

DBMS telepítés, karbantartás

MySQL adatbáziskezelő

  1. Ismertesse a mySQL  adatbázis-kezelő telepítési folyamatát!

  2. Ismertesse a mySQL adatbázis megvalósulási típusait.

  3. Ismeretesse a felhasználó kezelésének fontosabb parancsait

  4. Hozzon létre egy tanfolyam adatbázist.

  5. Hozzon létre egy kurzus innoDB típusú adattáblát a tanfolyam adatbázisban, a mezők között szerepeljen a megnevezés, létszám adatok, kezdés ideje és a díjadatok.

  6. Hozzon létre egy OKTATÓ adattáblát, melyen rekordszintű zárolás hajtható végre. Adja meg a tábla szerkezetében a név, személy igazolvány, email, születési idő és lakcím mezőket.

  7. Készítsen Hallgató, és kurzus_oktató, kurzus_hallgató kapcsoló táblákat.

  8. Kérdezze le milyen adattáblák vannak az aktuális adatbázisban.

  9. Kérdezze le a Hallgató tábla szerkezetét.

Oracle adatbáziskezelő

  1. Ismertesse az Oracle adatbázis-kezelő fajtáit!

  2. Ismertesse az Oracle adatbázis-kezelő telepítési folyamatát!

  3. Ismertesse az adatbázis létrehozásának folyamatát Oracle adatbázis-kezelőben!

  4. Ismertesse a táblák kezelését Oracle adatbázis-kezelőben!

  5. Ismertesse a felhasználók kezelésének, karbantartásának folyamatát Oracle adatbázis-kezelőben!

  6. Ismertesse az Oracle adatbázis-kezelő védelmi mechanizmusait!

  7. Ismertesse az adatbázis mentések, import, export folyamatát Oracle adatbázis-kezelőben!

PL/SQL

PL/SQL blokk feladatok

  1. Ismertesse a PL/SQL blokk általános szerkezetét!

  2. Írjon egy oylan PL/SQL programot ami kiírja a kimenetre hogy "Hello World"!

  3. Írjon egy olyan PL/SQL programot amely összead két számot és kiírja a kimenetre!

  4. Írjon egy olyan PL/SQL programot amely összeszoroz két számot és kiírja a kimenetre!

  5. Írjon egy olyan PL/SQL programot amely kiírja a "Hello World" szöveget csupa nagy illetve kis betűkkel a kimenetére!

  6. Írjon egy olyan PL/SQL programot amely összefűzve kiírja a kimenetére a "Hello " és a "World" string-eket!

  7. Írjon egy olyan PL/SQL programot amely kiírja az aktuális rendszeridőt!

  8. Írjon egy olyan PL/SQL programot amely kiírja a rendszeridőt 'YYYY-MM-DD' formátumban!

  9. Írjon egy olyan PL/SQL programot amely lekérdezi a vásárlók neveit és letárolja a megfelelő típusba %type segítségével!

  10. Írjon egy olyan PL/SQL programot amely lekérdezi egy vásárló adatait és letárolja az adatokat a megfelelő %type típusú változókba!

  11. Írjon egy olyan PL/SQL programot amely lekérdezi egy adott vásárló rekordot és letárolja egy %rowtype típusú változóba!

Vezérlési szerkezet feladatok

  1. Ismertesse az IF szerkezetet!

  2. Írjon egy olyan PL/SQL programot amely eldönti két szám közül hogy melyik a nagyobb!

  3. Írjon egy olyan PL/SQL programot amely eldönti egy számról hogy bele esik e két másik szám által megadott intervallumba!

  4. Ismertesse a Swith Case szerkezetet!

  5. Írjon egy olyan PL/SQL programot amely a beosztás rövidítése alapján megadja, a dolgozó teljes beosztását!

  6. Írjon egy olyan PL/SQL programot amely eldönti három számról hogy alkothat e háromszöget!

  7. Írjon egy olyan PL/SQL programot amely a háromszög három oldala ismeretében kiszámolja a területét a Heron képlet segítségével!

  8. Ismertesse a Loop ciklust PL/SQL-ben!

  9. Ismertesse a While ciklust PL/SQL-ben!

  10. Ismertesse a For ciklust PL/SQL-ben!

  11. Írjon egy olyan PL/SQL programot amely kiírja 1-től n-ig a számokat!

  12. Írjon egy olyan PL/SQL programot amely kiírja az első n darab Fibonacci számot!

  13. Írjon egy olyan PL/SQL programot amely eldönti egy n számról hogy prím szám e!

Hibakezelés feladatok

  1. Soroljon fel néhány gyári kivételt a PL/SQL-ben!

  2. Írjon egy olyan PL/SQL programot amely ZERO_DIVIDE kivételt dob!

  3. Írjon egy olyan PL/SQL programot amely ZERO_DIVIDE kivételt dob és lekezeli!

  4. Írjon egy olyan PL/SQL programot amelyben saját kivételt definiál és kezel ( a kivétel akkor keletkezzen ha a szám páros )!

  5. Írjon egy olyan PL/SQL programot amelyben egy CURSOR-t kétszer akar megnyitni és kivétel keletkezik

Lekérdezés feladatok

Eredmények tárolása változókban

  1. Írjon egy olyan PL/SQL programot amelyben a vásárló nevét egy változóba tárolja, adja meg a hiba lehetőségét!

  2. Írjon egy olyan PL/SQL programot amely a vásárló nevét tárolja le %type típusú változóba, hasonlítsa össze az előző példával a jelen példát!

  3. Írjon egy olyan PL/SQL programot amelyben több mezőt is kinyer a %type típusú változókba!

  4. Írjon egy olyan PL/SQL programot amelyben a lekérdezés eredményét egy %rowtype változóba tárolja le!

  5. Írjon egy olyan PL/SQL programot amely lekérdezi hogy egy adott vásárló aktív e, vegye észre, hogy a megadott típus nem Boolean és a mezőnek Boolean-t kéne visszaadnia!

  6. Írjon egy olyan PL/SQL programot amely az előző példát valósítja meg, de az aktív mező szám érétket kap!

  7. Írjon egy olyan PL/SQL programot amely egyszerre használ %type és más típust egy lekérdezésben!

  8. Ismertesse a SELECT  szerkezetét a PL/SQL blokkban!

Kurzorkezelés

  1. Ismertesse a CURSOR definiálás formalizmusát!

  2. Ismertesse a paraméteres CURSOR definiálás formalizmusát!

  3. Írjon egy olyan PL/SQL programot amely cursor segítségével lekérdezi a vásárlók tábla adatait!

  4. Írjon egy olyan PL/SQL programot amely lekérdezi az aktív vásárlók adatait!

  5. Írjon egy olyan PL/SQL programot amely lekérdezi a vásárlók adatait és FOR ciklus segítségével dolgozza fel a CURSOR-t!

  6. Írjon egy olyan PL/SQL programot amely lekérdezi a paraméterként adott aktivitású vásárlók adatait!

Módosítható kurzorok

  1. Ismertesse a módosítható CURSOR definiálását!

  2. Ismertesse a módosítás parancsát módosítható CURSOR segítségével!

  3. Írjon egy olyan PL/SQL programot amely az inaktív vásárlók nevét 'Lajhar Lajos'-ra módosítja!

  4. Írjon egy olyan PL/SQL programot amely a Lajosok nevét átalakítja LajosX-re ahol X a sorszám!

Tárolt eljárások, függvények, aktív elemek

Az eljárások, függvények használatához használja a következő adatbázis tervet:

1.14. ábra - ER modell

ER modell

Tárolt eljárások, függvények

  1. Hozzon létre PL/SQL csomagot, amely a „vevő” táblát kezeli: adatfelvitelt, adatmódosítást, adattörlést valósítson meg!

  2. Hozza létre a csomagtörzset az 6.1.1/1. feladatban létrehozott csomaghoz!

  3. Hozzon létre PL/SQL csomagot, amely a „szolgáltató” táblát kezeli: adatfelvitelt, adatmódosítást, adattörlést valósítson meg!

  4. Hozza létre a csomagtörzset az 6.1.1/3. feladatban létrehozott csomaghoz!

  5. Hozzon létre PL/SQL csomagot, amely a „mobiltelefon” táblát kezeli: adatfelvitelt, adatmódosítást, adattörlést valósítson meg!

  6. Hozza létre a csomagtörzset az 6.1.1/5. feladatban létrehozott csomaghoz!

  7. Hozzon létre PL/SQL csomagot, amely a „tel” táblát kezeli: adatfelvitelt, adatmódosítást, adattörlést valósítson meg!

  8. Hozza létre a csomagtörzset az 6.1.1/7. feladatban létrehozott csomaghoz!

  9. Hozzon létre PL/SQL csomagot, amely az „elégedettség” kapcsoló táblát kezeli: adatfelvitelt, adatmódosítást, adattörlést, elégedettség jelleg lekérdezést valósítson meg!

  10. Hozza létre a csomagtörzset az 6.1.1/9. feladatban létrehozott csomaghoz!

  11. Hozzon létre PL/SQL csomagot, amely az „árusít” kapcsoló táblát kezeli: adatfelvitelt, adatmódosítást, adattörlést valósítson meg!

  12. Hozza létre a csomagtörzset az 6.1.1/11. feladatban létrehozott csomaghoz!

  13. Írjon tárolt eljárást, amely beszúr egy rekordot a vevő táblába a 3 kötelező mezőt kitöltve!

  14. Írjon tárolt eljárást, amely a vevők neveit átírja csupa nagybetűsre, majd hívja meg az eljárást!

  15. Írjon tárolt eljárást, amely kilistázza és megszámolja az adatbázisban szereplő szolgáltatókat!

  16. Írjon tárolt eljárást, amely a 25000 Ft-nál olcsóbb telefonok árát 20%-kal megnöveli!

  17. Írjon tárolt függvényt, amely visszaadja a legdrágább telefon árát!

  18. Írjon függvényt, amely visszaadja a paraméterében kapott vevő nevéhez tartozó e-mail címet!

  19. Írjon függvényt, mely visszaadja, hogy egy paraméterül átadott azonosítójú szolgáltatóval mennyire elégedettek a vevők!

  20. Írjon függvényt, mely visszaadja, hogy egy adott típusú mobiltelefont hány szolgálató árusít!

  21. Írjon függvényt, mely visszaadja, hogy a vevők hány százaléka elégedett szolgáltatójával!

Triggerek

  1. Hozzon létre triggert, amely naplózza a NAPLO (dátum, esemény) táblába, ha új rendelés érkezik be.

  2. Futtasa le az előző feladatban létrehozott triggert.

  3. Naplózza egy NAPLO (szoveg) táblába, ha hozzáférés történik a dolgozó törzstáblához.

  4. Módosítsa az első feladat megoldását úgy, hogy az esemény leírásában szerepeljen a termék kódja is (rendeles tábla termek mezője).

  5. Oldja meg triggerel, hogy amennyiben egy raktár egy rekesze blokkolt állapotba kerül (STATUS mező = 'B'), akkor az oda allokált termék csomagok is blokkolt státuszba kerüljenek.

  6. Hozzon létre olyan triggert, amely nem engedi, hogy 100000 alatt legyen valamelydolgozónak a fizetése.

  7. Készítsen triggert, mely azt felügyeli, hogy az dolgozók jövedelmét nem lehet 50000 Ft-nál nagyobb értékkel növelni.

  8. Írjon olyan triggert, amely nem engedi, hogy egy számlafejhez 10-nél több tétel tartozzon.

  9. Készítsen triggert, melynek feladata, hogy új fizetés érték esetén automatikusan kiszámítja az adó értékét. Az adó értékét egy adoszamitas nevű tárolt eljárás határozza meg.

  10. Hozzon létre triggert, mely nem enged 1000-nél kisebb, illetve 10000-nél nagyobb értéket felvinni a termék ár mezőjébe. Hibakezelésen keresztül állítsa be a mező érvényes értékét.

  11. Készítsen triggert, amely 10% kedvezményt ad a rendelési árból, ha a rendelésértéke nagyobb mint 10000 Ft.

  12. Készítsen triggert, amely 10% kedvezményt ad a rendelési árból, ha a vevő eddigi összrendelés értéke nagyobb mint 100000 Ft.

  13. Készítsen VIEW-t az összetartozó dolgozó és üzem nevek megjelenítésére. Eztután készítsen olyan triggert, anely ezen VIEW-ra kiadott INSERT parancsot átviszi az üzemre és dolgozóra. Az új rekordok kulcsérétkét egy-egy szekvenciából vegye át.

  14. Ne engedjen kitörölni számla rekordot, ha státusza már F értékű.

  15. Ha egy vevőrekordot törölnek, elótte számolja ki az eredő tartozását az egyes rendeléseket összesítve, és írja ki egy ADOSAG nevű álományba a kapott értéket.

  16. Készítsen triggert, amely gondoskodik arról, hogy a rendelési tételek alapján a termékhez tartozó összrendelés érték aktuális érték maradjon a rendelés tábla módosulása után is.

  17. Készítsen DDL triggert a séma műveletek naplózására.

Alkalmazás programozói interfészek (API)

PHP

Kapcsolat felvétel, adatbázis kiválasztás

  1. Kapcsolódjon MySQL adatbáziskezelőhöz!

  2. Kapcsolódjon Oracle adatbáziskezelőhöz!

  3. Kapcsolódjon a minta adatbázishoz, amelyet MySQL adatbáziskezelő kezel!

  4. Kapcsolódjon a minta adatbázishoz, amelyet Oracle adatbáziskezelő kezel!

DML műveletek

  1. Vigyen fel egy új vevőt MySQL DBMS-t használva!

  2. Vigyen fel egy új vevőt Oracle DBMS-t használva!

  3. Módosítson egy szolgátatót MySQL DBMS-t használva!

  4. Módosítson egy szolgáltatót Oracle DBMS-t használva!

  5. Töröljön egy mobiltelefont MySQL DBMS-t használva!

  6. Töröljön egy mobiltelefont Oracle DBMS-t használva!

  7. Vigyen fel paraméteresen egy vevőt MySQL DBMS-t használva!

  8. Vigyen fel paraméteresen egy vevőt Oracle DBMS-t használva!

  9. Módosítson paraméteresen egy szolgátatót MySQL DBMS-t használva!

  10. Módosítson paramétersen egy szolgáltatót Oracle DBMS-t használva!

  11. Töröljön paraméteresen egy mobiltelefont MySQL DBMS-t használva!

  12. Töröljön paraméteresen egy mobiltelefont Oracle DBMS-t használva!

Lekérdezések, kurzor-kezelés

  1. Listázza ki a vevőket a képernyőre MySQL DBMS-t használva!

  2. Listázza ki a vevőket a képernyőre Oracle DBMS-t használva!

  3. Listázza ki a Miskolci szolgáltatókat a képernyőre MySQL DBMS-t használva! A várost paraméteresen adja meg!

  4. Listázza ki a Miskolci szolgáltatókat a képernyőre Oracle DBMS-t használva! A várost paraméteresen adja meg!

Tárolt eljárás-, függvényhívások

  1. Vigyen fel egy vevőt a vevo csomag megfelelő tárolt eljárásával Oracle-ben!

  2. Töröljön egy szolgáltatót paraméteresen a szolgáltató csomag megfelelő tárolt eljárását meghívva Oracle-ben!

  3. Módosítson egy mobiltelefont a mobiltelefon csomag megfelelő eljárását meghívva Oracle-ben!

  4. Hívja meg az elégedett tárolt függényt majd írja ki az eredményt képernyőre!

SQLJ

  1. Készítsen egy induló SQLJ alkalmazást, amely visszaírja az aktuális adatbázis felhasználó nevét

  2. Készítsen egy SQLJ alkalmazást, amely a paraméterként adott kódhoz visszaírja a termékek nevét, és mennyiségi egységét a a TERMEK[ tkod, tnev, megyseg] táblából

  3. Készítsen SQLJ-ben egy metódust, amely a paraméterként kapott kód, név és megység adatokkal felvisz egy új rekordot a TERMEKR táblába.

  4. Készítsen SQLJ-ben egy metódust, amely a paraméterként kapott név és megység adatokkal felvisz egy új rekordot a TERMEKR táblába. A következő szabad kód értéket egy SELECT lekérdezéssel határozza meg. A maximális tkod meghatározása előtt zárolja a táblát, nehogy más közben hasonló olvasást végezzen

  5. Késztítsen egy SQLJ programot, amely a paramétereként kapott szöveges állomány tartalmával feltölti a TERMEKR táblát. Az állomány egy sora: név, egységár alakú.

  6. Készítsen SQLJ programot, amely kilistázza a termékek nevét és a mennyiségiegységét név szerinti sorrendben. A megoldásban alkalmazza az iterátor mechanizmust.

  7.  Oldja meg az előző feladatot pozicionálgható iterárot segítségével, úgy, hogy a termékek nevei csökkenő sorrendben jelenjenek meg.

JDBC

Kapcsolat felvétel, driver betöltés

  1. Regisztrálja a megfelelő JDBC drivert az Oracle DBMS-hez!

  2. Töltse be a megfelelő drivert az Oracle DBMS-hez, majd kapcsolódjon az adatbázishoz!

  3. Paraméterezze a 7.3.1/2. feladat kapcsolódásában a felhasználónevet és a jelszót!

Statikus DML utasítások – Statement

  1. Szúrjon be egy rekordot a vevő táblába!

  2. Módosítson egy rekordot a mobiltelefon táblában!

  3. Töröljön egy rekordot a vevő táblából!

  4. Hajtson végre egy beszúrást, egy módosítást és egy törlést kötegelt utasítások segítségével!

  5. Paraméterezzen egy INSERT utasítást!

Kétlépcsős utasítások – PreparedStatement

  1. Az INSERT utasítás paraméterezését oldja meg Prepared Statement-tel és szúrjon be egy rekordot a vevo táblába!

  2. Az UPDATE utasítás paraméterezését oldja meg Prepared Statement-tel és módosítson egy rekordot az elegedettseg táblában!

  3. A DELETE utasítás paraméterezését oldja meg Prepared Statement-tel és töröljön egy rekordot a mobiltelefon táblából!

  4. Paraméterezze a DELETE utasítás tábla opcióját és egy mező szerinti kiválasztást!

Lekérdezek, kurzor-kezelés – ResultSet

  1. Kérdezze le a vevő tábla első rekordjából az ügyfélszámot, a nevet és az e-mail címet!

  2. Kérdezze le az összes vevő ügyfélszámát, nevét és e-mail címét és jelenítse meg „táblázatos" alakban!

  3. Kérdezze le a vevő tábla első két rekordjából a nevet!

  4. Kérdezze le a mobiltelefon tábla utolsó két rekordjából a mobiltelefon típusát és árát!

  5. Kérdezze le az árusít tábla 2. rekordjából a darabszámot!

  6. Kérdezze le a vevő tábla utolsó előtti 2. rekordból a lakcímet!

Tárolt eljárás-, függvényhívások – CallableStatement

  1. Hívja meg a tel táblához tartozó csomag insert_tel tárolt eljárását!

  2. Hívja meg az árusit táblához tartozó csomag update_arusit tárolt eljárást!

  3. Hívja meg a szolgáltató táblához tartozó csomag delete_szolgaltato tárolt eljárást!

  4. Hívja meg az elegedett(azonosito) függvényt majd írja ki az eredményt!

Hiba-, kivételkezelés

  1. Kezelje le a driver betöltéskor keletkezhető hibákat!

  2. Kezelje le a kapcsolódáskor keletkezhető hibákat!

Metaadatok feldolgozása

  1. Kérje le az Ön által használt adatbázis nevét és verzióját!

  2. Kérje le az Ön által használt JDBC driver nevét és verzióját!

  3. Listázza ki az Ön által használt adatbázis aktív sémáit!

  4. Írassa ki hány db mezőt tartalmaz a szolgáltató tábla egy rekordja!

  5. Írassa ki a vevő tábla mezőinek nevét és típusát!

ADO.NET

Kapcsolat felvétel

  1. Hozzon létre egy kapcsolatot az OleDb connectorral Oracle adatbázishoz, nyissa meg azt, és amennyiben sikeres a kapcsolódás, írja azt ki a Console-ra. Hiba esetén a program jelezzen!

  2. Hozzon létre az előzőhöz hasonlóan egy kapcsolatot az Oracle adatbázishoz OleDb connectorral, de a kapcsolati stringben használjon paramétereket. Sikeres kapcsolódás esetén írja azt ki a Console-ra. Hiba esetén a program jelezzen!

  3. Kapcsolódjon adatbázishoz Odbc driver segítségével, siker esetén ezt szöveggel jelezze a Console-on. Hiba esetén a program jelezzen!

  4. Az előző feladat kapcsolatának paraméterezése a könnyebb használhatóság érdekében. Hiba esetén a program jelezzen!

DDL, DML utasítások

  1. Kapcsolódjon paraméteresen OleDb driverrel, majd hozzon létre egy ’temp’ nevű táblát, és töltse fel adatokkal. Hiba esetén a program jelezzen!

  2. A létrehozott ’temp’ nevű táblát törölje az adatbázisból. Hiba esetén a program jelezzen.

  3. Hozzon létre kapcsolatot, és törölje a ’vevo’ táblából azt a sort, amelyben az ’ugyfelszam’ értéke 11223344-re van állítva. Hiba esetén a program jelezzen.

  4. Hozzon létre paraméterezett kapcsolatot, majd tároljon le egy új sort a ’vevo’ táblában. Hiba esetén a program jelezzen.

  5. Sikeres kapcsolódás után állítsa az 11223344 ügyfélszámű vevő nevét Ágostonra! Hiba esetén a program jelezzen.

Kétlépcsős utasítások

  1. Kapcsolódjon paraméteresen az adatbázishoz, majd hajtson végre egy paraméterezett lekérdezést, az eredményt DataReader-ben tárolja, majd írja ki Console-ra. Hiba esetén a program jelezzen.

  2. Kapcsolat létrehozása után paraméterezett INSERT műveletet hajtson végre. Állítsa be a paraméterek értékét tetszőleges értékekre. Hiba esetén a program jelezzen.

  3. A 7.4.2/5. feladathoz hasonlóan szintén az 11223344 ügyfélszámú vevő nevét írja át, de most paraméteresen. Hiba esetén a program jelezzen.

  4. Kapcsolódjon adatbázishoz, majd töröljön a 'vevo' táblából paraméteresen. A paraméter az ügyfélszám mezőre vonatkozzon.

Lekérdezek, kurzor-kezelés

  1. Hozzon létre paraméterezett kapcsolatot, majd hajtson végre egy lekérdezést (pl.: „SELECT ugyfelszam FROM vevo”). Az eredményt egy DataReader-ben tárolja, majd irassa ki az első sorát. Hiba esetén a program jelezzen.

  2. Az előző feladatban használt lekérdezés minden sorát írja ki. Használja a StringBuilder Append() metódusát. Hiba esetén a program jelezzen.

  3. Ugyanezen lekérdezés kiíratása StringBuilder nélkül, azonnal a Console-ra. Hiba esetén a program jelezzen.

  4. Kapcsolódjon paraméteresen az adatbázishoz, hajtson végre egy lekérdezést, és az eredményt DataSet-ben tárolja. Ezután írja ki annak írja ki első sorát. Hiba esetén a program jelezzen.

  5. Az előző lekérdezés eredményét a DataSet-ből foreach ciklussal irassa ki. Hiba esetén a program jelezzen.

Tárolt eljárás-, függvényhívások

  1. Sikeres kapcsolódás után a ’vevo_csomag’ ’delete_vevo’ tárolt eljárását használva törölje azon vevőt, akinek ügyfélszáma 11223344. Hiba esetén a program jelezzen.

  2. Szúrjon be egy új sort a ’vevo’ táblába a ’vevo_csomag’-ban található ’insert_vevo’ tárolt eljárás segítségével. Hiba esetén a program jelezzen.

  3. Kapcsolódjon az adatbázishoz, mad a 'vevo_csomag'-ban található 'update_vevo' tárolt eljárást használva írja felül az 11223344 ügyfélszámú ügyfél adatait tetszőleges értékekkel. Hiba esetén a program jelezzen.

XML kezelés

  1. Kapcsolódjon az adatbázishoz, majd egy tetszőleges lekérdezés adatait mentse XML fileba. Ehhez szüksége lesz a példányosított DataSet WriteXml() metódusára. Hiba esetén a program jelezzen.

  2. Az előző feladathoz hasonlóan szintén XML fileba mentse a lekérdezés eredményét, a mentést követően azonban törölje a DataSet-et, és töltse bele vissza az XML fileból a mentett adatokat, és ezek után írja ki a tartalmát Console-ra. Használja a WriteXml() és ReadXml() metódusokat! Hiba esetén a program jelezzen.

  3. Mentse az XML file-t sémával!

  4. Töltse be egy DataSet-be egy korábban lementett lekérdezés (XML file) tartalmát, majd irassa ki a DataSet tartalmát. Ne kapcsolódjon adatbázishoz. Hiba esetén a program jelezzen.

Metaadatok feldolgozása

  1. Írjon programot, amely kapcsolódik az adatbázishoz, és kérdezze le a 'vevo' tábla néhány metainformációját. Ha a program nem tér vissza sorral, az azt jelenti, hogy a tábla nem létezik. Hiba esetén a program jelezzen!

  2. Kapcsolódjon az adatbázishoz, majd listázza ki az abban található táblák mezőinek azonosítóit. Hiba esetén a program jelezzen.

  3. Kapcsolódjon az adatbázishoz, majd listázza ki az abban található VEVO tábla CHAR típusú mezőinek azonosítóit, illetve azok hosszát. Hiba esetén a program jelezzen!

Hibakezelés

  1. Kapcsolódjon az adatbázishoz, majd írja ki a kapcsolat főbb tulajdonságait, valamint ha OleDbException keletkezik, azt kapja el. Használja a finally ágat is, itt zárja le a kapcsolatot.

  2. Kapcsolódjon az adatbázishoz, és kapja el a lehetséges exception-öket. Használja a finally ágat is, itt zárja le a kapcsolatot.

ORM framework-ök, perzisztencia felületek

Hibernate

  1. Építse fel az igényelt adatbázis kapcsolatot a JDeveloper környezetben.

  2. Építse fel az adatmodell a JDeveloper környezetben.

  3. Ellenőrizze a létrejött persistence.xml konfigurációs állományt.

  4. Hozza létre az entitásokat kezelő menedzser osztályt.

  5. Módosítsa úgy a kliens osztályt, hogy az listázza ki az adatbázsiban tárolt termékek neveit.

  6. Vigyen fele egy új terméket az adatbázisba perziszetens objektumon keresztül.

  7. Kérdezze le a termékek darabszámát egy native SQL lekérdezésen keresztül.

  8. Kérdezze le a egy adott mennyiségi egységhez tartozó termékek neveit egy paraméteres native SQL lekérdezésen keresztül.

JPA

Entity létrehozás

  1. Hozzon létre „Entity” osztályt a „vevő” táblára!

  2. Hozzon létre „Entity” osztályt a „szolgáltató” táblára!

  3. Hozzon létre „Entity” osztályt a „mobiltelefon” táblára!

Kapcsolatok kezelése

  1. Hozzon létre „Entity” osztályt a „tel” táblára, figyeljen az 1:N kapcsolat annotálására, legyen kétirányú a kapcsolat!

  2. Egészítse ki a megfelelő osztályokat, hogy kezeljék az „árusít” kapcsolatot! Figyeljen az N:M kapcsolat annotálására!

  3. Egészítse ki a megfelelő osztályokat, hogy kezeljék az „elégedettség” kapcsolatot! Figyeljen az N:M kapcsolat annotálására!

Persistence XML

  1. Írja meg a „persistence.xml” fájlt a JPA használatához!

Kezelo osztályok létrehozása

  1. Hozzon létre egy „VevoKezelo” osztályt, amely a vevo táblát kezeli: felvitel, módosítás, törlés, összes adat lekérdezés!

  2. Hozzon létre egy „SzolgaltatoKezelo” osztályt, amely a szolgáltató táblát kezeli: felvitel, módosítás, törlés, összes adat lekérdezés!

  3. Egészítse ki a „SzolgaltatoKezelo” osztályt, hogy kezelje az árusításokat!

  4. Készítsen egy „Kezelo” generikus absztrakt osztályt és származtassa le a „VevoKezelo” és a „SzolgaltatoKezelo” osztályokat belőle! Módosítsa a megoldáshoz a már elkészült leszármazott osztályokat!

Műveletek végrehajtása, entity-k, kezelők akalmazása

  1. Vigyen fel egy új vevőt!

  2. Vigyen fel egy új szolgáltatót!

  3. Kapcsolja össze a vevőt a szolgáltatóval (elégedettség kapcsolat)!

  4. Módosítson egy vevőt!

  5. Módosítson egy szolgáltatót!

  6. Töröljön egy vevőt!

  7. Töröljön egy szolgáltatót!

  8. Listázza ki a vevőket!

  9. Listázza ki a szolgáltatókat!

LINQ

Működési környezet

  1. Sorolja fel a LINQ rendszer főbb jellemzőit!

  2. Milyen adatforrásokat támogat a LINQ rendszer?

  3. Adja meg a LINQ lekérdezés általános alakját!

  4. Milyen adatkezelő operátorokat támogat a LINQ rendszer?

Mintaparancsok

  1. Egy adott számsorozatból az 5-nél kisebb értékűeket irassuk ki, használjunk deklaratív parancsmódot.

  2. Készítsen egy szelekciós joint terméknév - gyártónév párosok listájára. A terméket egy (gyártó, név, ár) a gyártót (kód, név) adatok jellemeznek. Használjon deklaratív parancsalakot

  3. Irassa ki a termékek darabszámát. Használjon funkcionális parancsalakot..

  4. Irassa ki a 10-nél drágább ermékek darabszámát. Használjon funkcionális parancsalakot.

  5. Irassa ki a 10-nél drágább termékek neveit ABC sorrendben, funkcionális parancaalakban.

  6. Irassi ki az ITALGYAR termékeit, funkcionális alakot használjon. A nevek rendezve jelenjenek meg.

  7. Irassi ki az ITALGYAR termékeinek átlagárát, funkcionális alakot használjon.

  8. Listázza ki az átlagárnál drágább termékek neveit, funkcionális kódot alkalmazzon.

  9. Kérdezze le az italgyári termékek átlagáránál drágább termékek neveit ABC sorrendben, funkcionális parancsalakban.

2. fejezet - Megoldások

Tervezési, modellezési feladatok

ER modell készítése

Tervezze meg a VaKer – élelmiszerekkel kereskedő cég raktárhelyeinek ER modelljét.

2.1. ábra - ER modell

ER modell

Az egyes elemek elnevezésénél célszerű beszédes azonosítókat alkalmazni, az ábra terjedelme miatt viszont célszerű az elnevezéseket lerövidíteni. Néhány elnevezés magyarázata: Tkód: termékkód, Rhkód: raktárhely kód, Rkód: raktár kód, MEgys: mennyiségi egység (darab, liter, kg…), BeDat: betárolási dátum, LeDat: lejárati dátum. Ahol lehetséges, a kapcsolatokat is a tartalmukról kell elnevezni, ha ezt nem lehet megvalósítani, célszerű a kapcsolatokat az egyedek kezdőbetűivel azonosítani.

Tervezze meg a VaKer – élelmiszerekkel kereskedő cég számlázási rendszerének ER modelljét.

2.2. ábra - ER modell

ER modell

A tétel gyenge egyed, azonosítása a sorszámból és a számlaszámból képzett összetett kulccsal történik. A TermékB egyed az egységár mező miatt különbözik az előző feladat TermékR egyedétől, ahol az egységár lényegtelen, itt viszont lényeges.

Tervezze meg a VaKer – élelmiszerekkel kereskedő cég raktári megrendeléseinek ER modelljét.

2.3. ábra - ER modell

ER modell

Ha egy rendelésben csak egy beszállító szerepel, akkor az R-B kapcsolat 1:N típusú, ha több beszállító szerepelhetne, akkor viszont N:M típusú lenne.

Tervezze meg a VaKer – élelmiszerekkel kereskedő cég raktári beszállításainak ER modelljét.

2.4. ábra - ER modell

ER modell

Tervezze meg a VaKer – élelmiszerekkel kereskedő cég dolgozói adatbázisának ER modelljét.

2.5. ábra - ER modell

ER modell

Tervezze meg a VaKer – élelmiszerekkel kereskedő cég webáruházának ER modelljét.

2.6. ábra - ER modell

ER modell

Tervezze meg a VaKer – élelmiszerekkel kereskedő cég bolti átszállításának egyszerűsített ER modelljét.

2.7. ábra - ER modell

ER modell

EER modell készítése

Tervezze meg a VaKer – élelmiszerekkel kereskedő cég raktárának EER modelljét.

2.8. ábra - EER modell

EER modell

Tervezze meg a VaKer – élelmiszerekkel kereskedő cég dolgozói adatbázisának EER modelljét.

2.9. ábra - EER modell

EER modell

Tervezze meg a VaKer – élelmiszerekkel kereskedő cég ajándékkosarainak EER modelljét.

2.10. ábra - EER modell

EER modell

Tervezze meg a VaKer – élelmiszerekkel kereskedő cég számlázási rendszerének EER modelljét.

2.11. ábra - EER modell

EER modell

Hierarchikus adatmodel készítése

Tervezze meg a VaKer – élelmiszerekkel kereskedő cég dolgozói adatbázisának hierarchikus modelljét.

2.12. ábra - Hierarchikus modell

Hierarchikus modell

Tervezze meg a VaKer – élelmiszerekkel kereskedő cég raktári beszállításainak hierarchikus modelljét.

2.13. ábra - Hierarchikus modell

Hierarchikus modell

2.14. ábra - Hierarchikus modell

Hierarchikus modell

Konvertálás ER modellről hierarchikusra

Alakítsa át az alábbi ER modellt hierarchikus modellé! Készítse el mind a klasszikus mind a fejlettebb változat modelljét.

2.15. ábra - Hierarchikus modell

Hierarchikus modell

2.16. ábra - Hierarchikus modell

Hierarchikus modell

Alakítsa át az alábbi ER modellt hierarchikus modellé! Készítse el mind a klasszikus mind a fejlettebb változat modelljét.

2.17. ábra - Hierarchikus modell

Hierarchikus modell

2.18. ábra - Hierarchikus modell

Hierarchikus modell

Hálós adatmodell készítése

Tervezze meg a VaKer – élelmiszerekkel kereskedő cég raktárának hálós adatmodelljét.

2.19. ábra - Hálós modell

Hálós modell

Tervezze meg a VaKer – élelmiszerekkel kereskedő cég számlázási rendszerének hálós modelljét.

2.20. ábra - Hálós modell

Hálós modell

Tervezze meg a VaKer – élelmiszerekkel kereskedő cég autóflotta nyilvántartási rendszerének hálós modelljét.

2.21. ábra - Hálós modell

Hálós modell

Konvertálás ER modellről hálósra

Alakítsa át az ER modellt hálós modellé!

2.22. ábra - Hálós modell

Hálós modell

Alakítsa át az ER modellt hálós modellé!

2.23. ábra - Hálós modell

Hálós modell

Relációs adatmodell készítése

Tervezze meg a VaKer – élelmiszerekkel kereskedő cég tanfolyamainak relációs adatmodelljét.

2.24. ábra - Relációs modell

Relációs modell

Dolgozó [ Dkód (PK) ,Dnév ]

Végzettség [ Dkód, Leírás ]

Tanfolyam [ Tkód (PK), Téma ]

Képzés [ Dkód, Dátum, Hely, Tkód ]

Oktató [ Okód (PK), Onév, IrSz, Város, UHsz ]

T-O [ Tkód, Okód ]

Tervezze meg a VaKer – élelmiszerekkel kereskedő cég raktárának relációs adatmodelljét.

2.25. ábra - Relációs modell

Relációs modell

Kategória [ Kkód (PK), Leírás ]

Termék [ Tkód (PK), Tnév, MEgys, Kkód ]

Raktár [ Rkód (PK), Leírás, Aktív ]

Raktárhely [ Rhkód (PK), Aktív, Rkód ]

Készlet [ Tkód, Menny, Bedat, Ledat, Rhkód ]

Tervezze meg a VaKer – élelmiszerekkel kereskedő cég számlázási rendszerének relációs adatmodelljét.

2.26. ábra - Relációs modell

Relációs modell

Vevő [ Vkód (PK), Vnév, IrSz, Város, UHsz ]

Dolgozó [ Dkód (PK), Dnév ]

Számla [ SzSzám (PK), Dkód, Dátum, Összár, Vkód ]

Termék [ Tkód (PK), Tnév, MEgys, EgysÁr ]

Tétel [ SzSzám, Sorszám, Tkód, Menny, Összeg ]

Tervezze meg a VaKer – élelmiszerekkel kereskedő cég raktári megrendeléseinek relációs adatmodelljét.

2.27. ábra - Relációs modell

Relációs modell

Konvertálás ER modellről relációsra

Alakítsa át az alábbi ER modellt relációs modellé!

2.28. ábra - Relációs modell

Relációs modell

Alakítsa át az alábbi ER modellt relációs modellé!

2.29. ábra - Relációs modell

Relációs modell

Alakítsa át az alábbi ER modellt relációs modellé!

2.30. ábra - Relációs modell

Relációs modell

Normalizálás

Normalizálja az alábbi sémát 3NF-ig: R(X,Y,Z,Q,W) ahol Y → W, X → (Q,Z), Z → Y.

A szétvághatósági szabály alapján:  

X → (Q,Z) ↔ X → Q és X → Z

Armstrong 3. axiómája alapján:

X → Z és Z → Y ↔ X → Y

X → Y és Y → W ↔ X → W

A mezők atomiságát feltételezve:

1NF: R(X,Y,Z,Q,W)

2NF: = 1NF

3NF: R1(X,Q,Z) R2(Z,Y) R3(Y,W)

Normalizálja az alábbi sémát BCNF-ig: R(A,B,C,D,E) ahol C→E, A→D, E→B, (A,E)→A.

Armstrong 1. axiómája alapján:        

(A,E) → A és (A,E) → E

Armstrong 3. axiómája alapján:

(A,E) → A és A → D ↔ (A,E) → D

(A,E) → E és E → B ↔ (A,E) → B

De C → E, ezért (A,C) a kulcs.

A mezők atomiságát feltételezve:

1NF: R(A,C,B,D,E)

2NF: R1(A,C) R2(A,D) R3(C,E,B)

3NF: R1(A,C) R2(A,D) R3(C,E) R4(E,B)

BCNF: = 3NF

Normalizálja az alábbi sémát BCNF-ig: R(X,Y,Z,Q,R,S) ahol (Y,Q) → Y , Q → Z, Y → S,  (Y,Q) → R, S → X.

Armstrong 1. axiómája alapján:        

(Y,Q) → Y és (Y,Q) → Q

Armstrong 2. axiómája alapján:

Q → Z ↔ (Y,Q) → (Y,Z)

A szétvághatósági szabály alapján:

(Y,Q) → (Y,Z) ↔ (Y,Q) → (Y) és (Y,Q) → (Z)

Armstrong 3. axiómája alapján:        

(Y,Q) → Y és Y → S ↔ (Y,Q) → S

 (Y,Q) → S és S → X ↔ (Y,Q) → X

A mezők atomiságát feltételezve:

1NF: R(Y,Q,X,Z,R,S)

2NF: R1(Y,Q,R) R2(Y,S,X) R3(Q,Z)

3NF: R1(Y,Q,R) R2(Y,S) R3(S,X) R4(Q,Z)

BCNF: = 3NF

Normalizálja az alábbi sémát BCNF-ig: R(A,B,C,D,E,F) ahol A → C, E → B, C → (F,C),  (A,E) → D.

Armstrong 1. axiómája alapján:

(A,E) → A és (A,E) → E

A szétvághatósági szabály alapján:

C → (F,C) ↔ C → (F) és C → (C)

Armstrong 3. axiómája alapján:

(A,E) → A és A → C ↔ (A,E) → C

(A,E) → C és C → F ↔ (A,E) → F

(A,E) → E és E → B ↔ (A,E) → B

A mezők atomiságát feltételezve:

1NF: R(A,E,B,C,D,F)

2NF: R1(A,E,D) R2(A,C,F) R3(E,B)

3NF: R1(A,E,D) R2(A,C) R3(C,F) R4(E,B)

BCNF: = 3NF

Normalizálja az alábbi sémát BCNF-ig: R(A,B,C,D,E) ahol A → B, A → C, B → A,  B → C, C → D, D → E.

Armstrong 3. axiómája alapján:

B → C és C → D ↔ B → D

B → D és D → E ↔ B → E

De A → B, tehát A vagy B lehet a kulcs.

A mezők atomiságát feltételezve:

1NF: R(B,A,C,D,E)

2NF: = 1NF

3NF: R1(B,A) R2(A,C) R3(C,D) R4(D,E)

BCNF: R1(B,A,C) R2(C,D) R3(D,E)

Lekérdezési feladatok a hálós adatmodellben

Mely raktárhelyeken van 10000 Ft-nál drágább termék?

   
   p1 EgysÁr>10000 (Termék)
   while (db_status = = 0) {
     m1 (Tk, Készlet)
     while (db_status == 0) {
       o (Rh, Készlet)
       print(Rhkód)
       mn (Tk, Készlet)
     }
     pn EgysÁr>10000 (Termék)
   }
      

Mely raktárhelyeken mekkora mennyiség van a Gumikolbász nevű termékből?

   p1 Tnév=’Gumikolbász’ (Termék)
   while (db_status == 0) {
     m1 (Tk, Készlet)
     while (db_status == 0) {
       o (Rh, Készlet)
       print(Rhkód, Menny)
       mn (Tk, Készlet)
     }
     pn Tnév=’Gumikolbász’ (Termék)
   }
            

Hányféle termék van az A40-es raktárhelyen?

   db=0
   p1 Rhkód=’A40’ (Raktárhely)
   m1 (Rh, Készlet)
   while (db_status == 0) {
     db=db+1
     mn (Rh, Készlet)
   }
   print(db)
      

Mekkora értékű készlet van az A40-es raktárhelyen?

   Érték=0
   p1 Rhkód=’A40’ (Raktárhely)
   m1 (Rh, Készlet)
   while (db_status = = 0) {
     o (Tk, Készlet)
     Érték=Érték+Menny*EgysÁr
     mn (Rh, Készlet)
   }
   print(Érték)

Relációs algebra

Adott a következő relációs modell, a feladatokat ezen kell megoldani.

2.31. ábra - Relációs modell

Relációs modell

Adja meg az osztályok nevét!

П {Onév (Osztály)}

Adja meg a könyvelés dolgozóinak nevét, alapbérét!

П {Dnév, Alapbér} (σ {Onév=’könyvelés’} (Dolgozó >< {Dolgozo,okod = Osztaly.okod} Osztály))

Hány Osztály van?

Γ {}{count(*) }(Osztály) – Azt írja ki, hány darab rekord van az Osztály relációban.

Hányan dolgoznak a könyvelésen?

Γ {}{count(*)}(σ {Onév=’könyvelés’ }(Dolgozó >< {Dolgozo,okod = Osztaly.okod} Osztály))

A dolgozó és az osztály rekordpárosaiban hányszor fordul elő olyan rekord, ahol az osztálynév könyvelés.

Kik vettek részt a 2010 májusi raktártakarítás projektben?

П {Dnév} (σ {Pnév=’raktártakarítás’ AND Dátum=’2010.05.01’ } ((Dolgozó >< {Dolgozo.dkod = Resztvesz.dkod} Résztvesz) >< {Projekt,pkod = Resztvesz.pkod} Projekt ))

Adja meg a legnagyobb teljesítménybérű projektben részt vevők nevét!

П {Dnév} (σ {Tbér= Γ {}{max(Tbér)} (Projekt) }((Dolgozó >< {Dolgozo.dkod = Resztvesz.dkod} Résztvesz) >< {Projekt,pkod = Resztvesz.pkod} Projekt ))

Kik nem vettek még részt projektben?

П {Dnév} (Dolgozó) \ П {Dnév} (Dolgozó >< {Dolgozo.dkod = Resztvesz.dkod} Résztvesz)

Az összes dolgozó nevéből kivonjuk a projektekben részt vettek nevét.+

Összesen mennyibe került már a fásítás projekt?

Γ {}{sum(Tbér)}( σ {Pnév=’fásítás’} (Résztvesz >< {Projekt,pkod = Resztvesz.pkod} Projekt ))

Hányan vettek részt a 2010 májusi projektekben projektenként?

Γ{Pnév} {Pnév, count(*)}(σ {Dátum=’2010.05.01’} (Résztvesz >< {Projekt,pkod = Resztvesz.pkod} Projekt ))

Ki vett részt már legalább ötször projektekben?

П {Dnévn (σ {db>=5} (Γ {Dnév} {Dnév, count(*) db }(Dolgozó >< {Dolgozo.dkod = Resztvesz.dkod} Résztvesz)))

A relációk ugyanazok, de a mezőnevek megváltoztak!

2.32. ábra - Relációs modell

Relációs modell

Adja meg a könyvelés dolgozóinak nevét, alapbérét!

П Dolgozó.Név, Alapbér (σ Osztály.Név=’könyvelés’ (Dolgozó >< {Oszt=Osztály.Kód} Osztály))

A pénztárosok mely projektekben vettek részt 2010 májusában?

Megoldás az alap join felhasználásával:

П {Projekt.Név} (σ {Dátum=’2010.05.01’ AND Beosztás=’pénztáros’ AND Dolgozó.Kód=Résztvesz.Dolg AND Résztvesz.Proj=Projekt.Kód} (Dolgozó x Résztvesz x Projekt ))

Megoldás szelekciós joinnal:

П {Projekt.Név} (σ {Dátum=’2010.05.01’  AND Beosztás=’pénztáros’} ((Dolgozó >< {Dolgozó.Kód=Résztvesz.Dolg} Résztvesz >< {Résztvesz.Proj=Projekt.Kód} Projekt ))

Mennyi volt a fizetése Kiss Dezsőnek 2010 májusában?

П {Dolgozo.Alappber}( σ{Dolgozó.Név=’Kiss Dezső’} Dolgozo) + Γ {}{sum(Tbér)} ({σ Dátum=’2010.05.01’ AND Dolgozó.Név=’Kiss Dezső’ } ((Dolgozó >< {Dolgozó.Kód=Résztvesz.Dolg} Résztvesz) >< {Résztvesz.Proj=Projekt.Kód} Projekt ))

Az egyes osztályokon hány miskolci dolgozó van?

Γ{Osztály.Név} {Osztály.név, count(*)}(σ {Város=’Miskolc’} (Dolgozó >< {Oszt=Osztály.Kód} Osztály))

Az egyes projekteken dolgozóknak mennyi az átlagéletkora?

Γ{Projekt.Név} {Projekt.név, avg(Kor)}((Dolgozó >< {Dolgozó.Kód=Résztvesz.Dolg} Résztvesz) >< {Résztvesz.Proj=Projekt.Kód} Projekt ))

Van olyan projekt, amelynek neve megegyezik egy osztály nevével?

П {Osztály.Név} (σ {Osztály.Név=Projekt.Név} (((Osztály >< {Osztály.Kód=Oszt} Dolgozó) >< {Dolgozó.Kód=Résztvesz.Dolg} Résztvesz) >< {Résztvesz.Proj=Projekt.Kód} Projekt ))

Ki (név és osztály) és mikor vett részt fásítás projekten?

П {Osztály.Név, Dolgozó.Név, Dátum} ( σ {Projekt.Név=’fásítás’} (((Osztály >< {Osztály.Kód=Oszt Dolgozó}) >< {Dolgozó.Kód=Résztvesz.Dolg} Résztvesz) >< {Résztvesz.Proj=Projekt.Kód} Projekt ))

A projekteken részt vettek közül kinek a legmagasabb az alapbére?

П {Dolgozó.Név, Alapbér} ( σ {Alapbér= Γ {}{max(Alapbér)} (Dolgozó >< {Dolgozó.Kód=Résztvesz.Dolg} Résztvesz) Dolgozo )

Ki hány projekten vett már részt?

Γ{Dolgozó.Név} {DolgozóNév, count(*)}(Dolgozó >< {Dolgozó.Kód=Résztvesz.Dolg} Résztvesz)

Adja meg annak a dolgozónak a nevét, aki 2010 májusában az alapbére felénél több jövedelmet szerzett projektekből!

П {Dolgozó.Név} ( σ {Dátum=’2010.05.01’ AND Alapbér/2< Γ {}{sum(Tbér)} (σ {D.kód=Dolg} (Résztvesz) >< {Résztvesz.Proj=Projekt.Kód} Projekt ) Dolgozó D)

SQL feladatok

Az egyes feladatoknál az SQL92-nek megfelelő elvi megoldást adom meg, de ettől az egyes adatbázis kezelő rendszerek az implementációban, a konkrét megvalósításban eltérhetnek. A jegyzetben található konkrét megoldásokhoz a Microsoft SQL Server 2005-ös rendszerében implementált SQL nyelvet használtam.

DDL (Data Definition Language) parancsok

A feladatokat az alábbi modellnek megfelelően kell megoldani.

2.33. ábra - Relációs modell

Relációs modell

Hozza létre a táblákat!

   Create table Osztály(
   Kód char(3) primary key,
   Név char(20));
   
   Create table Projekt(
   Kód char(3) primary key,
   Név char(20),
   Tbér numeric(5) check (Tbér<30000), 
   Aktív char(1) check (Aktív in('I','N')));
   
   Create table Dolgozó(
   Kód char(3) primary key,
   Név char(20),
   Város char(20),
   Beosztás char(20),
   Kor numeric(2) check (Kor between 18 and 62), 
   Alapbér numeric(6) check (Alapbér>85000), 
   Oszt char(3) not null references Osztály);
   
   Create table Résztvesz(
   Dolg char(3) not null references Dolgozó,
   Dátum date,
   Proj char(3) not null references Projekt,
   unique (Dolg, Dátum, Proj));
         

Az unique előírás így megadva azt jelenti, hogy az adott mezőket együtt figyelve nem lehet ismétlődés, vagyis egy dolgozókód egy adott dátummal az adott projekt mellett csak egyszer fordulhat elő.

A vezetés úgy dönt, hogy  ne a dátumot tároljunk a Résztvesz táblában, hanem számként az évet és a hónapot.

Törljük a táblát, és hozzuk létre ennek megfelelően. Alakítsuk úgy ki a hónap mezőt, hogy csak a hónapoknak megfelelő számok kerülhessenek bele.

2.34. ábra - Relációs modell

Relációs modell

   Drop table Résztvesz;
   Create table Résztvesz(
   Dolg char(3) not null references Dolgozó,
   Év numeric(4),
   Hónap numeric(2) check (Hónap between 1 and 12),
   Proj char(3) not null references Projekt,
   unique (Dolg, Év, Hónap, Proj));
      

Írjunk elő olyan megszorítást, hogy az év 2011 és 2020 között lehessen!

   alter table Résztvesz add constraint évellenőr check (Év between 2011 and 2020)

Miután megoldottuk, újabb vezetői döntés: az év inkább 2010 és 2020 között lehessen!

   alter table Résztvesz drop constraint évellenőr;
   alter table Résztvesz add constraint évellenőr check (Év between 2010 and 2020);

Írjon elő olyan feltételt, hogy egy projektre maximum négyen jelentkezhessenek.

   Create assertion maxlétszám check 
    (SELECT count(dolg) from Résztvesz group by Év, Hónap, Proj having count(dolg)>4)=0;
                  

Jelentése: azon csoportok száma, ahol a projekten 4-nél többen dolgoznak nulla kell legyen!

Írja elő azt a feltételt is, hogy csak aktív projektre lehessen jelentkezni!

   Create assertion aktívprojekt check 
     (SELECT count(*) from résztvesz, projekt where proj=kód and aktív='N')=0
                  

Azon rekordok száma a résztvesz táblában, ahol a projekt nem aktív, nulla kell legyen! Az előírások elvileg működnek, gyakorlatilag az assertion parancsot a nagyobb adatbázis kezelő rendszerek nem implementálták. Ehelyett használhatók olyan triggerek, amelyek adatbeszúráskor ellenőrzik az előírt feltételeket, és ha nem teljesednek, akkor visszavonják a kiadott insert utasítást. (Ez a rollback parancs, bővebben később!)

   CREATE TRIGGER maxlétszám ON résztvesz FOR INSERT AS
     IF (SELECT count(dolg) from Résztvesz group by Év, Hónap, Proj  
     having count(dolg)>4) >0
     ROLLBACK;
   
   CREATE TRIGGER aktívprojekt ON résztvesz FOR INSERT AS
     IF (SELECT count(*) from résztvesz, projekt where proj=kód and 
     aktív='N')>0
     ROLLBACK;
            

DML (Data Manipulation Language) parancsok

Vigye fel az alábbi adatokat az osztály táblába:

b01-Bolt, b02-Bérügy, s01-Számlázás, s02-Szállítás, r01-Raktár.

Az első rekordot beszúró parancs:

   insert into Osztály values('b01', 'Bolt');
            

A többi parancs ugyanilyen szintaktikájú.

Mi az eredménye a következő parancsoknak? Működnek? Hibásak? Miért?

  1. insert into Osztály values('b01', 'Beszerzés');

    A parancs hibás, mert van már b01 kódú rekord, és az elsődleges kulcs előírás egyben egyediséget is jelent.

  2. insert into Osztály values('b03');

    Hibás, a values után minden értéket meg kell adni, itt kimaradt az osztály neve.

  3. insert into Osztály values('b03',’’);

    Hibás, így nem lehet üres értéket megadni.

  4. insert into Osztály values('b03', null);

    Működik, így kell az üres értéket megadni.

  5. insert into Osztály (Kód) values('b04');

    Működik, így lehet nem teljes adatsort felvinni.

Vigyen be minden táblába néhány rekordot!

 
   insert into Dolgozó values('d44', 'Kék Alma', 'Miskolc', 'számlázó', 31, 180000, 's01');
   insert into Dolgozó values('d09', 'Zöld Galamb', null, 'eladó', 27, 85000, 'b01');
   insert into Dolgozó values('d16', 'Fekete Farkas', 'Eger', 'raktáros', null, 160000, 'r01');
   
   insert into projekt values('fas', 'Fásítás', 10000, 'I')
   insert into projekt values('bt2', 'Bolt takarítás', 29000, 'N')
   insert into projekt values('rt1', 'Raktár takarítás', 10000, 'I')
   
   insert into résztvesz values ('d12', 2010, 9, 'fas')
   insert into résztvesz values ('d33', 2010, 10, 'rt1')
   insert into résztvesz values ('d04', 2010, 12, 'rt1')
     

Kiadjuk egymás után a következő három parancsot:

  1. insert into Dolgozó values('d66', 'Barna Barna', null, 'számlázó', 31, 180000, 's01');

  2. insert into Dolgozó (Kód, Név, Beosztás, Kor, Alapbér, Oszt) values('d67', 'Fehér Hannibál', 'számlázó', 31, 180000, 's01');

  3. update dolgozó set Város='Miskolc' where Város is null;

Kérdések:

  1. Az update parancs hatására mindkét rekordban megváltozik a város Miskolcra?

    Igen, a nem megadott és a null-ként bevitt érték egyformán viselkedik.

  2. Hogyan lehet a d25 és a d32 közötti kódú rekordokban kijavítani a várost Miskolcra?

    update dolgozó set Város='Miskolc' where Kód between 'd25' and 'd32';

  3. Hogyan lehet kitörölni Kék Alma rekordjából a várost?

    update dolgozó set Város=null where Név='Kék Alma';

  4. Hogyan lehet évváltáskor mindekinél a kort megnövelni 1-el?

    update dolgozó set Kor=Kor+1;

  5. Mindig, minden rekordra működik az előző parancs?

    Nem, az előző parancs csak akkor módosítja a rekordot, ha a kor módosítás után nem éri el a 62-t, erről gondoskodik a korra előírt check feltétel.

  6. Hogyan lehet kitörölni Kék Alma rekordját?

    delete from dolgozó where Név='Kék Alma';

  7. Bármikor ki lehet törölni Kék Almát?

    Nem lehet bármikor törölni a rekordot: ha Kék Alma kódja szerepel a résztvesz táblában – mivel ott idegen kulcs – a rekord a dolgozó táblából nem törölhető.

DQL (Data Query Language) parancsok

Adja meg a következő lekérdezéseket megvalósító SQL parancsokat!

  1. A nem Béla keresztnevű raktárosok vagy eladók neve

    Select név from dolgozó where név not like '% Béla' and beosztás ='eladó' or név not like '% Béla' and beosztás='raktáros';

  2. Hány olyan dolgozó van, akinek a kódjában a középső karakter 2-es?

    select count(*) from dolgozó where kód like '_2_';

  3. A 2010 3. negyedévében futó projektek neve (egy név csak egyszer szerepeljen!)

    Select distinct név from projekt, résztvesz where proj=kód and év=2010 and hónap in (7, 8, 9); – A distinct kulcsszó biztosítja az egyediséget, ezért egy név csak egyszer íródik ki.

  4. Osztályok és dolgozóik neve, ábécé sorrendben

    Select osztály.név, dolgozó.név from osztály, dolgozó where oszt=Osztály.kód order by osztály.név, dolgozó.név;

  5. A 04-re vagy 07-re végződő kódú 30-as korú dolgozók neve, alapbére, alapbér szerinti csökkenő sorrendben

    Select név, alapbér from dolgozó where kód like '_04' and kor like '3_' or kód like '_07' and kor like '3_' order by alapbér desc;

Adja meg a következő lekérdezéseket megvalósító SQL parancsokat!

  1. A bérügy dolgozóinak neve, éves alapfizetése

    Select dolgozó.név, 12*alapbér Éves_alapfizetés from osztály, dolgozó where oszt=Osztály.kód and osztály.név='Bérügy';

  2. Az összes különböző beosztás kiírása (csak létező beosztások!)

    Select distinct beosztás from dolgozó where beosztás is not null;

  3. A raktáros beosztásúak átlag alapbére

    Select avg(alapbér) from dolgozó where beosztás='raktáros';

  4. A nem miskolci dolgozók száma, városonként csoportosítva

    Select város, count(*) from dolgozó where város != 'Miskolc' group by város;

  5. A legmagasabb alapbérű dolgozó(k) neve, alapbére

    Select név, alapbér from dolgozó where alapbér =  (select max(alapbér) from dolgozó);

Mi az eredménye a következő SQL parancsoknak?

  1. Select osztály.név, avg(alapbér) from osztály, dolgozó where oszt=Osztály.kód group by osztály.név order by avg(alapbér);

    Osztályok szerinti átlagfizetés, átlagfizetés szerinti növekvő sorrendben

  2. select dolgozó.név from dolgozó, résztvesz, projekt where dolg=dolgozó.kód and proj=projekt.kód and projekt.név='Fásítás';

    Azok neve, akik dolgoztak már a fásítás projektben

  3. select név from dolgozó where név not in(select dolgozó.név from dolgozó, résztvesz, projekt where dolg=dolgozó.kód and proj=projekt.kód and projekt.név='Fásítás');

    Azok neve, akik nem dolgoztak még a fásítás projektben

  4. select osztály.név, projekt.név from osztály, dolgozó, résztvesz, projekt where oszt=osztály.kód and dolg=dolgozó.kód and proj=projekt.kód and év=2010 and hónap=12 group by osztály.név, projekt.név;

    2010 decemberében mely osztályok, milyen projektekben vettek részt

  5. Select dolgozó.név, sum(tbér)+sum(alapbér)/count(alapbér) from dolgozó, résztvesz, projekt where dolg=dolgozó.kód and proj=projekt.kód and év=2010 and hónap=12 group by dolgozó.név;

    A 2010, decemberi fizetések: alapbér és a projektek után járó teljesítménybér.

Adja meg a következő lekérdezéseket megvalósító SQL parancsokat!

  1. Azon osztályok neve és létszáma, ahol 10-nél kevesebben dolgoznak

    Select osztály.név, count(oszt) from osztály, dolgozó where oszt=Osztály.kód group by osztály.név having count(oszt) <10;

  2. A legmagasabb átlagos alapbérű osztály neve, és átlag alapbére

    create view osztatlagfiz as select oszt, avg(alapbér) átlag from dolgozó group by oszt;

    select oszt, átlag from osztatlagfiz where átlag=(select max(átlag) from osztatlagfiz);

    Ha már nem kell: drop view osztatlagfiz;

  3. Az egyes osztályokon hány 300000 Ft-nál többet kereső személy van

    select osztály.név, count(*) from osztály join dolgozó on oszt=osztály.kód where alapbér>300000 group by osztály.név;

  4. Az egyes projektekre hányszor jelentkeztek (kellenek azok a projektek is, amelyekre még sosem jelentkeztek!)

    select projekt.név, count(proj) from projekt left outer join résztvesz on projekt.kód=proj group by projekt.név;

  5. Kék Alma az egyes projektekre hányszor jelentkezett (kellenek azok a projektek is, amelyekre még sosem jelentkezett!)

    select projekt.név, count(proj) from projekt left outer join résztvesz on projekt.kód=proj left outer join dolgozó on dolg=dolgozó.kód and dolgozó.név='Kék Alma' group by projekt.név;

  6. Ki hány projektekre jelentkezett már (azok neve is kell, akik még nem jelentkeztek sosem projektre!)

    select név, count(dolg) from dolgozó left outer join résztvesz on dolgozó.kód=dolg group by név;

  7. Az egyes osztályokról hányszor jelentkeztek már projektre (azon osztályok neve is kell, ahonnan még sosem jelentkeztek projektre!)

    select osztály.név, count(dolg) from osztály left outer join dolgozó on osztály.kód=oszt left outer join résztvesz on dolgozó.kód=dolg group by osztály.név;

DCL (Data Control Language) parancsok

Adja meg a szükséges SQL parancsokat!

Engedélyezze Péter5-nek, hogy lekérdezzen a dolgozó táblából.

Grant select on dolgozó to Péter5;

Engedélyezze mindenkinek a lekérdezést a dolgozó táblából.

Grant select on dolgozó to public;

Engedélyezze a beszúrást és a módosítást Péter5-nek a projekt és a résztvesz táblára.

Grant insert, update on projekt, résztvesz to Péter5;

Vonja vissza a beszúrás jogot a projekt tábla esetén Péter5-től.

Revoke insert on projekt from Péter5;

Tiltsa le Péter5 minden jogát a résztvesz táblával kapcsolatban.

Deny all on résztvesz to Péter5;

Engedélyezze Péter5-nek, hogy lekérdezzen a résztvesz táblából.

Először meg kell szüntetni a Deny hatását:

Revoke all on résztvesz to Péter5;

ezután engedélyezni a lekérdezést:

Grant select on résztvesz to Péter5;

OO modellezés

UML osztály diagram feladatok

Készítsen UML diagramot járművek és tulajdonosok kapcsolati sémájának leírására.

2.35. ábra - UML diagram

UML diagram

Készítsen UML diagramot járművek specializációs kapcsolati sémájának leírására

2.36. ábra - UML diagram

UML diagram

Készítsen UML diagramot egy csomagküldő szolgálat sémájának leírására

2.37. ábra - UML diagram

UML diagram

Készítsen UML diagramot egy hallgatói index és eredmény nyilvántartásra

2.38. ábra - UML diagram

UML diagram

Értelmezze az alábbiakban megadott UML folyamatdiagramot (3.1.1 ábra)

Az ábra egy palacsintasütás sematikus lépéseit ábrázolja. Az indulás után elsőként egy ellenőrzés következik. A tojás minőségét kell megvizsgálni. Ha a vizsgált tojás záp lenne, akkor ki kell dobni és leáll a palacsinatsütés folyamata is. Ha nem záp,a következő lépésben összedolgozzuk a tejjel. Az összedolgozás során folyamatosan ellenőrizzük a massza állapotát. Ha megfelelő állapotú, akkor egy edényt veszünk, és abban megmelegítjük. A melegítés végét egy időtartam ellenőrzéshez kötjük. Ha megvan a sütés, kivesszük az elkészült ételt az edényből. Ha bármikor menetközben leégne az étel, akkor kidobjuk azt és leáll a sütés. Ha nem lenne edény, otthagyjuk a sütést.

Készítsen UML folyamatdiagramot egy termékrendelés felvételre, ahol ellenőrizni kell, hogy az ügyfél megbízható-e és van-e elegendő darabszám a készletben

2.39. ábra - UML diagram

UML diagram

ODL modellezés

Értelmezze az alábbiakban megadott séma definíciót (3.2.1 lista).

A példában a hallgató egy nem példányosítható típus. Vegyük át újra definciót most soronként elemezve:

  1. A fejléc kijelöli az azonosító nevet és a típus jellegét (interfész) INTERFACE hallgató {

  2. Egy saját rekordtípus definiálása, mely két tagból áll STRUCT cím { STRING kollégium STRING szoba };

  3. A név attribútum szöveges típusú ATTRIBUTE STRING név;

  4. Az elérés attribútum cím rekordszerkezetű ATTRIBUTE cím elérés;

  5. Kapcsolat definiálása, a neve tanulja és a szak típusú objektumok halmazát jelöli.

A kapcsolat inverzét a szak típus hallgatja kapcsolata alkotja. RELATIONSHIP SET <szak> tanulja INVERSE szak::hallgatja;

  1. Kivétel kezelő rutinok definiálása EXCEPTION kurzus_tele(); EXCEPTION nem_lézető_kurzus ();

  2. A regisztrál egy metódus azonosító, melynek visszatéri értéke logikai (BOOLEAN) és

két bemenő rövid egész típusú paramétere van. A metódus két saját kivételt dobhat. BOOLEAN regisztrál ( IN SHORT kurzus, IN SHORT szak) RAISES (kurzus_tele,nem_lézető_kurzus);

  1. A következő típus egy osztályt jelöl ki CLASS oktató {

  2. A tanszék attribútum szöveges típusú ATTRIBUTE STRING tanszék;

  3. A beosztás attribútum felsorolásos típusú, ahol a felvehető értékek a megadott listában szerepelnek ATTRIBUTE ENUM beosztás (tanár,docens, adjunktus, tanársegéd);

  4. A tanít kapcsolat kurzusok halmazát jelöli ki. RELATIONSHIP SET<kurzus> tanit;

  5. A doktorandusz típus is osztályként értelmezett. Létezik ősosztály az oktataó osztály.

  6. A doktorandusz osztály örökli az ősosztály minden elemét. Az ősosztály mellett ős interfész is definiált. A doktorandusz osztálynak illeszkednie kell a hallgató interfészre.

CLASS doktorandusz EXTENDS oktato : hallgató

  1. A doktorandusz osztály példányait, objektumait a doktoranduszok elnevezésű extent fogja össze (EXTENT doktoranduszok)

  2. Az interfészre illeszkedően létezik név attribútum és elérés attribútum ATTRIBUTE STRING név; ATTRIBUTE cím elérés;

  3. Egy saját egyedi atribútum az egész típusú óraszám ATTRIBUTE SHORT oraszam;

  4. Itt definiáljuk az interfészben előírt kapcsolatokat RELATIONSHIP SET <szak> tanulja INVERSE szak:hallgatja;

  5. és metódusokat is. BOOLEAN regisztrál ( IN SHORT kurzus, IN SHORT szak) RAISE (kurzus_tele, nem_lézető_kurzus);

Készítsen adattagot egy hónapot tároló osztályban a napok átlaghőmérséklet értékeinek tárolására.

   STRUCT nap_t {INTEGER nap, FLOAT homerseklet};
   ATTRIBUTE LIST < nap_t > napok;

Hozzon létre egy diákot leíró osztályt.

   CLASS diak {
      ATTRIBUTE STRING nev;
      ATTRIBUTE STRING szulhely;
      ATTRIBUTE DATE szukdatum,
      ATTRIBUTE STRING osztály;
      ATTRIBUTE FLOAT átlag;
   }

Egészítse ki a diák osztályt úgy, hogy a diákok halmazában lehessen lekérdezést végezni.

   CLASS diak
   (EXTENT diakok KEY dkod) {
      ATTRIBUTE STRING nev;
      ATTRIBUTE INTEGER dkod;
      ATTRIBUTE STRING szulhely;
      ATTRIBUTE DATE szukdatum,
      ATTRIBUTE STRING osztály;
      ATTRIBUTE FLOAT átlag;
   }

Készítsen egy érdemjegy nyilvántartó osztályt a létező diák oszály mellé, melyhez kezelő metódusokat is definál.

   CLASS eredmeny
   (EXTENT eredmenyek) {
      STRUCT jegy_t {STRING targy, INTEGER ertek, DATE datum};
      ATTRIBUTE LIST jegy_t jegyek,
      RELATIONSHIP diak diak;
   }

Készítsen ODL sémát egy könyv/CD/DVD terjesztő cég termékválasztékának és rendelés nyilvántartásának leírására.

   CLASS ugyfel
   ( EXTENT ugyfelek KEY ukod) {
      STRUCT nev_t { STRING elotag, STRING csnev, STRING knev };
      ATTRIBUTE INTEGER ukod;
      ATTRIBUTE nev_t nev;
      ATTRIBUTE SET {STRING} telefon ;
      RELATIONSHIP SET < rendeles > rendelesek INVERSE rendeles::vevo;
      BOOELAN rendeles_felad(STRING termeknev, INTEGER darab);
   }

   CLASS termek
   ( EXTENT termekek KEY akod) {
      ATTRIBUTE INTEGER akod;
      ATTRIBUTE STRING terneknev;
      ATTRIBUTE INTEGER ear;
      ATTRIBUTE INTEGER keszlet;
      ATTRIBUTE STRING kiado,
      RELATIONSHIP SET < rendeles > rendelesei INVERSE rendeles:.aru;
   }

   CLASS rendeles
   ( EXTENT rendelesek KEY rkod){
      ATTRIBUTE INTEGER rkod;
      ATTRIBUTE DATE dátum
      ATTRIBUTE INTEGER darab;
      RELATIONSHIP termek aru INVERSE termek::rendelesei;
      RELATIONSHIP ugyfel vevo INVERSE ugyfel::rendelesek;
   }

   CLASS konyv EXTENDS termek
   ( EXTENT konyvek){
      ATTRIBUTE STRING cim;
      ATTRIBUTE INTEGER oldalszam;
      ATTRIBUTE STRING isbn;
      ATTRIBUTE STRING kategoria;
   }

   CLASS CD EXTENDS termek
   ( EXTENT cdek){
      STRUCT szam_t {STRING cim, STRING eloado, STRING szerzo, INTEGER hossz}
      ATTRIBUTE STRING album;
      ATTRIBUTE INTEGER hossz;
      ATTRIBUTE LIST < szam_t > szamlista;
   }

Hozzon létre adatmodellt könyv, kiadó és szerző osztályokkal

   CLASS könyv
   ( EXTENT könyvek){
      ATTRIBUTE STRING cím;
      ATTRIBUTE SHORT év;
      ATTRIBUTE FLOAT ár;
      RELATIONSHIP kiadó kiadta INVERSE kiadé.kiadványok;
      RELATION SET < szerz# > szerz#k INVERSE szerz#.m#vek
   }
   CLASS szerzo
   ( EXTENT szerzok){
      ATTRIBUTE STRING név;
      ATTRIBUTE STRING ország;
      RELATION SET<könyv> m#vek INVERSE könyv.szerz#k
   }
   CLASS kiadó
   ( EXTENT kiadók){
      ATTRIBUTE STRING név;
      ATTRIBUTE STRING ország;
      RELATION SET<könyv> kiadványok INVERSE könyv.kiadta
   }

OQL műveletek

Adja meg a könyv sémára vonatkozólag a 2004-ben kiadott könyvek cimeit visszaadó lekérdezést. (3.3.2 lista)

   SELECT k.cím
   FROM könyvek AS k
   WHERE k.év = 2004

      Kérdezze le a könyv sémára vonatkozólag, hogy van-e 2003-ben kiadott könyv.

   EXISTS x IN könyvek :x.év = 2003

Kérdezze le a könyv sémára vonatkozólag, hogy vajon minden könyv 2000 után lett-e kiadva..

   FOR ALL x IN könyv : x.ev > 2000

Kérdezze le a könyv sémára vonatkozólag, mennyi a könyvek átlagára.

   AVG( SELECT x.ár FROM könyvek AS x)

Adja meg a könyv sémára vonatkozólag, mennyi a 2002 előtt kiadott könyvek átlagára.

   AVG (SELECT x.ár FROM könyvek AS x WHERE x.év < 2002)

Adja meg a könyv sémára vonatkozólag, az átlagárnál drágább könyvek címei és kiadásuk évei.

   SELECT k.cím, k.év
   FROM könyvek AS k
   WHERE k.ár > AVG( SELECT x.ár FROM könyvek AS x)

Adja meg a könyv sémára vonatkozólag, a könyvek adatait év szerinti csoportban.

   SELECT *
   FROM könyvek AS k
   GROUP BY éve: k.év

Adja meg a könyv sémára vonatkozólag, a könyvek címei ár szerint növekvő sorrendben.

   SELECT k.cím
   FROM könyvek AS k
   ORDER BY k.ár ASC

Adja meg a könyv sémára vonatkozólag, az azonos országbeli kiadók és szerzők neveit

   SELECT k.*, s.*
   FROM kiadók AS k, szerz#k AS s
   WHERE k.ország = s.ország

Adja meg a könyv sémára vonatkozólag, a 2004-ben kiadott könyvek szerzőinek neveit

   SELECT x.név
   FROM könyvek AS k, k.szerz#k AS x
   WHERE k.év = 2004

Az esetleg eszünkbe jutó

   SELECT k.szerz#k.név
   FROM könyvek AS k
   WHERE k.év = 2004

alak nem helyes, mert ebben a kifejezésben a k.szerzők.név érvénytelen útvonal kifejezés, mivel a középső elem kollekciós típusú. Ezért ezt a kollekciót is külön ki kell emelni a FROM utáni részbe és külön iterátor változóval kell ellátni.

Adja meg a könyv sémára vonatkozólag, azon magyarországi kiadókat, melyek adtak ki 2004-ben könyvet

   SELECT k.név
   FROM (SELECT k FROM kiadók AS k WHERE k.ország = ’Magyarország’) AS h, WHERE p.év = 2004

A fenti példa igen sajátos OQL gondolatmenet tükröz. A lekérdezés ugyanis három kollekciót érint:

  1. kiadók halmaza (ezt tartalmazza az adatbázis, ebből lehet kiindulni)

  2. magyarországi kiadók halmaza (származtattott)

  3. a magyarországi kiadók kiadványai (származtatott)

Mivel az útvonal kifejezésekben nem szerepelhet tagként kollekciós elem, ezért most három iterátor változót kell létrehozni.

  1. k = kiadók halmaza (ezt tartalmazza az adatbázis, ebből lehet kiindulni)

  2. h = magyarországi kiadók halmaza (származtattott)

  3. p = a magyarországi kiadók kiadványai (származtatott)

Mindhárom definíciónak a FROM utáni részben kell szerepelni. A rendszer rugalmasságából eredően, más módon is meg lehet oldani a feladot. Egy szűrési feltétel szerepelhet például mind a belső mind a külső SELECT részben is.

Adja meg a könyv sémára vonatkozólag, mely kiadók nem adtak ki könyvet 2004-ben

   SELECT k.név
   FROM kiadók AS k
   WHERE NOT (k.név IN (SELECT x.név
   FROM kiadók AS x, x.kiadványok AS y WHERE y.év = 2004))
         

A példában a belső SELECt célja a 2004-ben könyvet kiadó kiadók neveinek kigyüjtése. A külső SELECT-ben a kiadók halmazához rendeljükk a k iterátot változót, míg a belső SELECT-ben a x kötődik ugyanazen halmazhoz. E két iterátor változó természetesen egymástól függetlenül mozog az alaphalmazában. Az y iterátor változó az x obektumhoz kapcsolódó kiadványok halamazát jelöli.

Adja meg a könyv sémára vonatkozólag, a kiadók neveit és a 2004-ben kiadott könyveik darabszámát

   SELECT k.név, db : AVG(
   SELECT COUNT(h.cim) FROM k.kiadványok AS h
   WHERE h.év = 2004)
   FROM kiadók k
   WHERE k.orszag = ’Magyarország’

Adja meg a könyv sémára vonatkozólag, azon országok és kiadóik darabszámát, amelyben legalább 3 kiadó van

   SELECT osrz, COUNT(k)
   FROM kiadók k
   GROUP BY orsz : k.orszag
   HAVING COUNT(*) > 3

Oracle adatbázis ORDBMS műveletek

Készítsen egy lakcím leíró T_LAKCIM osztályt, amely a fontosabb postai cím komponenseket tartalmazza.

   CREATE OR REPLACE TYPE t_lakcim AS OBJECT (
      irsz NUMBER(4),
      varos CHAR(20),
      utca CHAR(20),
      hazszam NUMBER(3)
   );

Szüntesse meg az előzőleg létrehozott T_LAKCIM osztályt.

   DROP TYPE t_lakcim FORCE;

Hozzon létre egy emberek táblát, melyben szerepelnek a név, születési év és lakcím mezők. Ez utóbbi adattípusa legyen a T_LAKCIM osztály.

    CREATE TABLE dolgozok (
      kod NUMBER(3) PRIMARY KEY,
      nev CHAR(20) NOT NULL,
      szulev NUMBER(4) CHECK (szulev > 1900),
      lakcim t_lakcim
   );

Vigyen fel egy új rekordot a dolgozok táblába.

    INSERT INTO DOLGOZOK
     VALUES (1,'ANNA',1995,
      T_LAKCIM(3527,'MISKOLC','NAGY UT',12));

Listázza ki a dolgozók nevét és a városukat, város szerinti sorrendben.

   SELECT d.nev, d.lakcim.varos 
   FROM dolgozok d 
   ORDER BY 2;

Kérdezze le a dogozók létszámát városonkénti bontásban.

   SELECT count(d.nev), d.lakcim.varos 
   FROM dolgozok d
   GROUP BY d.lakcim.varos;

Hozzon létre egy t_ember osztályt, melyben adattagként szerepel a név, születési év, igazolványszám és lakcim.

   CREATE OR REPLACE TYPE t_ember AS OBJECT (
      nev CHAR(20),
      sz_ev NUMBER(4),
      igazolvany_sz CHAR(10),
      cim T_LAKCIM
   );

Hozzon létre egy táblát, amely t_emberek típusú objektumokat tartalmaz.

   CREATE TABLE emberek OF t_ember

Vigyen fel egy új embert a emberek táblába.

   INSERT INTO emberek 
   VALUES (T_EMBER('GABI',1994,'IG1',
      T_LAKCIM(2333,'Dorog','Petofi',23)))

Kérdezze le az ember objektumok OID-jét és az objektumban tárolt ember nevét.

   SELECT REF(e), e.nev 
   FROM emberek e

Módosítsa az IG1 igazolványszámú ember lakcímét egy új értékre.

   UPDATE emberek
   SET cim = t_lakcim(3111,'Ozd','Patak' ,45)
   WHERE igazolvany_sz = 'IG1'

Hozzon létre egy t_ember osztályt, melyben adattagként szerepel a név, születési év, igazolványszám és lakcim. A létrehozott osztályhoz később leszármazott osztályokat kívánunk majd létrehozni.

   CREATE OR REPLACE TYPE t_ember AS OBJECT (
      nev CHAR(20),
      sz_ev NUMBER(4),
      igazolvany_sz CHAR(10),
      cim T_LAKCIM
   ) NOT FINAL

Hozzon létre egy t_ugyfel osztályt, amely a t_ember osztályból származik, és tartalmaz ügyfékód és ügyféltipus valamint belepési dátum adattagokat

    CREATE OR REPLACE TYPE t_ugyfel UNDER t_ember (
      ukod NUMBER(4),
      belepes_datum DATE,
      u_tipus CHAR(3)
   )

Hozza létre az ügyfelek objektumainak tábláját.

    CREATE TABLE ugyfelek OF t_ugyfel

Vigyen fel egy új ügyfél objektumot az ügyfelek táblába.

   INSERT INTO ugyfelek
   VALUES (t_ugyfel('Zoltan',1987,'IG2',
      t_lakcim(4555,'Szolnok','Hatar',45),1,SYSDATE,'LAK'))

Kérdezze le az ügyfelek létszámát városonként.

   SELECT u.cim.varos, COUNT(*) 
   FROM ugyfelek u 
   GROUP BY u.cim.varos

Hozzon létre olyan t_ugyfelek osztályt, amely ügyfelek halmazát tartalmazza.

   CREATE TYPE t_ugyfelek AS TABLE OF t_ugyfel;

Hozzon létre egy ügyek táblát, melyben az ügy paraméterei között szerepel az érintett ügyfelek listája.

   CREATE TABLE ugyek (
      kod NUMBER(2) PRIMARY KEY,
      leiras CHAR(20), 
      resztvevok t_ugyfelek
   )
   NESTED TABLE resztvevok STORE AS s_tabla

Vigyen fel egy új rekordot az ügyek táblába.

   INSERT INTO ugyek 
   VALUES (1,'Macskavita',t_ugyfelek(
      t_ugyfel('Zoltan',1987,'IG2',
      t_lakcim(4555,'Szolnok','Hatar',45),1,SYSDATE,'LAK'),
      t_ugyfel('Feri',1989,'IG5',
      t_lakcim(7623,'Szeged','Hatar',44),2,SYSDATE,'LAK'),
      t_ugyfel('Sanyi',1991,'IG6',
      t_lakcim(2161,'Csolnok','Domb',75),3,SYSDATE,'LAK'))
   )

Listázza ki a 'Macskavita' leírású ügy ügyfeleinek nevét és városát.

   SELECT u.nev, u.cim.varos 
   FROM TABLE 
   (SELECT p.resztvevok 
      FROM ugyek p
      WHERE p.leiras LIKE 'Macskavita%') u

Vegye ki az IG3-as kódú személyt az 1-es kódú ügyek ügyfelei közül (ügyfél kitörlése az ügyfelek listájából)

   DELETE FROM TABLE (
      SELECT p.resztvevok 
      FROM ugyek p 
      WHERE p.kod = 1) 
   u WHERE u.ukod = 1

Vigyen fel egy új ügyfelet az 1-es kódú ügyhöz.

   INSERT INTO TABLE (
      SELECT p.resztvevok
      FROM ugyek p 
      WHERE p.leiras LIKE 'Macskavita%')
   VALUES (t_ugyfel('Zoltan',1987,'IG2',
      t_lakcim(4555,'Szolnok','Hatar',45),1,SYSDATE,'LAK'))

Hozzon létre egy olyan panaszok táblát, ahol a panasz benyújtó ügyfélre hivatkozás tárolódik.

   CREATE TABLE panaszok
   (
      kod NUMBER(3) PRIMARY KEY, 
      leiras CHAR(20), 
      ugyfel REF t_ugyfel
   )

Vigyen fel egy új rekordot a panaszok táblába, melynek ügyfele a Zoltan nevű ügyfél.

   INSERT INTO panaszok VALUES (1,'csendháborítás',
   (SELECT REF(u) FROM ugyfelek u WHERE nev LIKE 'Zoltan%'))

Kérdezzük le a panaszok leírását és az ügyfél nevét.

   SELECT p.leiras, p.ugyfel.nev 
   FROM panaszok p

Kérdezze le a ugyek leírását a részvevő nevével egy eredmény táblázatba.

   SELECT u.leiras, r.nev 
   FROM ugyek u,
   TABLE (
      SELECT resztvevok 
      FROM ugyek v 
      WHERE v.kod = u.kod) r

Definiálon egy olyan osztályt, amely ügyfelekre történő hivatkozások listáját tartalmazza.

   CREATE OR REPLACE TYPE t_ugyfelek_ref AS
   TABLE OF REF t_ugyfel

Hozzon létre egy olyan panaszok táblát, ahol több hivatkozott ügyfél is lehet.

    CREATE TABLE panaszok (
      kod NUMBER(3) PRIMARY KEY, 
      leiras CHAR(20), 
      ugyfelek t_ugyfelek_ref)
    NESTED TABLE ugyfelek STORE AS seged2

Vigyen fel egy új panasz rekordot.

   INSERT INTO panaszok 
   VALUES (1,'Dobverés',t_ugyfelek_ref(
      (SELECT REF(u)FROM ugyfelek u WHERE u.nev = 'Zoltan'),
      (SELECT REF(u) FROM ugyfelek u WHERE u.nev = 'laci'))
   )

Vigyen fel olyan új panasz rekordot, amelyhez nem tartozik ügyfél.

   INSERT INTO panaszok 
   VALUES (3,'labdazas',t_ugyfelek_ref())

Addjon egy új ügyfelet egy panaszhoz.

   INSERT INTO
      TABLE(SELECT ugyfelek FROM panaszok WHERE kod = 3)
   VALUES
      ((SELECT REF(u) FROM ugyfelek u WHERE u.nev LIKE 'dani%' ))

Listázzi ki a panaszok leírását és az ügyfeleinek létszámát.

   SELECT a.leiras, 
      (SELECT count(*) 
       FROM TABLE
          (select ugyfelek FROM panaszok WHERE kod = a.kod))
   FROM panaszok a

Adja meg a panaszok leírását és az ügyfelek nevét egy tábláztban.

   SELECT p.leiras, DEREF(COLUMN_VALUE).nev
   FROM panaszok p, TABLE(p.ugyfelek) r

Listázza ki az ügyfelekénti panaszok darabszámát.

   SELECT t2.C, COUNT(t1.A) 
   FROM
      (SELECT p.leiras A , DEREF(COLUMN_VALUE).nev B
      FROM panaszok p, TABLE(p.ugyfelek) r) t1
   RIGHT OUTER JOIN
      (SELECT nev C FROM ugyfelek) t2
   ON t2.C = t1.B
   GROUP BY t2.C

Hozzon létre olyan t_ember leszármaztatható osztályt, melyhez tartozik két lekérdező metódus. Az egyik metódus az életkort, másik a lakcímet adja vissza.

   CREATE OR REPLACE TYPE t_ember2 AS OBJECT (
      nev CHAR(20),
      szuletesi_ev NUMBER(4),
      igazolvany_szam CHAR(10),
      cim t_kalcim,
      MEMBER FUNCTION eletkor RETURN  NUMBER,
      MEMBER FUNCTION lakcim RETURN  CHAR
   ) NOT FINAL;
   
   
   CREATE OR REPLACE TYPE BODY T_EMBER2 AS
   MEMBER FUNCTION ELETKOR RETURN  NUMBER AS
   BEGIN
      RETURN  TO_NUMBER(TO_CHAR(SYSDATE,'YYYY')) - SELF.SZULETESI_EV;
   END;
   
   MEMBER FUNCTION LAKCIM RETURN  CHAR AS
   BEGIN
      RETURN  TRIM(SELF.CIM.VAROS) || ' ' || TRIM(SELF.CIM.UTCA) ||
      ' ' || TRIM(TO_END;
   END;

Hozza létre az emberek táblát és vigyen fel rekordokat.

   CREATE TABLE emberek2 OF t_ember2;
   INSERT INTO EMBEREK2 
   VALUES
      (t_ember2('Zoli',1987,'IG3',t_lakcim(5565,'Baja','Otto',23)))

Listázza ki az emberek nevét, életkorát és lakcímét.

   SELECT E.NEV, E.ELETKOR(), E.LAKCIM() 
   FROM EMBEREK2 E

Készítsen t_ugyfel osztályt az alábbi metódusokkal: pénz_felvétel, pénz_behelyzés és hitelbírálat.

    CREATE OR REPLACE TYPE T_UGYFEL UNDER T_EMBER (
      UKOD NUMBER(4),
      BELEPES_DATUM DATE,
      MEMBER FUNCTION PENZ_FELVESZ (ERTEK IN NUMBER) RETURN  NUMBER,
      MEMBER FUNCTION PENZ_BETESZ (ERTEK IN NUMBER) RETURN  NUMBER,
      MEMBER FUNCTION HITEL_BIRALAT(ERTEK IN NUMBER) RETURN  NUMBER
   );

DBMS telepítés, karbantartás

MySQL adatbáziskezelő

Ismertesse a mySQL  adatbázis-kezelő telepítési folyamatát!

A telepítő programja letölthető többek között a http://dev.mysql.com/downloads honlapról. A mySQL rendszer telepítése napjainkban viszonylag egyszerű feladattá vált, már ami a kezdeti induló lépéseket illeti. A telepítés során az alábbi paramétereket kell beállítani:

  1. szervergép típusa

  2. adatbázis jellege:

  3. katalógusok kijelölése:

  4. adatkezelés jellege

  5. hálózati kapcsolat engedélyezése

  1. adatbázis karakterkészlet megadása

  2. Root DBMS rendszergazda jelszavának beállítása

  3. A telepítés után az adatbázis objektumok kezelése következhet

Ismertesse a mySQL adatbázis megvalósulási típusait.

A tábla több tárolási módban létezhet, a tárolási mód az elvégzendő műveletekre is kihat.

A főbb tárolási módok:

  1. myISAM tábla: egy egyszerűbb tárolási mód, ahol a tábla adatai több állományba szétosztva helyezkednek el. A felhasznált állománytípusok: adatfile, indexfile és formátum leíró file. Az adatfile alapvetően a rekordok szekvenciáját tartalmazza. A rekord lehet fix és lehet változó hosszúságú. Index esetében fizika szinten a megvalósítás lehet Btree, R-tree és Full-text típusú struktúra. Ezen tárolási mód csak tábla szintű zárolást tud megvalósítani és nem lehet idegen kulcsot és tranzakció kezelést sem alkalmazni.

  1. innoDB tábla: összetett tárolási mechanizus áll mögötte, melyben megvalósítható a tranzakció kezelés, a rekord színtű zárolás, az idegen kulcs ,megkötés érvényesítése és a crash recovery mechanizmus. Hátránya, hogy lassabb az adatkezelés folyamata, de sokkal több funkcionalitást és nagyobb megbízhatóságot nyújt.

  2. memory table: memóriában, heap-ben tárolt adattáblákat jelent ez a mechanizmus. Elsősorban a temporális adatok kezelésére alkalmazzák. Ez a struktúra sem támogatja a tranzakció kezelést és az idegen kulcs megkötéseket, a zárolás itt is csak táblaszintű lehet.

A tábla tárolási típusát a CREATE TABLE parancsnál egy TYPE=tipus taggal jelölhetjük ki.

Ismeretesse a felhasználó kezelésének fontosabb parancsait

Egy új felhasználót e

CREATE USER unev IDENTIFIED BY jelszo

paranccsal lehet létrehozni. A felhasználó objektum hozzáférési jogait a

GRANT muvelet ON objektum TO felhasználó

paranccsal lehet megadni. A teljes adatbázishoz való teljes jogkkört a

GRANT ALL ON dbnev.* TO feljh

utasítás engedélyezi.

Hozzon létre egy tanfolyam adatbázist.

   CREATE DATABASE `Tanfolyam` 
   DEFAULT CHARACTER SET utf8
   COLLATE utf8_hungarian_ci;

Hozzon létre egy kurzus innoDB típusú adattáblát a tanfolyam adatbázisban, a mezők között szerepeljen a megnevezés, létszám adatok, kezdés ideje és a díjadatok.

   CREATE TABLE `Tanfolyam`.`Kurzus` (`ID` VARCHAR( 8 ) NOT NULL ,
   `Megnevezes` VARCHAR( 30 ) NOT NULL , `Min_letszam` INT( 2 )
   NOT NULL ,`Max_letszam` INT( 3 ) NOT NULL `Kezdes_ideje` DATE
   NOT NULL , `Dij` INT( 6 ) NOT NULL ,PRIMARY KEY ( `ID` ))
   ENGINE = InnoDB;

Hozzon létre egy OKTATÓ adattáblát, melyen rekordszintű zárolás hajtható végre. Adja meg a tábla szerkezetében a név, személy igazolvány, email, születési idő és lakcím mezőket.

   CREATE TABLE `Tanfolyam`.`Oktato` (`Szig` VARCHAR(8) NOT NULL,
   `Nev` VARCHAR(30) NOT NULL, `Email` VARCHAR(20) NOT NULL,
   `Szuletesi_ido` DATE NOT NULL, `Irsz` INT(4) NOT NULL CHECK
   (`Irsz`>999), `Varos` VARCHAR(40) NOT NULL, `Utca` VARCHAR(40)
   NOT NULL, `Hsz` VARCHAR(6) NOT NULL, PRIMARY KEY (`Szig`))
   ENGINE = InnoDB;

Készítsen hallgató, és kurzus_oktató, kurzus_hallgató kapcsoló táblákat.

   CREATE TABLE `Tanfolyam`.`Hallgato` (`Szig` VARCHAR(8) NOT NULL,
   `Nev` VARCHAR(30) NOT NULL, `Email` VARCHAR(20) NOT NULL,
   `Szuletesi_ido` DATE NOT NULL, `Irsz` INT(4) NOT NULL CHECK
   (`Irsz`>999), `Varos` VARCHAR(40) NOT NULL, `Utca` VARCHAR(40)
   NOT NULL, `Hsz` VARCHAR(6) NOT NULL, PRIMARY KEY (`Szig`))
   ENGINE = InnoDB;
   
   CREATE TABLE `Tanfolyam`.`Kurzus_Oktato` (`Kurzus` VARCHAR( 8 )
   NOT NULL REFERENCES `Tanfolyam`.`Kurzus`, `Oktato` VARCHAR( 8 )
   NOT NULL REFERENCES `Tanfolyam`.`Oktato`)
   ENGINE = InnoDB;
   
   CREATE TABLE `Tanfolyam`.`Kurzus_Hallgato` (`Kurzus` VARCHAR( 8 )
   NOT NULL REFERENCES `Tanfolyam`.`Kurzus`, `Hallgato` VARCHAR( 8 )
   NOT NULL REFERENCES `Tanfolyam`.`Hallgato`)
   ENGINE = InnoDB;

Kérdezze le milyen adattáblák vannak az aktuális adatbázisban.

SHOW TABLES

Kérdezze le a Hallgató tábla szerkezetét.

DESCRIBE Hallgato

Oracle adatbáziskezelő

Ismertesse az Oracle adatbázis-kezelő fajtáit!

Az Oracle Database 11g a világ piacvezető adatbáziskezelője, mivel a felhasználók különböző igényeihez tud igazodni. Emiatt az Oracle adatbázisa négyféle változatban is elérhető a különböző igények kielégítése miatt:

Oracle Database 10g Express Edition (XE): Ingyenesen használható fejlesztésre, kis helyigényű, gyorsan letölthető és egyszerűen kezelhető. Felhasználók: PHP, Java, .NET, XML alkalmazásfejlesztők, DBA-k (Database Administrator), független szoftver- és hardvergyártók, iskolák és diákok.

Oracle Database Standard Edition: Legalább 5 felhasználó esetén alkalmazható, 4 socket esetén. A Real Application Cluster (RAC) használatával csak azokat a részeit kell megvennünk a programnak, amiket használni fogunk, és ha változás történik a cégnél, akkor bővíthetjük az adatbázis funkcióit, ezáltal csökkenek a vállalati kiadások.

Oracle Database Standard Edition One: A Standard Edition egyszerűsített verziója, ami minimum 5 felhasználós rendszereknél használható, 2 socket esetén. Olyan vállalati megoldás, ami biztonságos, könnyen kezelhető és az adott vállalatra optimalizálható.

Oracle Database 11g Enterprise Edition: Nagyvállalatok számára a legjobb megoldás, akár egy  akár több rendszerből épül fel a konfiguráció. Védelmet nyújt a szerver hibáktól kezdve az emberi mulasztásig, különböző szolgáltatásokat biztosít az OLTP (online tranzakciókezelés), a BI (üzleti intelligencia) terén...

A négy verzió összehasonlítása:

Jellemző

Express Edition 10g

Standard Edition One

Standard Edition

Enterprise Edition

Maximum

1 CPU

2 foglalat

4 foglalat

korlátlan

RAM

1 GB

OS Max

OS Max

OS Max

Adatbázis méret

4 GB

korlátlan

korlátlan

korlátlan

Ismertesse az Oracle adatbázis-kezelő telepítési folyamatát!

Oracle XE telepítése

Az ingyenes Oracle Database Express Edition 10g letölthető az Oracle hivatalos honlapjáról Windows illetve Linux operációs rendszerekre is:

http://www.oracle.com/technetwork/database/express-edition/downloads/index.html.

A letöltéshez szükség van egy Oracle fiók létrehozására, enélkül a programot nem engedi letölteni a rendszer.

A telepítő a létrehozandó adatbázishoz szükséges adatokat kér a felhasználótól. Először a jövőbeni adatbázis jelszavát kell megadni, ami majd a SYS és a SYSTEM adatbázis jelszava is lesz.

2.40. ábra - Oracle XE telepítő űrlapja: adatbázis jelszavak beállítása

Oracle XE telepítő űrlapja: adatbázis jelszavak beállítása

A jelszó beírása után kapunk egy összegzést arról, hogy mi hova lesz majd feltelepítve és ha jók az adatok, akkor a Tovább gombra kattintva elindul a telepítés.

2.41. ábra - Oracle XE telepítő űrlapja: bejelentkezés

Oracle XE telepítő űrlapja: bejelentkezés

A telepítés elvégzése után el is érhetjük a rendszert a böngészőn keresztül, ahol a SYSTEM felhasználónévvel az előbb megadott jelszóval tudunk belépni az adatbázisunkba.

Ismertesse az adatbázis létrehozásának folyamatát Oracle adatbázis-kezelőben!

Adatbázis táblák létrehozására többféle módot is kínál az XE. Dolgozhatunk a grafikus felület segítségével, illetve SQL parancsokkal is.

2.42. ábra - Oracle XE telepítő űrlapja: object browser

Oracle XE telepítő űrlapja: object browser

Az első lehetőség az Object Browser menüponton belül érhető el, ami bejelentkezés után a kezdőoldalon található. Válasszuk a Create és azon belül a Table menüpontot.

2.43. ábra - Oracle XE űrlapja: tábla létrehozás

Oracle XE űrlapja: tábla létrehozás

Egy tábla létrehozásához meg kell adni a tábla nevét, ami nem tartalmazhat szóközt, nem kezdődhet számmal vagy alulvonással. Ezután az oszlopneveket és az oszlopok tulajdonságait kell megadni.

Az adattípusok:

  1. NUMBER: szám, pontossága (1-38) és hossza (-84-127) megadható

  2. VARCHAR2: string (1-4000 bájt)

  3. DATE: dátum

  4. TIMESTAMP: másodpercben megadott időbélyeg

  5. CHAR: fix hosszúságú karakterek (1-2000 bájt)

  6. CLOB: character Large Object (8TB)

  7. BLOB: binary Large Object (8TB)

  8. NVARCHAR2

  9. BINARY_FLOAT

  10. BINARY_DOUBLE       

Az adattípuson és a típushoz kapcsoló adatokon kívül az is beállítható, hogy kötelező-e a mezőnek értéket adni (Not Null).

Ezután az elsődleges kulcsok beállítását kéri a rendszer, amennyiben meg akarunk adni.

Az elsődleges kulcsok után az idegen kulcsok megadása következik, végül pedig beállíthatunk megkötéseket is, amik két csoportba sorolhatók:

  1. Check: Ha valamelyik oszlop értékét ellenőrizni akarjuk (például az életkor 0-100 közé essen).

  2. Unique: Ha egy oszlopban csak különböző értékek lehetnek.

2.44. ábra - Oracle XE űrlapja: kulcs megadása

Oracle XE űrlapja: kulcs megadása

Ha mindent jól adtunk meg, akkor ezután a rendszer jelzi a tábla létrejöttét. Másik lehetőség, hogy SQL parancs futtatásával hozzuk létre a táblát. Ekkor a kezdőoldalon az SQL menüt kell választani:

Ismertesse a táblák kezelését Oracle adatbázis-kezelőben!

A táblák módosítása szintén az Object Browser vagy SQL parancs segítségével történhet.

Az Object Browsert használva, ha kiválasztottuk a módosítandó táblát, akkor a következő lehetőségek közül választhatunk a különböző fülek alatt:

  1. Add column: oszlop hozzáadása

  2. Modify column: oszlop módosítása

  3. Rename column: oszlop átnevezése

  4. Drop column:         oszlop törlése

  5. Rename: tábla átnevezése

  6. Copy: tábla másolása

  7. Drop: tábla törlése

  8. Truncate

  9. Create Lookup Table

  10. Query: adatlekérdezés

  11. Count rows: sorok száma

  12. Insert row: sor beszúrása

Ezeken kívül lehetőség van a megkötések módosítására / törlésére / létrehozására / be- és kikapcsolására, a különböző felhasználók jogainak beállítására, triggerek be- és kikapcsolására is.

Ha SQL parancsokkal szeretnénk a táblák kezelését megvalósítani, akkor ugyanúgy kell eljárni, mint a 4.2.3-nál.

Ismertesse a felhasználók kezelésének, karbantartásának folyamatát Oracle adatbázis-kezelőben!

A felhasználók menedzseléséhez az Administration menüben találhatunk eszközöket:

2.45. ábra - Oracle XE űrlapja: user menedzsment

Oracle XE űrlapja: user menedzsment

A Manage Users menüpontot választva tudunk az adatbázis felhasználói között keresni, majd ezután tudjuk a kiválasztott felhasználó beállításait megnézni, módosítani.

Lehetőség van a felhasználó jelszavának megváltoztatására, privilégiumok csatolására, azaz hogy milyen műveletek végrehajtására jogosult a rendszerben.

Szerepkörök (Roles)

Közvetlenül adott rendszerprivilégiumok (Directly Grantes System Privileges): Ennél a résznél állíthatjuk be, hogy az adott felhasználó milyen műveletek végrehajtására jogosult. Például táblakészítés, view-készítés, procedúra létrehozása, trigger létrehozása...

Ismertesse az Oracle adatbázis-kezelő védelmi mechanizmusait!

Az Express Editionben a biztonsági beállításokat a Utilities menüpontból érhetjük el:

Itt lényegesen kisebb a biztonság, mint egy nagyvállalati adatbázis-kezelő esetén, ahol az Oracle folyamatosan fejleszti az adatok védelméért felelős programokat.

Oracle Data Guard

Az adatbázisunk adatainak védelméről az Oracle Data Guard gondoskodik, ami olyan felügyeleti, működésfigyelési és automatizálási szoftverinfrastruktúra, amely egy vagy több tartalék adatbázis létrehozásával, karbantartásával és folyamatos készenlétének biztosításával védi a szervezet adatait.

Oracle Advanced Security

A hálózati titkosításért, a transzparens adattitkosításért, a hatósági és belső előírások érvényesítéséről az Oracle Advanced Security gondoskodik.

Az Oracle adatbáziskezelőben az érzékeny adatok automatikusan titkosításra kerülnek, a transzparens adattitkosító mechanizmus a rendszerbe van ágyazva.

Adattitkosításhoz elég egy alter table SQL parancs kiadása:

ALTER TABLE táblanév modify(titkosítandó_adat encrypt no salt)

Hálózaton küldött adatok védelme

2.46. ábra - Oracle biztonság

Oracle biztonság

Többféle lehetőség közül választhat a felhasználó, például az Oracle Advanced Security natív titkosító és adattitkosítási algoritmusai közül, illetve az SSL közül.

Oracle Label Security

2.47. ábra - Oracle Label Security

Oracle Label Security

Az adatvédelemért az Oracle Label Security a felelős, ami az adatok biztonsági besorolását és a felhasználói jogosultságokat veszi alapul.

Biztonsági újítások az Oracle Database 11g-ben

  1. táblatér szintű transparent data encryptyon

  2. hardveres kulcsok támogatása

  3. megnövelt jelszó biztonság, mint például case-sensitive jelszavak, multibyte-os jelszavak, erősebb password-hash titkosítás (SHA-1, salt)

  4. erős authentikáció SYSDBA és SYSOPER esetén

  5. fejlettebb Kerberos támogatás

A leírtak mellett rengeteg más lehetőség is van a szervezet biztonsági rendszerének megerősítésére:

  1. Virtual Private Database

  2. Global Application Context: biztonságfelügyelet

  3. Fine Grained Auditing: kontextusalapú biztonsági auditálás

  4. Enterprise User Security: adatbázis-felhasználók felügyelete

  5. Secure Application Roles: adatbázis-objektumok hozzáférési jogosultságainak policy alapú szabályozása ...

Ismertesse az adatbázis mentések, import, export folyamatát Oracle adatbázis-kezelőben!

A mentésekért a Recovery Manager a felelős, ami a mentések adatait (mikor mi és hogyan lett lementve, hol vannak a másolatok, a log mentések adatai, a lementett adatbázis  sémája, mentési rutinok) egy recovery katalógusban tárolja.

A mentésnek különböző típusai vannak:

  1. teljes: az adatbázis lezárt, nem használható

  2. részleges

  3. inkrementális: csak az utolsó módosítás utáni adatok íródnak ki

  4. kommulatív: az előző inkrementális mentések együttes hatásának letárolása

  5. nyitott: nyitott adatbázis melletti

  6. konzisztens: minden adatfájl egy időpontra igazított

  7. inkonzisztens: az egyes adatfájlok különböző időpontokra igazítottak

Az importálás/exportálás célja az Oracle adatbáziok közötti adatmozgatás megvalósítása, erre saját specifikus Oracle formátumot használ.

Export: az adatbázis egyes szeleteinek kiemelése más formátumú leírásba, módjai:

  1. table: megadott táblák

  2. user: megadott felhasználók adati

  3. full: teljes adatbázis

Import: más forrásból származó adatok beépítése az adatbázisba

PL/SQL

PL/SQL blokk feladatok

Ismertesse a PL/SQL blokk általános szerkezetét!

   [declare
      Konstansok
      Változók
      Kurzor
      Kivétel
   ]
   begin
       pl/sql utasítások
   [ exception kezelés]
   end;

Írjon egy oylan PL/SQL programot ami kiírja a kimenetre hogy "Hello World"!

   begin
       dbms_output.put_line('hello world');
   end;

Írjon egy olyan PL/SQL programot amely összead két számot és kiírja a kimenetre!

   DECLARE
      s number;
   BEGIN
      s := (5+3);
      dbms_output.put_line(TO_CHAR(s));
   END;

Írjon egy olyan PL/SQL programot amely összeszoroz két számot és kiírja a kimenetre!

   declare
      a number default 10;
      b number default 20;
      s number;
   begin
      s:= a*b;
      dbms_output.put_line(TO_CHAR(s));
   end;

Írjon egy olyan PL/SQL programot amely kiírja a "Hello World" szöveget csupa nagy illetve kis betűkkel a kimenetére!

   declare
      t VARCHAR(20) := 'Hello World';
   begin
      SELECT UPPER(t) INTO t FROM dual;
      dbms_output.put_line((t));
   
      SELECT LOWER(t) INTO t FROM dual;
      dbms_output.put_line((t));
   
      SELECT INITCAP(t) INTO t FROM dual;
      dbms_output.put_line((t));
   end;                

Írjon egy olyan PL/SQL programot amely összefűzve kiírja a kimenetére a "Hello " és a "World" string-eket!

   DECLARE
      t1 VARCHAR(10) := 'Hello ';
      t2 VARCHAR(10) := 'World!';
      t VARCHAR(20) := '';
   BEGIN
      SELECT CONCAT(t1,t2) INTO t FROM dual;
      dbms_output.put_line(t);
   END;

Írjon egy olyan PL/SQL programot amely kiírja az aktuális rendszeridőt!

   DECLARE
      d DATE;
   BEGIN
      SELECT sysdate INTO d FROM dual;
      dbms_output.put_line(d);
   END;

Írjon egy olyan PL/SQL programot amely kiírja a rendszeridőt 'YYYY-MM-DD' formátumban!

   DECLARE
      t VARCHAR(30);
   BEGIN
      SELECT TO_DATE(SYSDATE,'YYYY-MM-DD')INTO t FROM dual;
      dbms_output.put_line(t);
   
      SELECT TO_DATE(SYSDATE,'DD-MM-YYYY')INTO t FROM dual;
      dbms_output.put_line(t);
   END;

Írjon egy olyan PL/SQL programot amely lekérdezi a vásárlók neveit és letárolja a megfelelő típusba %type segítségével!

   DECLARE
      name vasarlo.nev%type;
   BEGIN
      SELECT nev INTO name FROM vasarlo WHERE id = 11;
      dbms_output.put_line(name);
   END;

Írjon egy olyan PL/SQL programot amely lekérdezi egy vásárló adatait és letárolja az adatokat a megfelelő %type típusú változókba!

   DECLARE
      id vasarlo.id%type;
      name vasarlo.nev%type;
      mail vasarlo.mail%type;
      mobil vasarlo.mobil%type;
      address vasarlo.cim%type;
      aktiv vasarlo.aktiv%type;
   BEGIN
      SELECT id,nev,mail,mobil,cim,aktiv INTO id,name,mail,mobil,address,aktiv FROM vasarlo WHERE id = 11;
      dbms_output.put_line(id|| ' '|| name||' '||mail||' '||mobil||' '||address||' '||aktiv);
   END;

Írjon egy olyan PL/SQL programot amely lekérdezi egy adott vásárló rekordot és letárolja egy %rowtype típusú változóba!

   DECLARE
      row vasarlo%rowtype;
   BEGIN
      SELECT * INTO row FROM vasarlo WHERE id = 11;
      dbms_output.put_line(row.id|| ' '|| row.nev||' '||row.mail||' '||row.mobil||' '||row.cim||' '||row.aktiv);
   END;

Vezérlési szerkezet feladatok

Ismertesse az IF szerkezetet!

   IF feltetel THEN
      utasitas
   [ ELSIF feltetel THEN
      utasitas]
   [ELSE
      utasitas]
   END IF;

Írjon egy olyan PL/SQL programot amely eldönti két szám közül hogy melyik a nagyobb!

   DECLARE
      a number := 10;
      b number := 81;
   BEGIN
      IF a > b THEN
        dbms_output.put_line('Az "a" szam a nagyobb!!!');
      ELSE
        dbms_output.put_line('A "b" szam a nagyobb!!!');
      END IF;
   END;

Írjon egy olyan PL/SQL programot amely eldönti egy számról hogy bele esik e két másik szám által megadott intervallumba!

   DECLARE
      minimum number := 10;
      maximum number := 100;
      ertek number := 50;
   BEGIN
      IF ertek < minimum THEN
        dbms_output.put_line('Tul kicsi!!!');
      ELSIF maximum < ertek THEN
        dbms_output.put_line('Tul nagy!!!');
      ELSE
        dbms_output.put_line('OK!!!');
      END IF;
   END;

Ismertesse a Swith Case szerkezetet!

   CASE
           WHEN  feltetel THEN utasitasok
           WHEN  feltetel THEN utasitasok
           ...
           ELSE utasitasok
   END CASE;

Írjon egy olyan PL/SQL programot amely a beosztás rövidítése alapján megadja, a dolgozó teljes beosztását!

   DECLARE
      beosztas VARCHAR(10) := 'coder';
   BEGIN
     CASE
       WHEN beosztas = 'dev' THEN dbms_output.put_line('Fejleszto, tervezo');
       WHEN beosztas = 'root' THEN dbms_output.put_line('Rendszergazda (UNIX/LINUX)');
       WHEN beosztas = 'admin' THEN dbms_output.put_line('Rendszergazda (Windows)');
       WHEN beosztas = 'dba' THEN dbms_output.put_line('Adatbazis Adminisztrator');
       WHEN beosztas = 'coder' THEN dbms_output.put_line('Programozo');
       WHEN beosztas = 'sec' THEN dbms_output.put_line('Adminisztrativ');
       ELSE dbms_output.put_line('egyedi munkakor');
     END CASE;
   END;

Írjon egy olyan PL/SQL programot amely eldönti három számról hogy alkothat e háromszöget!

   DECLARE
     a number := 3;
     b number := 4;
     c number := 5;
   BEGIN
     IF (a > b+c) or (b > a+c) or (c > a+b) THEN
       dbms_output.put_line('A '||a||' '||b||' '||c||' szamharmas nem alkot haromszoget!!!');
     ELSE
       dbms_output.put_line('A '||a||' '||b||' '||c||' szamharmas haromszoget alkot!!!');
     END IF;
   END;

Írjon egy olyan PL/SQL programot amely a háromszög három oldala ismeretében kiszámolja a területét a Heron képlet segítségével!

   DECLARE
      a number := 3;
      b number := 4;
      c number := 5;
      s number;
      t number;
   BEGIN
      IF (a > b+c) or (b > a+c) or (c > a+b) THEN
        dbms_output.put_line('A '||a||' '||b||' '||c||' szamharmas nem alkot haromszoget!!!');
      ELSE
        s := (a+b+c)/2;
        t := SQRT(s*(s-a)*(s-b)*(s-c));
        dbms_output.put_line('A '||a||' '||b||' '||c||' szamharmas haromszoget alkot, aminek a terulete '||t||'!!!');
      END IF;
   END;

Ismertesse a Loop ciklust PL/SQL-ben!

   LOOP
      utasitasok;
   END LOOP;

Ismertesse a While ciklust PL/SQL-ben!

   WHILE feltetel  LOOP
      utasitasok
   END LOOP;

Ismertesse a For ciklust PL/SQL-ben!

   FOR i IN lista LOOP
      utasitasok
   END LOOP;

Írjon egy olyan PL/SQL programot amely kiírja 1-től n-ig a számokat!

   DECLARE
      n number := 10;
   BEGIN
      FOR i IN 1..n LOOP
        dbms_output.put_line(TO_CHAR(i));
      END LOOP;
   END;

Írjon egy olyan PL/SQL programot amely kiírja az első n darab Fibonacci számot!

   DECLARE
      n number := 10;
      f0 number := 0; -- f_{n-2}
      f1 number := 1; -- f_{n-1}
      fa number := 2; -- f_{n}
   BEGIN
      FOR i IN 1..n LOOP
        fa := f0 + f1;
        f0 := f1;
        f1 := fa;
        dbms_output.put_line(TO_CHAR(fa));
      END LOOP;
   END;

Írjon egy olyan PL/SQL programot amely eldönti egy n számról hogy prím szám e!

   DECLARE
     n number := 10;
     gyok number;
     gyoke boolean := true;
   BEGIN
     gyok := ROUND(SQRT(n));
     FOR i IN 2..gyok LOOP
       IF (mod(n,i) = 0) and (gyoke = true) THEN
         gyoke := false;
         dbms_output.put_line(n||' oszthato '||i||'-vel');
       END IF;
     END LOOP;
   
     IF gyoke = true THEN
        dbms_output.put_line(n||' prim szam!!!');
     ELSE
        dbms_output.put_line(n||' nem prim szam!!!');
     END IF;
   END;

Hibakezelés feladatok

Soroljon fel néhány gyári kivételt a PL/SQL-ben!

   INVALID_CURSOR
   CURSOR_ALREADY_OPEN
   ZERO_DIVIDE

Írjon egy olyan PL/SQL programot amely ZERO_DIVIDE kivételt dob!

   BEGIN
      dbms_output.put_line(4/0);
   END;

Írjon egy olyan PL/SQL programot amely ZERO_DIVIDE kivételt dob és lekezeli!

   BEGIN
      dbms_output.put_line(4/0);
   EXCEPTION
      WHEN ZERO_DIVIDE THEN
      dbms_output.put_line('0-val nem lehet osztani!!!');
   END;

Írjon egy olyan PL/SQL programot amelyben saját kivételt definiál és kezel ( a kivétel akkor keletkezzen ha a szám páros )!

   DECLARE
      n number := 10;
      paros EXCEPTION;
   BEGIN
      FOR i IN  1..n LOOP
        IF mod(i,2) = 0 THEN 
          RAISE paros;
        END IF;
        dbms_output.put_line(i);
      END LOOP;
   EXCEPTION
      WHEN paros THEN
       dbms_output.put_line('paros');
   END;

Írjon egy olyan PL/SQL programot amelyben egy CURSOR-t kétszer akar megnyitni és kivétel keletkezik

   DECLARE
      CURSOR c1 IS SELECT * FROM VASARLO;
   BEGIN
     OPEN c1;
     OPEN c1;
   
   EXCEPTION
     WHEN CURSOR_ALREADY_OPEN THEN
      dbms_output.put_line('A CURSOR mar meg van nyitva');
   END;

Lekérdezés feladatok

Eredmények tárolása változókban

Írjon egy olyan PL/SQL programot amelyben a vásárló nevét egy változóba tárolja, adja meg a hiba lehetőségét!
   DECLARE
      name VARCHAR(5);
   BEGIN
      SELECT nev INTO name FROM vasarlo WHERE id = 11;
      dbms_output.put_line(name);
   END;
Írjon egy olyan PL/SQL programot amely a vásárló nevét tárolja le %type típusú változóba, hasonlítsa össze az előző példával a jelen példát!
   DECLARE
       name vasarlo.nev%type;
   BEGIN
       SELECT nev INTO name FROM vasarlo WHERE id = 11;
        dbms_output.put_line(name);
   END;
Írjon egy olyan PL/SQL programot amelyben több mezőt is kinyer a %type típusú változókba!
   DECLARE
     id vasarlo.id%type;
     name vasarlo.nev%type;
     mail vasarlo.mail%type;
     mobil vasarlo.mobil%type;
     address vasarlo.cim%type;
     aktiv vasarlo.aktiv%type;
   BEGIN
     SELECT id,nev,mail,mobil,cim,aktiv INTO id,name,mail,mobil,address,aktiv FROM vasarlo WHERE id = 11;
     dbms_output.put_line(id|| ' '|| name||' '||mail||' '||mobil||' '||address||' '||aktiv);
   END;
Írjon egy olyan PL/SQL programot amelyben a lekérdezés eredményét egy %rowtype változóba tárolja le!
   DECLARE
      row vasarlo%rowtype;
   BEGIN
     SELECT * INTO row FROM vasarlo WHERE id = 11;
     dbms_output.put_line(row.id|| ' '|| row.nev||' '||row.mail||' '||row.mobil||' '||row.cim||' '||row.aktiv);
   END;
Írjon egy olyan PL/SQL programot amely lekérdezi hogy egy adott vásárló aktív e, vegye észre, hogy a megadott típus nem Boolean és a mezőnek Boolean-t kéne visszaadnia!
   DECLARE
      aktiv VARCHAR(5);
   BEGIN
      SELECT aktiv INTO aktiv FROM vasarlo WHERE id = 11;
      dbms_output.put_line(aktiv);
   END;
Írjon egy olyan PL/SQL programot amely az előző példát valósítja meg, de az aktív mező szám érétket kap!
   DECLARE
      aktiv NUMBER;
   BEGIN
      SELECT aktiv INTO aktiv FROM vasarlo WHERE id = 11;
      dbms_output.put_line(aktiv);
   END;
Írjon egy olyan PL/SQL programot amely egyszerre használ %type és más típust egy lekérdezésben!
   DECLARE
      aktiv NUMBER;
      nev vasarlo.nev%type;
   BEGIN
      SELECT aktiv,nev INTO aktiv,nev FROM vasarlo WHERE id = 11;
      dbms_output.put_line(nev||' '||aktiv);
   END;
Ismertesse a SELECT  szerkezetét a PL/SQL blokkban!
   SELECT mezoneve INTO valtozok listaja FROM ...

Kurzorkezelés

Ismertesse a CURSOR definiálás formalizmusát!
   CURSOR c_nev IS SELECT ...
Ismertesse a paraméteres CURSOR definiálás formalizmusát!
   CURSOR c_nev(paramterek) IS SELECT ...
Írjon egy olyan PL/SQL programot amely cursor segítségével lekérdezi a vásárlók tábla adatait!
   declare
      mobil vasarlo.mobil%TYPE;
      cim vasarlo.cim%TYPE;
       cursor cVasarlo is select mobil,cim from vasarlo;
   begin
      open cVasarlo;
      loop
        fetch cVasarlo into mobil,cim;
        dbms_output.put_line('mobil: '||mobil||' cim: '||cim);
        exit when cVasarlo%NOTFOUND;
      end loop;
      close cVasarlo;
   end;
Írjon egy olyan PL/SQL programot amely lekérdezi az aktív vásárlók adatait!
   declare
      mobil vasarlo.mobil%TYPE;
      cim vasarlo.cim%TYPE;
      cursor cVasarlo is select mobil,cim from vasarlo where aktiv=1;
   begin
      open cVasarlo;
      loop
        fetch cVasarlo into mobil,cim;
        dbms_output.put_line('mobil: '||mobil||' cim: '||cim);
        exit when cVasarlo%NOTFOUND;
      end loop;
      close cVasarlo;
   end;
Írjon egy olyan PL/SQL programot amely lekérdezi a vásárlók adatait és FOR ciklus segítségével dolgozza fel a CURSOR-t!
   declare
      v vasarlo%ROWTYPE;
      cursor cVasarlo is select * from vasarlo;
   begin
      --open cVasarlo;
      for v in cVasarlo loop
        dbms_output.put_line('mobil: '||v.mobil);
        dbms_output.put_line('cim :  '||v.cim);
      end loop;
      --close cVasarlo;
   end;
Írjon egy olyan PL/SQL programot amely lekérdezi a paraméterként adott aktivitású vásárlók adatait!
   declare
      mobil vasarlo.mobil%TYPE;
      cim vasarlo.cim%TYPE;
      cursor cVasarlo(a vasarlo.aktiv%type) is select mobil,cim from vasarlo where aktiv=a;
   begin
      open cVasarlo(1);
      loop
        fetch cVasarlo into mobil,cim;
        dbms_output.put_line('mobil: '||mobil||' cim: '||cim);
        exit when cVasarlo%NOTFOUND;
      end loop;
      close cVasarlo;
   end;

Módosítható kurzorok

Ismertesse a módosítható CURSOR definiálását!
   CURSOR cnev IS SELECT ... FOR UPDATE;
Ismertesse a módosítás parancsát módosítható CURSOR segítségével!
   UPDATE tabla SET mezo = ertek WHERE CURRENT OF cnev;
Írjon egy olyan PL/SQL programot amely az inaktív vásárlók nevét 'Lajhar Lajos'-ra módosítja!
   DECLARE
      vVasarlo vasarlo%rowtype;
      CURSOR cVasarlo IS SELECT * FROM vasarlo FOR UPDATE;
   BEGIN
      --OPEN cVasarlo;
      FOR vVasarlo IN cVasarlo LOOP
        IF vVasarlo.aktiv = 0 THEN
           UPDATE vasarlo SET nev = 'Lajhar Lajos' WHERE CURRENT OF cVasarlo;
        END IF;
     END LOOP;
   END;
Írjon egy olyan PL/SQL programot amely a Lajosok nevét átalakítja LajosX-re ahol X a sorszám!
   DECLARE
      i NUMBER;
      CURSOR cVasarlo IS select * from vasarlo where nev like '%Lajos%' FOR UPDATE;
   BEGIN
      i := 1;
      FOR vVasarlo IN cVasarlo LOOP
        UPDATE vasarlo SET nev = CONCAT('Lajos',i) WHERE CURRENT OF  cVasarlo;
        i := i+1;
      END LOOP;
   END;

Tárolt eljárások, függvények, aktív elemek

Tárolt eljárások

Oracle csomagok, eljárások, függvények

Hozzon létre PL/SQL csomagot, amely a „vevő” táblát kezeli: adatfelvitelt, adatmódosítást, adattörlést valósítson meg!
   CREATE OR REPLACE PACKAGE vevo_csomag AS
      PROCEDURE insert_vevo (ugy IN vevo.ugyfelszam%TYPE, n IN 
        vevo.nev%TYPE, e IN vevo.e_mail%TYPE, t IN vevo.tel%TYPE, ir IN vevo.i%TYPE, va IN vevo.v%TYPE, ut IN vevo.u%TYPE, haz IN vevo.hsz%TYPE);
      PROCEDURE delete_vevo (ugy IN vevo.ugyfelszam%TYPE);
      PROCEDURE update_vevo (ugy IN vevo.ugyfelszam%TYPE, n IN 
       vevo.nev%TYPE, e IN vevo.e_mail%TYPE, t IN vevo.tel%TYPE, ir IN vevo.i%TYPE, va IN vevo.v%TYPE, ut IN vevo.u%TYPE, haz IN vevo.hsz%TYPE);
   END vevo_csomag;
Hozza létre a csomagtörzset az 6.1.1/1. feladatban létrehozott csomaghoz!
   CREATE OR REPLACE PACKAGE BODY vevo_csomag AS
     PROCEDURE insert_vevo (ugy IN vevo.ugyfelszam%TYPE, n IN 
      vevo.nev%TYPE, e IN vevo.e_mail%TYPE, t IN vevo.tel%TYPE, ir IN vevo.i%TYPE, va IN vevo.v%TYPE, ut IN vevo.u%TYPE, haz IN vevo.hsz%TYPE) AS
     BEGIN
        INSERT INTO vevo VALUES(ugy, n, e, t, ir, va, ut, haz);
     END;
     PROCEDURE delete_vevo (ugy IN vevo.ugyfelszam%TYPE) AS
     BEGIN
        DELETE FROM vevo WHERE ugyfelszam = ugy;
     END;
     PROCEDURE update_vevo (ugy IN vevo.ugyfelszam%TYPE, n IN 
       vevo.nev%TYPE, e IN vevo.e_mail%TYPE, t IN vevo.tel%TYPE, ir IN vevo.i%TYPE, va IN vevo.v%TYPE, ut IN vevo.u%TYPE, haz IN vevo.hsz%TYPE) AS
     BEGIN
        UPDATE vevo SET nev = n, e_mail = e, tel = t, i = ir, v = va, u = ut, hsz = haz WHERE ugyfelszam = ugy;
     END;
   END vevo_csomag;
Hozzon létre PL/SQL csomagot, amely a „szolgáltató” táblát kezeli: adatfelvitelt, adatmódosítást, adattörlést valósítson meg!
   CREATE OR REPLACE PACKAGE szolgaltato_csomag AS
     PROCEDURE insert_szolgaltato (ca IN 
       szolgaltato.cegazonosito%TYPE, n IN szolgaltato.nev%TYPE, ir IN szolgaltato.i%TYPE, va IN szolgaltato.v%TYPE, ut IN szolgaltato.u%TYPE, haz IN szolgaltato.hsz%TYPE);
     PROCEDURE delete_szolgaltato (ca IN 
       szolgaltato.cegazonosito%TYPE);
     PROCEDURE update_szolgaltato (ca IN 
      szolgaltato.cegazonosito%TYPE, n IN szolgaltato.nev%TYPE, ir IN szolgaltato.i%TYPE, va IN szolgaltato.v%TYPE, ut IN szolgaltato.u%TYPE, haz IN szolgaltato.hsz%TYPE);
   END szolgaltato_csomag;
Hozza létre a csomagtörzset az 6.1.1/3. feladatban létrehozott csomaghoz!
   CREATE OR REPLACE PACKAGE BODY szolgaltato_csomag AS
     PROCEDURE insert_szolgaltato (ca IN 
      szolgaltato.cegazonosito%TYPE, n IN szolgaltato.nev%TYPE, ir IN szolgaltato.i%TYPE, va IN szolgaltato.v%TYPE, ut IN szolgaltato.u%TYPE, haz IN szolgaltato.hsz%TYPE) IS
     BEGIN
         INSERT INTO szolgaltato VALUES(ca, n, ir, va, ut, haz);
     END;
     PROCEDURE delete_szolgaltato (ca IN szolgaltato.cegazonosito%TYPE) IS
     BEGIN
         DELETE FROM szolgaltato WHERE cegazonosito = ca;
     END;
     PROCEDURE update_szolgaltato (ca IN 
      szolgaltato.cegazonosito%TYPE, n IN 
      szolgaltato.nev%TYPE, ir IN szolgaltato.i%TYPE, va IN szolgaltato.v%TYPE, ut IN szolgaltato.u%TYPE, haz IN szolgaltato.hsz%TYPE) IS
     BEGIN
         UPDATE szolgaltato SET nev = n, i = ir, v = va, u = ut, 
         hsz = haz WHERE cegazonosito = ca;
     END;
   END szolgaltato_csomag;
Hozzon létre PL/SQL csomagot, amely a „mobiltelefon” táblát kezeli: adatfelvitelt, adatmódosítást, adattörlést valósítson meg!
   CREATE OR REPLACE PACKAGE mobiltelefon_csomag AS
     PROCEDURE insert_mobiltelefon (csz IN 
       mobiltelefon.cikkszam%TYPE, l IN mobiltelefon.leiras%TYPE, a IN mobiltelefon.ar%TYPE, t IN mobiltelefon.tipusa%TYPE);
     PROCEDURE delete_mobiltelefon (csz IN 
      mobiltelefon.cikkszam%TYPE);
     PROCEDURE update_mobiltelefon (csz IN 
      mobiltelefon.cikkszam%TYPE, l IN mobiltelefon.leiras%TYPE, a IN mobiltelefon.ar%TYPE, t IN mobiltelefon.tipusa%TYPE);
   END mobiltelefon_csomag;
Hozza létre a csomagtörzset az 6.1.1/5. feladatban létrehozott csomaghoz!
   CREATE OR REPLACE PACKAGE BODY mobiltelefon_csomag AS
     PROCEDURE insert_mobiltelefon (csz IN 
      mobiltelefon.cikkszam%TYPE, l IN mobiltelefon.leiras%TYPE, a IN mobiltelefon.ar%TYPE, t IN mobiltelefon.tipusa%TYPE) AS
     BEGIN
        INSERT INTO mobiltelefon VALUES(csz, l, a, t);
     END;
     PROCEDURE delete_mobiltelefon (csz IN 
      mobiltelefon.cikkszam%TYPE) AS
     BEGIN
        DELETE FROM mobiltelefon WHERE cikkszam = csz;
     END;
     PROCEDURE update_mobiltelefon (csz IN 
        mobiltelefon.cikkszam%TYPE, l IN mobiltelefon.leiras%TYPE, a IN mobiltelefon.ar%TYPE, t IN mobiltelefon.tipusa%TYPE) AS
     BEGIN
        UPDATE mobiltelefon SET leiras = l, ar = a, tipusa = t 
        WHERE cikkszam = csz;
     END;
   END mobiltelefon_csomag;
Hozzon létre PL/SQL csomagot, amely a „tel” táblát kezeli: adatfelvitelt, adatmódosítást, adattörlést valósítson meg!
   CREATE OR REPLACE PACKAGE tel_csomag AS
      PROCEDURE insert_tel (i IN tel.id%TYPE, tsz IN 
        tel.telszam%TYPE, sz IN tel.szolgaltato%TYPE);
      PROCEDURE delete_tel (i IN tel.id%TYPE);
      PROCEDURE update_tel (i IN tel.id%TYPE, tsz IN 
        tel.telszam%TYPE, sz IN tel.szolgaltato%TYPE);
   END tel_csomag;
Hozza létre a csomagtörzset az 6.1.1/7. feladatban létrehozott csomaghoz!
   CREATE OR REPLACE PACKAGE BODY tel_csomag AS
     PROCEDURE insert_tel (i IN tel.id%TYPE, tsz IN 
      tel.telszam%TYPE, sz IN tel.szolgaltato%TYPE) AS
     BEGIN
        INSERT INTO tel VALUES(i, tsz, sz);
     END;
     PROCEDURE delete_tel (i IN tel.id%TYPE) AS
     BEGIN
        DELETE FROM tel WHERE id = i;
     END;
     PROCEDURE update_tel (i IN tel.id%TYPE, tsz IN 
        tel.telszam%TYPE, sz IN tel.szolgaltato%TYPE) AS
     BEGIN
        UPDATE tel SET telszam = tsz WHERE id = i;
        UPDATE tel SET szolgaltato = sz WHERE id = i;
     END;
   END tel_csomag;
Hozzon létre PL/SQL csomagot, amely az „elégedettség” kapcsoló táblát kezeli: adatfelvitelt, adatmódosítást, adattörlést, elégedettség jelleg lekérdezést valósítson meg!
   CREATE OR REPLACE PACKAGE elegedettseg_csomag AS
     PROCEDURE insert_elegedettseg (az IN
      elegedettseg.azonosito%TYPE, j IN elegedettseg.jellege%TYPE, v IN elegedettseg.vevo%TYPE, sz IN elegedettseg.szolgaltato%TYPE);
     PROCEDURE delete_elegedettseg (az IN
      elegedettseg.azonosito%TYPE);
     PROCEDURE update_elegedettseg (az IN 
      elegedettseg.azonosito%TYPE, j IN elegedettseg.jellege%TYPE, v IN elegedettseg.vevo%TYPE, sz IN elegedettseg.szolgaltato%TYPE);
     FUNCTION elegedettseg_jelleg (az IN
      elegedettseg.azonosito%TYPE) RETURN  elegedettseg.jellege%TYPE;
   END elegedettseg_csomag;
Hozza létre a csomagtörzset az 6.1.1/9. feladatban létrehozott csomaghoz!
   CREATE OR REPLACE PACKAGE BODY elegedettseg_csomag AS
     PROCEDURE insert_elegedettseg (az IN 
      elegedettseg.azonosito%TYPE, j IN elegedettseg.jellege%TYPE, v IN elegedettseg.vevo%TYPE, sz IN elegedettseg.szolgaltato%TYPE) AS
     BEGIN
        INSERT INTO elegedettseg VALUES(az, j, v, sz);
     END;
     PROCEDURE delete_elegedettseg (az IN 
      elegedettseg.azonosito%TYPE) AS
     BEGIN
        DELETE FROM elegedettseg WHERE azonosito = az;
     END;
     PROCEDURE update_elegedettseg (az IN 
       elegedettseg.azonosito%TYPE, j IN elegedettseg.jellege%TYPE, v IN elegedettseg.vevo%TYPE, sz IN elegedettseg.szolgaltato%TYPE) AS
     BEGIN
         UPDATE elegedettseg SET jellege = j, vevo = v, 
         szolgaltato = sz WHERE azonosito = az;
     END;
     FUNCTION elegedettseg_jelleg (az IN 
       elegedettseg.azonosito%TYPE) RETURN  elegedettseg.jellege%TYPE AS
       j elegedettseg.jellege%TYPE;
     BEGIN
        SELECT jellege INTO j FROM elegedettseg WHERE 
         azonosito = az;
        RETURN  j;
     END;
   END elegedettseg_csomag;
Hozzon létre PL/SQL csomagot, amely az „árusít” kapcsoló táblát kezeli: adatfelvitelt, adatmódosítást, adattörlést valósítson meg!
   CREATE OR REPLACE PACKAGE arusit_csomag AS
     PROCEDURE insert_arusit (i IN arusit.id%TYPE, d IN 
      arusit.db%TYPE, sz IN arusit.szolgaltato%TYPE, m IN arusit.mobiltelefon%TYPE);
     PROCEDURE delete_arusit (i IN arusit.id%TYPE);
     PROCEDURE update_arusit (i IN arusit.id%TYPE, d IN 
      arusit.db%TYPE, sz IN arusit.szolgaltato%TYPE, m IN arusit.mobiltelefon%TYPE);
   END arusit_csomag;
Hozza létre a csomagtörzset az 6.1.1/11. feladatban létrehozott csomaghoz!
   CREATE OR REPLACE PACKAGE BODY arusit_csomag AS
     PROCEDURE insert_arusit (i IN arusit.id%TYPE, d IN 
      arusit.db%TYPE, sz IN arusit.szolgaltato%TYPE, m IN arusit.mobiltelefon%TYPE) AS
     BEGIN
         INSERT INTO arusit VALUES(i, d, sz, m);
     END;
     PROCEDURE delete_arusit (i IN arusit.id%TYPE) AS
     BEGIN
         DELETE FROM arusit WHERE id = i;
     END;
     PROCEDURE update_arusit (i IN arusit.id%TYPE, d IN 
       arusit.db%TYPE, sz IN arusit.szolgaltato%TYPE, m IN arusit.mobiltelefon%TYPE) AS
     BEGIN
        UPDATE arusit SET db = d, szolgaltato = sz, 
        mobiltelefon = m WHERE id = i;
     END;
   END arusit_csomag;
Írjon tárolt eljárást, amely beszúr egy rekordot a vevő táblába a 3 kötelező mezőt kitöltve!
   CREATE OR REPLACE PROCEDURE vevo_beszur(v_num NUMBER, v_nev VARCHAR, 
       v_mail VARCHAR) IS
   BEGIN
      INSERT INTO vevo (ugyfelszam, nev, e_mail) VALUES (v_num, v_nev,   v_mail);
   END vevo_beszur;
           
   --Futtatása:
   BEGIN
       vevo_beszur(44556677, 'Valaki', '');
   END;
Írjon tárolt eljárást, amely a vevők neveit átírja csupa nagybetűsre, majd hívja meg az eljárást!

   CREATE OR REPLACE PROCEDURE vn_upperc (v1 IN vevo.nev%TYPE, v2 OUT 
      vevo.nev%TYPE) AS
   BEGIN
      v2:=UPPER(v1);
   END vn_upperc;
   
   DECLARE
           CURSOR c_upperc IS SELECT * FROM vevo;
           n1 vevo.nev%TYPE;
           n2 vevo.nev%TYPE;
   BEGIN
           FOR v IN c_upperc LOOP
                   n1:=v.nev;
                   vn_upperc(n1,n2);
                   DBMS_OUTPUT.PUT_LINE(n1 || ', ' ||  n2);
           END LOOP;
   END;
Írjon tárolt eljárást, amely kilistázza és megszámolja az adatbázisban szereplő szolgáltatókat!
   CREATE OR REPLACE PROCEDURE sorszam IS 
           CURSOR c IS SELECT nev FROM szolgaltato;
           sorok_szama NUMBER;
   BEGIN
           FOR i IN c LOOP
               sorok_szama := c%ROWCOUNT;
               DBMS_OUTPUT.PUT_LINE(i.nev);
           END LOOP;
           DBMS_OUTPUT.PUT_LINE('--');
           IF sorok_szama > 0 THEN
               DBMS_OUTPUT.PUT_LINE(sorok_szama||' szolgaltato van az adatbazisban.');
           ELSE
               DBMS_OUTPUT.PUT_LINE('Nincs elerheto szolgaltato.');
           END IF;
   END sorszam;
   
   BEGIN
           sorszam;
   END;
Írjon tárolt eljárást, amely a 25000 Ft-nál olcsóbb telefonok árát 20%-kal megnöveli!
   CREATE OR REPLACE PROCEDURE ar_modosit IS
     CURSOR cAr IS SELECT * FROM mobiltelefon WHERE ar < 25000 FOR 
     UPDATE OF ar;
           BEGIN
           FOR i IN cAr LOOP
                UPDATE mobiltelefon SET ar = ar * 1.2 WHERE CURRENT OF cAr;
           END LOOP;
   END ar_modosit;
   
   BEGIN
           ar_modosit;
   END;
Írjon tárolt függvényt, amely visszaadja a legdrágább telefon árát!
    CREATE OR REPLACE FUNCTION telefon_maxar RETURN  NUMBER IS
        t_ar mobiltelefon.ar%TYPE;
    BEGIN
           SELECT max(ar) INTO t_ar FROM mobiltelefon;
           IF t_ar IS NOT NULL THEN
               return  t_ar;
           ELSE
               return  0;
           END IF;
    END;
Írjon függvényt, amely visszaadja a paraméterében kapott vevő nevéhez tartozó e-mail címet!
    CREATE OR REPLACE FUNCTION v_email (n IN vevo.nev%TYPE) RETURN  
         vevo.e_mail%TYPE AS 
       v_em vevo.e_mail%TYPE;
    BEGIN
        SELECT e_mail INTO v_em FROM vevo WHERE nev = n;
        IF v_em IS NOT NULL THEN
            return  v_em;
        ELSE
            return  null;
        END IF;
    END;
           
Írjon függvényt, mely visszaadja, hogy egy paraméterül átadott azonosítójú szolgáltatóval mennyire elégedettek a vevők!
   CREATE OR REPLACE FUNCTION elegedett(az IN elegedettseg.szolgaltato%TYPE) RETURN  NUMBER IS 
      CURSOR c_j IS SELECT jellege FROM elegedettseg WHERE szolgaltato = az;
      sorok_szama NUMBER;
      pozitiv_j NUMBER := 0;
   BEGIN
      FOR i IN c_j LOOP
           sorok_szama := c_j%ROWCOUNT;
           IF i.jellege = 'pozitiv' THEN
                 pozitiv_j := pozitiv_j + 1;
           END IF;
      END LOOP;
      RETURN  (pozitiv_j/sorok_szama)*100;
   END;
Írjon függvényt, mely visszaadja, hogy egy adott típusú mobiltelefont hány szolgálató árusít!
   CREATE OR REPLACE FUNCTION tipust_arul(tip IN mobiltelefon.tipusa%TYPE) RETURN  NUMBER IS 
           CURSOR c IS SELECT count(*) darab, szolgaltato FROM arusit, 
                   mobiltelefon WHERE arusit.mobiltelefon = mobiltelefon.cikkszam 
                   AND tipusa = tip GROUP BY szolgaltato;
           db NUMBER := 0;
   BEGIN
           FOR i IN c LOOP
                   db := c%ROWCOUNT;
           END LOOP;
           RETURN  db;
   END;
Írjon függvényt, mely visszaadja, hogy a vevők hány százaléka elégedett szolgáltatójával!
   CREATE OR REPLACE FUNCTION ossz_elegedett RETURN  NUMBER IS 
           CURSOR c_e IS SELECT jellege FROM elegedettseg;
           sorok_szama NUMBER;
           pozitiv_e NUMBER := 0;
   BEGIN
           FOR i IN c_e LOOP
                   sorok_szama := c_e%ROWCOUNT;
                   IF i.jellege = 'pozitiv' THEN
                           pozitiv_e := pozitiv_e + 1;
                   END IF;
           END LOOP;
           RETURN  (pozitiv_e/sorok_szama)*100;
   END;

Triggerek

Hozzon létre triggert, amely naplózza a NAPLO (dátum, esemény) táblába, ha új rendelés érkezik be.

   CREATE TRIGGER tr_naplozo AFTER INSERT ON rendeles
   BEGIN
      INSERT INTO naplo VALUES (sysdate,'Rendelés érkezett');
   END;

Futtasa le az előző feladatban létrehozott triggert.

   INSERT INTO rendeles VALUES (...);

Naplózza egy NAPLO (szoveg) táblába, ha hozzáférés történik a dolgozó törzstáblához.

   CREATE TRIGGER tr_dolg AFTER INSERTING OR DELETING
   OR UPDATING ON dolgozo
   DECLARE
      szoveg CHAR(100);
   BEGIN
      IF INSERTING THEN
        szoveg := 'Bövítés ' || USER || TO_CHAR(sysdate,'YYYY.MM.DD');
      END IF;
      IF DELETING THEN
        szoveg := 'Törlés ' || USER || TO_CHAR(sysdate,'YYYY.MM.DD');
      END IF;
      IF UPDATETING THEN
        szoveg := 'Módositas ' || USER ||
        TO_CHAR(sysdate,'YYYY.MM.DD');
      END IF;
      INSERT INTO NAPLO VALUES (szoveg),
   END;

Módosítsa az első feladat megoldását úgy, hogy az esemény leírásában szerepeljen a termék kódja is (rendeles tábla termek mezője).

   CREATE TRIGGER tr_naplozo2 AFTER INSERT ON rendeles FOR EACH ROW
   BEGIN
      INSERT INTO naplo VALUES (sysdate,'Rendelés érkezett termék:'
      || :NEW.termek);
   END;

Oldja meg triggerel, hogy amennyiben egy raktár egy rekesze blokkolt állapotba kerül (STATUS mező = 'B'), akkor az oda allokált termék csomagok is blokkolt státuszba kerüljenek.

   CREATE TRIGGER tr_raktar1 AFTER UPDATE ON RAKTAR_REKESZEK
      FOR EACH ROW
   BEGIN
      IF :OLD.STATUSZ = 'B' THEN
         UPDATE TERMEK_CSOMAGOK SET STATUS = 'B'
         WHERE rekesz=:OLD.id;
      END IF;
   END;

Hozzon létre olyan triggert, amely nem engedi, hogy 100000 alatt legyen valamelydolgozónak a fizetése.

   CREATE TRIGGER tr_fizetes1 BEFORE INSERT OR UPDATE OF fizetes
   ON DOLGOZO FOR EACH ROW
   BEGIN
      IF :NEW.fizetes < 100000 THEN
         RAISE_APPLICATION_ERROR (-20010,
        'Túl alacsony fizetes, dolgozókód:' || :NEW.kod);
      END IF;
   END;

Készítsen triggert, mely azt felügyeli, hogy az dolgozók jövedelmét nem lehet 50000 Ft-nál nagyobb értékkel növelni.

   CREATE TRIGGER tr_fizetes2 BEFORE UPDATE ON DOLGOZOK FOR EACH ROW
   BEGIN
      IF :NEW.jovedelem > :OLD.jovedelem+5000 THEN
         :NEW.jovedelem := :OLD.jovedelem+5000;
      END IF;
   END;

Írjon olyan triggert, amely nem engedi, hogy egy számlafejhez 10-nél több tétel tartozzon.

   CREATE TRIGGER tr_szamla1 BEFORE INSERT ON szamla_tetel
   FOR EACH ROW
   DECLARE
      db NUMBER;
   BEGIN
      SELECT count(*) INTO db
         FROM szamla_tetel WHERE szamlaszam = :NEW.szamlaszam;
      IF db > 9 THEN
         RAISE_APPLICATION_ERROR (-20010,'Túl sok rendelési tétel');
      END IF;
   END;

Készítsen triggert, melynek feladata, hogy új fizetés érték esetén automatikusan kiszámítja az adó értékét. Az adó értékét egy adoszamitas nevű tárolt eljárás határozza meg.

   CREATE TRIGGER tr_adoszam AFTER UPDATE OF fizetes ON DOLGOZO
   FOR EACH ROW
   DECLARE
      szamitott_ado EMBER.ADO%TYPE;
   BEGIN
      IF :NEW.jovedelem IS NOT NULL THEN
         adoszamitas(:NEW.jovedelem, szamitott_ado);
        :NEW.ado:=szamitott_ado;
      END IF;
   END;

Hozzon létre triggert, mely nem enged 1000-nél kisebb, illetve 10000-nél nagyobb értéket felvinni a termék ár mezőjébe. Hibakezelésen keresztül állítsa be a mező érvényes értékét.

   CREATE TRIGGER tr_fizetes2 BEFORE INSERT OR UPDATE OF fizetes
   ON DOLGOZO FOR EACH ROW
   DECLARE
      sajathiba1 EXCEPTION;
      sajathiba2 EXCEPTION;
   BEGIN
      IF :NEW.ar < 1000 THEN
         RAISE sajathiba1;
      END IF;
      IF :NEW.ar > 10000 THEN
         RAISE sajathiba2;
      END IF;
   EXCEPTION
      WHEN sajathiba1 THEN
        :NEW.ar := 1000;
      WHEN sajathiba2 THEN
        :NEW.ar := 10000;
   END;

Készítsen triggert, amely 10% kedvezményt ad a rendelési árból, ha a rendelésértéke nagyobb mint 10000 Ft.

   CREATE TRIGGER tr_rendeles2 BEFORE INSERT ON Rendeles
   FOR EACH ROW
   BEGIN
      IF :NEW.osszar > 10000 THEN
        :NEW.osszar := 0.9 * :NEW.osszar;
      END IF;
   END;

Készítsen triggert, amely 10% kedvezményt ad a rendelési árból, ha a vevő eddigi összrendelés értéke nagyobb mint 100000 Ft.

   CREATE TRIGGER tr_rendeles3 BEFORE INSERT ON Rendeles
   FOR EACH ROW
   DECLARE
      mosszar NUMBER;
   BEGIN
      SELECT SUM(osszar) INTO mosszar FROM rendeles
         WHERE ugyfel = :NEW.ugyfel;
      IF mosszar > 10000 THEN
        :NEW.osszar := 0.9 * :NEW.osszar;
      END IF;
   END;

Készítsen VIEW-t az összetartozó dolgozó és üzem nevek megjelenítésére. Eztután készítsen olyan triggert, anely ezen VIEW-ra kiadott INSERT parancsot átviszi az üzemre és dolgozóra. Az új rekordok kulcsérétkét egy-egy szekvenciából vegye át.

   CREATE VIEW v1 AS
   SELECT d.nev, u.nev FROM dolgozo d
      INNER JOIN uzem u ON d.uzem = u.kod;
   
   CREATE SEQUENCE s1;
   CREATE SEQUENCE s2;
   
   CREATE TRIGGER tr_view INSTEAD OF INSERT ON v1 FOR EACH ROW
   DECLARE
      mdkod NUMBER;
      mukod NUMBER;
   BEGIN
      INSERT INTO uzem(kod) VALUES (s1.NEXTVAl);
      INSERT INTO dogozo(kod) VALUES (s2.NEXTVAl);
   END;

Ne engedjen kitörölni számla rekordot, ha státusza már F értékű.

   CREATE TRIGGER tr_szamla2 BEFORE DELETE ON szamla
   FOR EACH ROW
   BEGIN
      IF :OLD.status = 'Z' THEN
         RAISE_APPLICATION_ERROR (-20010,'Túl sok rendelési tétel');
      END IF;
   END;

Ha egy vevőrekordot törölnek, elótte számolja ki az eredő tartozását az egyes rendeléseket összesítve, és írja ki egy ADOSAG nevű álományba a kapott értéket.

   CREATE OR REPLACE TRIGGER tr_adosag BEFORE DELETE
   ON ugyfel FOR EACH ROW
   DECLARE
      osszadosag NUMBER;
   BEGIN
      FOR rend IN (SELECT * FROM rendeles WHERE
         ugyfel = :OLD.ugyfel) 
      LOOP
        osszadosag := osszadosag + rend.adosag;
      END LOOP;
      INSERT INTO adosag VALUES (:OLD.ikod, :OLD.unev, osszadosag);
   END;

Készítsen triggert, amely gondoskodik arról, hogy a rendelési tételek alapján a termékhez tartozó összrendelés érték aktuális érték maradjon a rendelés tábla módosulása után is.

   CREATE TRIGGER tr_illeszt AFTER INSERT OR DELETE OR
   UPDATE OF darabszam ON rendeles FOR EACH ROW
   DECLARE
      valt NUMBER;
      tkod rendeles.termek%TYPE;
   BEGIN
      IF INSERTING THEN
         valt := :NEW.darabszam;
         tkod := :NEW.termek;
      END IF;
      IF DELETING THEN
         valt := - :OLD.darabszam;
         tkod := :OLD.termek;
      END IF;
      IF UPDATING THEN
         valt := :NEW.darabszam - :OLD.darabszam;
         tkod := :NEW.termek;
      END IF;
      UPDATE termek SET osszdarab = osszdarab + valt
      WHERE kod = tkod;
   END;

Készítsen DDL triggert a séma műveletek naplózására.

   CREATE TRIGGER tr_ddl AFTER DDL ON SCHEMA
   BEGIN
      INSERT INTO naplo VALUES (SYSDATE,
        USER, ora_dict_obj_owner,
        ora_dict_obj_type, ora_dict_obj_name,ora_sysevent
      );
   END;

Alkalmazás programozói interfészek (API)

PHP

Kapcsolat felvétel, adatbázis kiválasztás

Kapcsolódjon MySQL adatbáziskezelőhöz!
   <?php
   
   $conn = mysql_connect("localhost", "username","password");
   if (!$conn)
   {
           die("Kapcsolódási hiba: ".mysql_error());
   }
   
   ?>
Kapcsolódjon Oracle adatbáziskezelőhöz!
   <?php
           $conn = oci_connect('username','password','localhost/XE');
           if (!$conn)
           {
                   $err = oci_error();
                   echo 'Connect error: '.$err['text'];
           }
   ?>
Kapcsolódjon a minta adatbázishoz, amelyet MySQL adatbáziskezelő kezel!
   <?php
   
   $conn = mysql_connect("localhost", "username","password");
   if (!$conn)
   {
           die("Kapcsolódási hiba: ".mysql_error());
   }
   mysql_select_db("minta",$conn);
   
   ?>
Kapcsolódjon a minta adatbázishoz, amelyet Oracle adatbáziskezelő kezel!
   <?php
           $conn = oci_connect('username','password','localhost/XE');
           if (!$conn)
           {
                   $err = oci_error();
                   echo 'Connect error: '.$err['text'];
           }
   ?>

DML műveletek

Vigyen fel egy új vevőt MySQL DBMS-t használva!
   <?php
   
       $conn = mysql_connect("localhost", "username","password");
       if (!$conn)
       {
           die("Kapcsolódási hiba: ".mysql_error());
       }
       mysql_select_db("minta",$conn) or die(mysql_error());
   
       $query="INSERT INTO vevo VALUES ( 22334455, 'Bela', 'bela@hotmail.com', 06304445566, 3154, 'Szeged', 'Kossuth', 42 )";
   
       mysql_query($query) or die(mysql_error());
    
       echo "Vevő felvitele megtörtént!";
   
   ?>
Vigyen fel egy új vevőt Oracle DBMS-t használva!
   <?php
           $conn = oci_connect('username','password','localhost/XE');
           if (!$conn)
           {
                   $err = oci_error();
                   echo 'Connect error: '.$err['message'];
           }
           $stmt = oci_parse($conn, "INSERT INTO vevo VALUES ( 11223344, 'Agoston', 'agoston@freemail.hu', 0637222333, 3000, 'Hatvan', 'Valahol', 21 )");
           if (!$stmt) 
           {
                   oci_execute($stmt);
                   oci_commit($conn);
                   oci_close();
                   echo "Vevő felvitele megtörtént.";
           }
           else
           {
                   $err = oci_error($stmt);
                   echo "Hiba: ".$err['message'];
           }
   ?>
Módosítson egy szolgátatót MySQL DBMS-t használva!
   <?php
   
      $conn = mysql_connect("localhost", "username","password");
      if (!$conn)
      {
            die("Kapcsolódási hiba: ".mysql_error());
      }
      mysql_select_db("minta",$conn) or die(mysql_error());
   
      $query="UPDATE `szolgaltato` SET `v` = 'Miskolc' WHERE `szolgaltato`.`cegazonosito` = 'ABC123'";
    
      mysql_query($query) or die(mysql_error());
      echo "Szolgáltató módosítása megtörtént!";
   
   ?>
Módosítson egy szolgáltatót Oracle DBMS-t használva!
   <?php
           $conn = oci_connect('username','password','localhost/XE');
           if (!$conn)
           {
                   $err = oci_error();
                   echo 'Connect error: '.$err['message'];
           }
           $stmt = oci_parse($conn, "UPDATE `szolgaltato` SET `v` = 'Miskolc'  WHERE `szolgaltato`.`cegazonosito` = 'ABC123'");
           if (!$stmt) 
           {
                   oci_execute($stmt);
                   oci_commit($conn);
                   oci_close();
                   echo "Szolgáltató módosítása megtörtént.";
           }
           else
           {
                   $err = oci_error($stmt);
                   echo "Hiba: ".$err['message'];
           }
   ?>
Töröljön egy mobiltelefont MySQL DBMS-t használva!
   <?php
   
      $conn = mysql_connect("localhost", "username","password");
      if (!$conn)
      {
           die("Kapcsolódási hiba: ".mysql_error());
      }
      mysql_select_db("minta",$conn) or die(mysql_error());
      $query="DELETE FROM `mobiltelefon` WHERE `cikkszam` = '1234ABC567'";
      mysql_query($query) or die(mysql_error());
      echo "Mobiltelefon törlése megtörtént!";
   
   ?>
Töröljön egy mobiltelefont Oracle DBMS-t használva!
    <?php
           $conn = oci_connect('username','password','localhost/XE');
           if (!$conn)
           {
                   $err = oci_error();
                   echo 'Connect error: '.$err['message'];
           }
           $stmt = oci_parse($conn, "DELETE FROM mobiltelefon WHERE 
          cikkszam = '1234ABC567'");
           if (!$stmt) 
           {
                   oci_execute($stmt);
                   oci_commit($conn);
                   oci_close();
                   echo "Mobiltelefon törlése megtörtént.";
           }
           else
           {
                   $err = oci_error($stmt);
                   echo "Hiba: ".$err['message'];
           }
   ?>
Vigyen fel paraméteresen egy vevőt MySQL DBMS-t használva!
   <?php
   
   $conn = new mysqli("localhost", "username","password", "minta");
   if (mysqli_connect_errno())
   {
           die("Kapcsolódási hiba: ".mysqli_connect_error());
   }
   
   if ($stmt = $conn->prepare("INSERT INTO vevo VALUES ( ?,?,?,?,?,?,?,? )")) 
   {
   $stmt->bind_param('issiissi',$uszam,$nev,$email,$tel,$irsz,$varos,$utca,$hsz);
           
           $uszam = 22334455;
           $nev = 'Bela';
           $email = 'bela@hotmail.com';
           $tel = 06304445566;
           $irsz = 3154;
           $varos = 'Szeged';
           $utca = 'Kossuth';
           $hsz = 42;
   
           $stmt->execute();
           
           echo "Vevő felvitele megtörtént!\n";        
           
           $stmt->close();
   }
   else
   {
           echo "Utasítás hiba: ".$conn->error);
   }
   
   ?>
Vigyen fel paraméteresen egy vevőt Oracle DBMS-t használva!
   <?php
           $conn = oci_connect('username','password','localhost/XE');
           if (!$conn)
           {
                   $err = oci_error();
                   echo 'Connect error: '.$err['message'];
           }
           $stmt = oci_parse($conn, "INSERT INTO vevo VALUES ( :uszam, 
          :nev, :email, :tel, :irsz, :varos, :utca, :hsz)");
           if (!$stmt) 
           {
                   $uszam = 22334455;
                   $nev = 'Bela';
                   $email = 'bela@hotmail.com';
                   $tel = 06304445566;
                   $irsz = 3154;
                   $varos = 'Szeged';
                   $utca = 'Kossuth';
                   $hsz = 42;
   
                   oci_bind_by_name($stmt,":uszam",$uszam);
                   oci_bind_by_name($stmt,":nev",$nev);
                   oci_bind_by_name($stmt,":email",$email);
                   oci_bind_by_name($stmt,":tel",$tel);
                   oci_bind_by_name($stmt,":irsz",$irsz);
                   oci_bind_by_name($stmt,":varos",$varos);
                   oci_bind_by_name($stmt,":utca",$utca);
                   oci_bind_by_name($stmt,":hsz",$hsz);
                   
                   oci_execute($stmt, OCI_DEFAULT);
                   oci_commit($conn);
                   oci_free_statement($stmt);
                   echo "Vevő felvitele megtörtént.";
                   oci_close();
           }
           else
           {
                   $err = oci_error($stmt);
                   echo "Hiba: ".$err['message'];
           }
   ?>
Módosítson paraméteresen egy szolgátatót MySQL DBMS-t használva!
   <?php
   
   $conn = new mysqli("localhost", "username","password", "minta");
   if (mysqli_connect_errno())
   {
           die("Kapcsolódási hiba: ".mysqli_connect_error());
   }
   
   if ($stmt = $conn->prepare("UPDATE szolgaltato SET v = ? WHERE cegazonosito = ?")) 
   {
           $stmt->bind_param('ss',$varos,$cegazon);
           
           $varos = 'Szeged';
           $cegazon = 'ABC123';
           
           $stmt->execute();
           
           echo "Szolgáltató módosítása megtörtént!\n";        
           
           $stmt->close();
   }
   else
   {
           echo "Utasítás hiba: ".$conn->error);
   }
   
   ?>
Módosítson paramétersen egy szolgáltatót Oracle DBMS-t használva!
   <?php
           $conn = oci_connect('username','password','localhost/XE');
           if (!$conn)
           {
                   $err = oci_error();
                   echo 'Connect error: '.$err['message'];
           }
           $stmt = oci_parse($conn, "UPDATE szolgaltato SET v = :varos WHERE  cegazonosito = :cegazon");
           if (!$stmt) 
           {
                   $varos = 'Szeged';
                   $cegazon = 'ABC123';
   
                   oci_bind_by_name($stmt,":varos",$varos);
                   oci_bind_by_name($stmt,":cegazon",$cegazon);
                   
                   oci_execute($stmt, OCI_DEFAULT);
                   oci_commit($conn);
                   oci_free_statement($stmt);
                   echo "Szolgáltató módosítása megtörtént.";
                   oci_close();
           }
           else
           {
                   $err = oci_error($stmt);
                   echo "Hiba: ".$err['message'];
           }
   ?>
Töröljön paraméteresen egy mobiltelefont MySQL DBMS-t használva!
   <?php
   
   $conn = new mysqli("localhost", "username","password", "minta");
   if (mysqli_connect_errno())
   {
           die("Kapcsolódási hiba: ".mysqli_connect_error());
   }
   
   if ($stmt = $conn->prepare("DELETE FROM mobiltelefon WHERE cikkszam = ?")) 
   {
           $stmt->bind_param('s',$cikkszam);
           
           
           $cikkszam = '1234ABC567';
           
           $stmt->execute();
           
           echo "Mobiltelefon törlése megtörtént!\n";        
           
           $stmt->close();
   }
   else
   {
           echo "Utasítás hiba: ".$conn->error);
   }
   
   ?>
Töröljön paraméteresen egy mobiltelefont Oracle DBMS-t használva!
   <?php
           $conn = oci_connect('username','password','localhost/XE');
           if (!$conn)
           {
                   $err = oci_error();
                   echo 'Connect error: '.$err['message'];
           }
           $stmt = oci_parse($conn, "DELETE FROM mobiltelefon
              WHERE cikkszam = :cikkszam");
           if (!$stmt) 
           {
                   $cikkszam = '1234ABC567';
   
                   oci_bind_by_name($stmt,":cikkszam",$cikkszam);
                   
                   oci_execute($stmt, OCI_DEFAULT);
                   oci_commit($conn);
                   oci_free_statement($stmt);
                   echo "Mobiltelefon törlése megtörtént.";
                   oci_close();
           }
           else
           {
                   $err = oci_error($stmt);
                   echo "Hiba: ".$err['message'];
           }
   ?>

Lekérdezések, kurzor-kezelés

Listázza ki a vevőket a képernyőre MySQL DBMS-t használva!
   <?php
   
   $conn = mysql_connect("localhost", "username","password");
   if (!$conn)
   {
           die("Kapcsolódási hiba: ".mysql_error());
   }
   mysql_select_db("minta",$conn) or die(mysql_error());
   $query="select * from vevo";
   $result = mysql_query($query) or die(mysql_error());
   while ($sor = mysql_fetch_row($result)) 
   {
           echo $sor['ugyfelszam'].':'.
                    $sor['nev'].':'.
                    $sor['e_mail'].':'.
                    $sor['tel'].':'.
                    $sor['i'].':'.
                    $sor['v'].':'.
                    $sor['u'].':'.
                    $sor['hsz'].'\n';
   }
   
   ?>
Listázza ki a vevőket a képernyőre Oracle DBMS-t használva!
   <?php
           $conn = oci_connect('username','password','localhost/XE');
           if (!$conn)
           {
                   $err = oci_error();
                   echo 'Connect error: '.$err['message'];
           }
           $stmt = oci_parse($conn, "SELECT * FROM vevo");
           if (!$stmt) 
           {                
                   oci_execute($stmt, OCI_DEFAULT);
                   while (oci_fetch($stmt)) 
                   {
                           $uszam = oci_result($stmt, "ugyfelszam");
                           $nev = oci_result($stmt, "nev");
                           $email = oci_result($stmt, "e_mail");
                           $tel = oci_result($stmt, "tel");
                           $irsz = oci_result($stmt, "i");
                           $varos = oci_result($stmt, "v");
                           $utca = oci_result($stmt, "u");
                           $hsz = oci_result($stmt, "hsz");
                           
                           echo $uszam.":".$nev.":".$email.":".$tel.":".$irsz.":".
                                   $varos.":".$utca.":".$hsz."\n";
                   }
                   oci_free_statement($stmt);
                   oci_close();
           }
           else
           {
                   $err = oci_error($stmt);
                   echo "Hiba: ".$err['message'];
           }
   ?>
Listázza ki a Miskolci szolgáltatókat a képernyőre MySQL DBMS-t használva! A várost paraméteresen adja meg!
   <?php
   
   $conn = new mysqli("localhost", "username","password", "minta");
   if (mysqli_connect_errno())
   {
           die("Kapcsolódási hiba: ".mysqli_connect_error());
   }
   
   if ($stmt = $conn->prepare("SELECT * FROM szolgaltato WHERE v = ?")) 
   {
           $stmt->bind_param('s',$varos);
           
           $varos = 'Miskolc';
           
           $stmt->execute();
           
           $stmt->bind_result($cegazon,$nev,$irsz,$varos,$utca,$hsz);
           
           while($stmt->fetch())
           {
                   echo $cegazon.':'.$nev.':'.$irsz.':'.
                   $varos.':'.$utca.':'.$hsz.'\n';
           }
           
           $stmt->close();
   }
   else
   {
           echo "Utasítás hiba: ".$conn->error);
   }
   
   ?>
Listázza ki a Miskolci szolgáltatókat a képernyőre Oracle DBMS-t használva! A várost paraméteresen adja meg!
   <?php
           $conn = oci_connect('username','password','localhost/XE');
           if (!$conn)
           {
                   $err = oci_error();
                   echo 'Connect error: '.$err['message'];
           }
           $stmt = oci_parse($conn, "SELECT * FROM szolgaltato WHERE v = :varos");
           if (!$stmt) 
           {                
                   $varos = 'Miskolc';
                   
                   oci_bind_by_name($stmt,":varos",$varos);
                   
                   oci_execute($stmt, OCI_DEFAULT);
                   
                   while (oci_fetch($stmt)) 
                   {
                           $cegazon = oci_result($stmt, "cegazonosito");
                           $nev = oci_result($stmt, "nev");
                           $irsz = oci_result($stmt, "i");
                           $varos = oci_result($stmt, "v");
                           $utca = oci_result($stmt, "u");
                           $hsz = oci_result($stmt, "hsz");
                           
                           echo $cegazon.":".$nev.":".$irsz.":".$varos.":".$utca.":".$hsz."\n";
                   }
                   oci_free_statement($stmt);
                   oci_close();
           }
           else
           {
                   $err = oci_error($stmt);
                   echo "Hiba: ".$err['message'];
   ?>

Tárolt eljárás-, függvényhívások

Vigyen fel egy vevőt a vevo csomag megfelelő tárolt eljárásával Oracle-ben!
  <?php
           $conn = oci_connect('username','password','localhost/XE');
           if (!$conn)
           {
                   $err = oci_error();
                   echo 'Connect error: '.$err['message'];
           }
           $stmt = oci_parse($conn, 
   "begin 
   vevo_csomag.insert_vevo(:uszam, :nev, :email, :tel, :irsz, 
   :varos, :utca, :hsz); 
    end;");
           if (!$stmt) 
           {
                   $uszam = 22334455;
                   $nev = 'Bela';
                   $email = 'bela@hotmail.com';
                   $tel = 06304445566;
                   $irsz = 3154;
                   $varos = 'Szeged';
                   $utca = 'Kossuth';
                   $hsz = 42;
   
                   oci_bind_by_name($stmt,":uszam",$uszam);
                   oci_bind_by_name($stmt,":nev",$nev);
                   oci_bind_by_name($stmt,":email",$email);
                   oci_bind_by_name($stmt,":tel",$tel);
                   oci_bind_by_name($stmt,":irsz",$irsz);
                   oci_bind_by_name($stmt,":varos",$varos);
                   oci_bind_by_name($stmt,":utca",$utca);
                   oci_bind_by_name($stmt,":hsz",$hsz);
                   
                   oci_execute($stmt, OCI_DEFAULT);
                   oci_commit($conn);
                   oci_free_statement($stmt);
                   echo "Vevő felvitele megtörtént.";
                   oci_close();
           }
           else
           {
                   $err = oci_error($stmt);
                   echo "Hiba: ".$err['message'];
           }
   ?>
Töröljön egy szolgáltatót paraméteresen a szolgáltató csomag megfelelő tárolt eljárását meghívva Oracle-ben!
   <?php
           $conn = oci_connect('username','password','localhost/XE');
           if (!$conn)
           {
                   $err = oci_error();
                   echo 'Connect error: '.$err['message'];
           }
           $stmt = oci_parse($conn, 
             "begin szolgaltato_csomag.delete_szolgaltato(:cegazon); end;");
           if (!$stmt) 
           {
                   $cegazon = 'ABC123';
   
                   oci_bind_by_name($stmt,":cegazon",$cegazon);
                   
                   oci_execute($stmt, OCI_DEFAULT);
                   oci_commit($conn);
                   oci_free_statement($stmt);
                   echo "Szolgáltató törlés megtörtént.";
                   oci_close();
           }
           else
           {
                   $err = oci_error($stmt);
                   echo "Hiba: ".$err['message'];
           }
   ?>
Módosítson egy mobiltelefont a mobiltelefon csomag megfelelő eljárását meghívva Oracle-ben!
   <?php
           $conn = oci_connect('username','password','localhost/XE');
           if (!$conn)
           {
                   $err = oci_error();
                   echo 'Connect error: '.$err['message'];
           }
           $stmt = oci_parse($conn, 
            "begin mobiltelefon_csomag.update_mobiltelefon(:cikkszam,:leiras,:ar,:tipus); 
             end;");
           if (!$stmt) 
           {
                   $cikkszam = '1234ABC567';
                   $leiras = 'kivalo';
                   $ar = 100000;
                   $tipus = 'Nokia';
   
                   oci_bind_by_name($stmt,":cikkszam",$cikkszam);
                   oci_bind_by_name($stmt,":leiras",$leiras);
                   oci_bind_by_name($stmt,":ar",$ar);
                   oci_bind_by_name($stmt,":tipus",$tipus);
                   
                   oci_execute($stmt, OCI_DEFAULT);
                   oci_commit($conn);
                   oci_free_statement($stmt);
                   echo "Mobiltelefon módosítása megtörtént.";
                   oci_close();
           }
           else
           {
                   $err = oci_error($stmt);
                   echo "Hiba: ".$err['message'];
           }
   ?>
Hívja meg az elégedett tárolt függényt majd írja ki az eredményt képernyőre!
   <?php
           $conn = oci_connect('username','password','localhost/XE');
           if (!$conn)
           {
                   $err = oci_error();
                   echo 'Connect error: '.$err['message'];
           }
           $stmt = oci_parse($conn, 
             "select elegedett(:cegazon) EREDMENY from dual");
           if (!$stmt) 
           {
                   $cegazon = 'ABS123';
                   
                   oci_bind_by_name($stmt,":cegazon",$cegazon);
                   oci_execute($stmt, OCI_DEFAULT);
                   oci_fetch($stmt);
                   
                   $eredmeny = oci_result($stmt,"EREDMENY");
                   
                   echo "A ".$cegazon." azonosítójú szolgáltatóval való 
                   elegedettség értéke: ".$eredmeny;
                   
                   oci_free_statement($stmt);
                   oci_close();
           }
           else
           {
                   $err = oci_error($stmt);
                   echo "Hiba: ".$err['message'];
           }
   ?>

SQLJ

Készítsen egy induló SQLJ alkalmazást, amely visszaírja az aktuális adatbázis felhasználó nevét

   package KL_test;
   import java.sql.*;
   import oracle.sqlj.runtime.*;
   import sqlj.runtime.*;
   import sqlj.runtime.ref.*;
   public class Sqlj2 {
   
      public Sqlj2() {
      }
   
      public static void main(String[] args) {
         Sqlj2 fo = new Sqlj2();
         fo.proba1();
      }
      public void proba1() {
        String current_user;
        try {
           Oracle.connect(
           "jdbc:oracle:thin:@localhost:1521:xe",
           "proba",
           "proba"
           );
   
           #sql { SELECT user INTO :current_user FROM dual };
   
           System.out.println("user=".concat(current_user));
        } catch(SQLException e ) {
            System.err.println("SQLException " + e);
        }
      }
   }

Készítsen egy SQLJ alkalmazást, amely a paraméterként adott kódhoz visszaírja a termékek nevét, és mennyiségi egységét a a TERMEK[ tkod, tnev, megyseg] táblából

   package KL_test;
   import java.sql.*;
   import oracle.sqlj.runtime.*;
   import sqlj.runtime.*;
   import sqlj.runtime.ref.*;
   
   public class Sqlj2 {
      public Sqlj2() {
      }
   
      public static void main(String[] args) {
         Sqlj2 fo = new Sqlj2();
         fo.proba1(2);
      }
      
      public void proba1(int current_tkod) {
         String current_tnev, current_megyseg;
         try {
            Oracle.connect(
            "jdbc:oracle:thin:@localhost:1521:xe",
            "proba",
            "proba"
         );
   
         #sql { SELECT tnev, megyseg  
            INTO :current_tnev,:current_megyseg FROM termek}
   
         System.out.println("termek=".concat(current_tnev).
         concat(" megyseg=").} catch(SQLException e ) {
         System.err.println("SQLException " + e);
      }
   }

Készítsen SQLJ-ben egy metódust, amely a paraméterként kapott kód, név és megység adatokkal felvisz egy új rekordot a TERMEKR táblába.

   package KL_test;
   import java.sql.*;
   import oracle.sqlj.runtime.*;
   import sqlj.runtime.*;
   import sqlj.runtime.ref.*;
   
   public class Sqlj2 {
      public Sqlj2() {
      }
   
      public static void main(String[] args) {
        Sqlj2 fo = new Sqlj2();
        fo.proba1(8,"levesbetét","csomag");
      }
   
      public void proba1(int current_tkod, String current_tnev,  
      String current_megyseg)
           …
      try {
        Oracle.connect(
        "jdbc:oracle:thin:@localhost:1521:xe",
        "proba",
        "proba"
      );
   
      #sql { INSERT INTO termek(tkod,tnev, megyseg) VALUES   
         ( :current_tkod, #sql { COMMIT };
   
      } catch(SQLException e ) {
        System.err.println("SQLException " + e);
      }
   }

Készítsen SQLJ-ben egy metódust, amely a paraméterként kapott név és megység adatokkal felvisz egy új rekordot a TERMEKR táblába. A következő szabad kód értéket egy SELECT lekérdezéssel határozza meg. A maximális tkod meghatározása előtt zárolja a táblát, nehogy más közben hasonló olvasást végezzen

   package KL_test;
   import java.sql.*;
   import oracle.sqlj.runtime.*;
   import sqlj.runtime.*;
   import sqlj.runtime.ref.*;
   
   public class Sqlj2 {
     
   public Sqlj2() {
   }
   
   public static void main(String[] args) {
      Sqlj2 fo = new Sqlj2();
      fo.proba1("sajt","kg");
   }
   
   public void proba1( String current_tnev, String current_megyseg) {
      int current_tkod;
      try {
         Oracle.connect(
         "jdbc:oracle:thin:@localhost:1521:xe",
         "proba",
         "proba"
         );
         #sql { LOCK TABLE termek IN EXCLUSIVE MODE };
         #sql { SELECT max(tkod) INTO :current_tkod FROM termek };
         current_tkod++;
         #sql { INSERT INTO termek(tkod,tnev, megyseg) 
            VALUES  ( :current_tkod, #sql { COMMIT };
      } catch(SQLException e ) {
         System.err.println("SQLException " + e);
      }
   }
   }

Késztítsen egy SQLJ programot, amely a paramétereként kapott szöveges állomány tartalmával feltölti a TERMEKR táblát. Az állomány egy sora: név, egységár alakú.

   package KL_test;
   import java.sql.*;
   import oracle.sqlj.runtime.*;
   import java.io.BufferedReader;
   import java.io.File;
   import java.io.FileReader;
   import java.io.FileNotFoundException;
   import java.io.IOException;
   import sqlj.runtime.*;
   import sqlj.runtime.ref.*;
   
   public class Sqlj2 {
   
   public Sqlj2() {
   }
   
   public static void main(String[] args) {
      Sqlj2 fo = new Sqlj2();
       fo.proba1("H:\\PROJEKTEK\\TAMOP_JEGYZETEK\\ADATBAZIS_P\\adatok.txt");
   }
   
   public void proba1( String filenev) {
      int current_tkod;
      String text = null;
      String current_tnev;
      String current_megyseg;
      int db;
      try {
        Oracle.connect(
        "jdbc:oracle:thin:@localhost:1521:xe",
        "proba",
        "proba"
        );
        File file = new File(filenev);
        BufferedReader reader = null;
        reader = new BufferedReader(new FileReader(file));
        #sql { LOCK TABLE termek IN EXCLUSIVE MODE };
        #sql { SELECT max(tkod) INTO :current_tkod FROM termek };
        db = 0;
        while ((text = reader.readLine()) != null) {
           current_tnev = text.substring(0,text.indexOf(','));
           current_megyseg = text.substring(text.indexOf(',')+1);
           current_tkod++; db++;
           #sql { INSERT INTO termek(tkod,tnev, megyseg) 
             VALUES ( :current_tkod, }
        )
        reader.close();
        System.out.println ("lementett rekordok darabszáma :" + 
        String.valueOf(#sql { COMMIT };
      } catch(SQLException e ) {
        System.err.println("SQLException " + e);
      } catch(IOException e) {
        System.err.println("exception=" + e);
      }
   }
         }

Készítsen SQLJ programot, amely kilistázza a termékek nevét és a mennyiségiegységét név szerinti sorrendben. A megoldásban alkalmazza az iterátor mechanizmust.

   package KL_test;
   import java.sql.*;
   import oracle.sqlj.runtime.*;
   import java.io.IOException;
   import sqlj.runtime.*;
   import sqlj.runtime.ref.*;
   
   public class Sqlj2 {
   
   public Sqlj2() {
   }
   
   public static void main(String[] args) {
      Sqlj2 fo = new Sqlj2();
      fo.proba1();
   }
   
   #sql private static iterator ProbaIter(
      String tnev,
      String megyseg
   );
   
   public void proba1( ) {
      int current_tkod;
      String current_tnev;
      String current_megyseg;
      int db;
      ProbaIter piter;
      try {
         Oracle.connect(
         "jdbc:oracle:thin:@localhost:1521:xe",
         "proba",
         "proba"
         );
         #sql piter = { SELECT tnev, megyseg FROM termek ORDER BY 1 };
         while (piter.next()) {
           System.out.println("termek=".concat(piter.tnev()).
           concat("  megyseg=").concat(piter.megyseg));
        }
        piter.close();
        #sql { COMMIT };
      } catch(SQLException e ) {
         System.err.println("SQLException " + e);
      }
   }
   }

Oldja meg az előző feladatot pozicionálgható iterárot segítségével, úgy, hogy a termékek nevei csökkenő sorrendben jelenjenek meg.

   package KL_test;
   import java.sql.*;
   import oracle.sqlj.runtime.*;
   import java.io.BufferedReader;
   import java.io.File;
   import java.io.FileReader;
   import java.io.FileNotFoundException;
   import java.io.IOException;
   import sqlj.runtime.*;
   import sqlj.runtime.ref.*;
   
   public class Sqlj2 {
   
   public Sqlj2() {
   }
   
   public static void main(String[] args) {
      Sqlj2 fo = new Sqlj2();
      fo.proba1();
   }
   
   public void proba1() {
      int current_tkod;
      String text = null;
      String current_tnev;
      String current_megyseg;
      int db;
      
      try {
         sqlj.runtime.ResultSetIterator piter;
         Oracle.connect(
         "jdbc:oracle:thin:@localhost:1521:xe",
         "proba",
         "proba"
         );
         #sql piter = { SELECT tnev, megyseg FROM termek ORDER BY 1 DESC };
         while (piter.next()) {
            #sql { FETCH CURRENT FROM :piter  
               INTO :current_tnev, :current_megyseg };
            System.out.println("termek=".concat(current_tnev).
               concat(" megyseg=").concat(current_megyseg));
         }
         piter.close();
         #sql { COMMIT };
      } catch(SQLException e ) {
         System.err.println("SQLException " + e);
      }
   }
           }

JDBC

Kapcsolat felvétel, driver betöltés

Regisztrálja a megfelelő JDBC drivert az Oracle DBMS-hez!
      try {
          //Az Oracle JDBC driver regisztrálása
          DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());                
          
          //Sikeres betöltés kiírása a standard outputra
          System.out.println("A driver sikeresen betöltve.");                                
          
          //A regisztráció hibája miatt dobódott kivétel elkapása
     } catch (Exception ex) {                                                                
     
         //A kivétel kiíratása a standard outputra
         System.out.println("Sikertelen driver betöltés, a hiba oka: " + ex.toString());    
     }
Töltse be a megfelelő drivert az Oracle DBMS-hez, majd kapcsolódjon az adatbázishoz!
     try {
          //Az Oracle JDBC driver betöltése
          Class.forName("oracle.jdbc.driver.OracleDriver");                            
          
          //Kapcsolat létrehozása az adatbázissal              
          Connection c =
          DriverManager.getConnection("jdbc:oracle:thin:fg60/qwert@localhost/XE");    
          
          //Sikeres kapcsolódás kiíratása
          System.out.println("Sikeres kapcsolódás");                                                          
          
          //A driver belöltés és/vagy a kapcsolatvelvétel közben dobódott kivétel elkapása
     } catch (Exception ex) {        
     
         //A driver belöltés és/vagy a kapcsolatvelvétel közben dobódott kivétel szövegének kiíratása                                                                    
         System.out.println("Sikertelen kapcsolódás, a hiba oka: " + ex.toString());                
     }
Paraméterezze a 7.3.1/2. feladat kapcsolódásában a felhasználónevet és a jelszót!
     try {
          
          //Az Oracle JDBC driver betöltése
          Class.forName("oracle.jdbc.driver.OracleDriver");                                                                      
          
          //A felhasználónév megadása
          String usrnev = "fg60";                                                                                                
          
          //A jelszó megadása
          String pwd = "qwert";                                                                                                  
          
          //Kapcsolatfelvétel az adatbázissal és a paraméterek beszúrása
          Connection c = DriverManager.getConnection("jdbc:oracle:thin:" + usrnev + "/" + pwd + "@localhost/XE");                
          
          //Sikeres kapcsolat kiírása
          System.out.println("Sikeres kapcsolódás");                                                                          
     }
     
     // A driver belöltés és/vagy a kapcsolatvelvétel közben dobódott
     // kivétel elkapása
     catch (Exception ex) {                          
         // A driver belöltés és/vagy a kapcsolatvelvétel közben dobódott
         // kivétel szövegének kiírása                                                  
         System.out.println("Sikertelen kapcsolódás, a hiba oka: " + ex.toString());                                        
     }

Statikus DML utasítások – Statement

Szúrjon be egy rekordot a vevő táblába!
     try{
          
          //Driver betöltés
          Class.forName("oracle.jdbc.driver.OracleDriver");                                                                                                  
          
          //Kapcsolatfelvétel az adatbázissal
          Connection c = DriverManager.getConnection("jdbc:oracle:thin:fg60/qwert@localhost/XE");                                                            
          
          //Statement objektum létrehozása, hogy parancsot küldhessünk az
          //adatbázisnak
          Statement stmt = c.createStatement();                                                                                                              
          
          //SQL utasítás megadása
          String utasitas = "INSERT INTO vevo VALUES ( 44556677, 'Agoston', 'agoston@freemail.hu', 0637222333, 3000, 'Hatvan', 'Valahol', 21 )";              
          
          //SQL utasítás végrehajtása
          stmt.executeUpdate(utasitas);                                                                                                                        
          
          //Sikeres beszúrás kiírása
          System.out.println("A beszuras sikeres volt.");                                                                                                    
     }
     
     //A try blokkban esetlegesen keletkezett kivétel elkapása
     catch (Exception ex) {                                      
          //A kivétel szövegének kiírása
         System.out.println(ex.toString());
     }
Módosítson egy rekordot a mobiltelefon táblában!

try{ //Driver betöltés Class.forName("oracle.jdbc.driver.OracleDriver");                                                   //Kapcsolatfelvétel az adatbáissal Connection c = DriverManager.getConnection("jdbc:oracle:thin:fg60/qwert@localhost/XE");             //Statement objektum létrehozása, hogy parancsot küldhessünk az adatbázisnak Statement stmt = c.createStatement();                                                               //SQL utasítás megadása String utasitas = "UPDATE mobiltelefon SET ar = 65000 WHERE cikkszam = '332313AAC'";         //SQL utasítás végrehajtása stmt.executeUpdate(utasitas);                                                                       //Sikeres módosítás kiírása System.out.println("A modositas sikeres volt."); } //A try blokkban esetlegesen keletkezett kivétel elkapása catch (Exception ex) {                                                                   //A kivétel szövegének kiírása System.out.println(ex.toString()); }

Töröljön egy rekordot a vevő táblából!
     try{
          
          //Driver betöltés
          Class.forName("oracle.jdbc.driver.OracleDriver");                                                        
          
          //Kapcsolatfelvétel az adatbázissal
          Connection c = DriverManager.getConnection("jdbc:oracle:thin:fg60/qwert@localhost/XE");                  
          
          //Statement objektum létrehozása
          Statement stmt = c.createStatement();                                                                    
          
          //SQL utasítás megadása
          String utasitas = "DELETE FROM vevo WHERE ugyfelszam = 44556677";                                        
          
          //SQL utasítás végrehajtása
          stmt.executeUpdate(utasitas);                            
          
          //Sikeres törlés kiírása
          System.out.println("A torles sikeres volt.");                                                        
     }
     //A try blokkban keletkezett kivétel elkapása
     catch (Exception ex) {
          //A kivétel szövegének kiírása
          System.out.println(ex.toString());                                    
     }
Hajtson végre egy beszúrást, egy módosítást és egy törlést kötegelt utasítások segítségével!
     try {
          
          //Driver betöltés
          Class.forName("oracle.jdbc.driver.OracleDriver");                                          
          
          //Kapcsolatfelvétel az adatbázissal
          Connection c = DriverManager.getConnection("jdbc:oracle:thin:fg60/qwert@localhost/XE");    
          
          //Statement objektum létrehozása
          Statement stmt = c.createStatement();                                                                  
          
          //Utasítás hozzáadása a köteghez
          stmt.addBatch("INSERT INTO tel VALUES ( 33, 123654, 'ABC123' )");                          
          
          //Utasítás hozzáadása a köteghez
          stmt.addBatch("UPDATE mobiltelefon SET ar = 25000 WHERE cikkszam = '1234ABC567'");          
          //Utasítás hozzáadása a köteghez
          stmt.addBatch("DELETE FROM vevo WHERE ugyfelszam = 44556677");                              
          
          //A kötegelt utasítás végrehajtása
          stmt.executeBatch();                                                                        
          
          //A köteg kiürítése
          stmt.clearBatch();                                                    
     }
     
     //A try blokkban keletkezett kivételek elkapása
     catch (Exception ex) {                                                                        
         //A kivétel szövegének kiírása
         System.out.println(ex.toString());                                                          
     }
Paraméterezzen egy INSERT utasítást!
     try{
          
          //Driver betöltés
          Class.forName("oracle.jdbc.driver.OracleDriver");                                                                                                                                  
          
          //Kapcsolatfelvétel az adatbázissal
          Connection c = DriverManager.getConnection("jdbc:oracle:thin:fg60/qwert@localhost/XE");                                                                                            
          
          //Statement objektum létrehozása
          Statement stmt = c.createStatement();                                                                                                                                              
          
          //Ügyfélszám megadása
          int ugyfelszam = 44556677;                                                                                                                                                                
          
          //Név megadása
          String nev = "Denes";                                                                                                                                                              
          
          //E-mail cím megadása
          String email = "denes@denes.hu";                                                                                                                                                    
          
          //Telefonszám megadása
          int telsz = 0646222333;                                                                                                                                                            
          
          //Irányítószám megadása
          int irsz = 3515;                                                                                                                                                                    
          
          //Város megadása
          String varos = "Miskolc";                                                                                                                                                          
          
          //Utca megadása
          String utca = "Egyetem";                                                                                                                                                            
          
          //Házszám megadása
          int hsz = 2;                                                            
          
          //SQL utasítás megadása és a paraméterek beszúrása
          String utasitas = "INSERT INTO vevo VALUES ( " + ugyfelszam + ", '" + nev + "', '" +
          email + "', " + telsz + ", " + irsz + ", '" + varos + "', '" + utca + "', " + hsz + " )";            
          //SQL utasítás végrehajtása
          stmt.executeQuery(utasitas);                                                                                                                                                        
          
          //Sikeres beszúrás kiírása
          System.out.println("A beszuras sikeres volt.");
     }
     
     //A try blokkban keletkezett kivételek elkapása
     catch (Exception ex) {                                                                      
         //A kivétel szövegének kiírása
         System.out.println(ex.toString());
     }

Kétlépcsős utasítások – PreparedStatement

Az INSERT utasítás paraméterezését oldja meg Prepared Statement-tel és szúrjon be egy rekordot a vevo táblába!
      try {
          
          //Driver betöltés
          Class.forName("oracle.jdbc.driver.OracleDriver");                                                
          
          //Kapcsolódás az adatbázishoz
          Connection c = DriverManager.getConnection("jdbc:oracle:thin:fg60/qwert@localhost/XE");            
          
          //Prepared Statement objektum létrehozása, melyben paraméterezett SQL utasítás szerepel
          PreparedStatement pstmt = c.prepareStatement("INSERT INTO vevo VALUES(?, ?, ?, ?, ?, ?, ?, ?)");  
          //Első paraméter beállítása
          pstmt.setLong(1, 44556677);
          
          //Második paraméter beállítása
          pstmt.setString(2, "Denes");  
          
          //Harmadik paraméter beállítása                                                                    
          pstmt.setString(3, "denes@gmail.com");                                                            
          
          //Negyedik paraméter beállítása
          pstmt.setLong(4, 304567891);                                                                      
          
          //Ötödik paraméter beállítása
          pstmt.setInt(5, 3000);                                                                            
          
          //Hatodik paraméter beállítása
          pstmt.setString(6, "Hatvan");                                                                      
          
          //Hetedik paraméter beállítása
          pstmt.setString(7, "Hegyalja");                                                                    
          
          //Nyolcadik paraméter beállítása
          pstmt.setInt(8, 78);                                                                              
          
          //Az SQL utasítás végrehajtása
          pstmt.executeUpdate();                                                                            
          
          //A try blokkban keletkezett kivételek elkapása
     } catch (Exception ex) {                
         //A kivétel szövegének kiírása                                                      
         System.out.println(ex.toString());
     }
Az UPDATE utasítás paraméterezését oldja meg Prepared Statement-tel és módosítson egy rekordot az elegedettseg táblában!
     try {
          
          //Driver betöltés
          Class.forName("oracle.jdbc.driver.OracleDriver");                                                      
          
          //Kapcsolatfelvétel az adatbázissal
          Connection c = DriverManager.getConnection("jdbc:oracle:thin:fg60/qwert@localhost/XE");                
          
          //Prepared Statement objektum létrehozása, paraméterezett SQL
          //utasítás megadása
          PreparedStatement pstmt = c.prepareStatement("UPDATE elegedettseg SET jellege = ? WHERE vevo = ?");    
          
          //Első paraméter beállítása
          pstmt.setString(1, "pozitiv");                                                                        
          
          //Második paraméter beállítása
          pstmt.setInt(2, 33445566);                                                                                        
          
          //A paraméterezett SQL utasítás végrehajtása
          pstmt.executeUpdate();
     }
     
     //A try blokkban keletkezett kivételek elkapása
     catch (Exception ex) {                
         //A kivétel szövegének kiírása
        System.out.println(ex.toString());                            
     }
A DELETE utasítás paraméterezését oldja meg Prepared Statement-tel és töröljön egy rekordot a mobiltelefon táblából!
     try {
          
          //Driver betöltés
          Class.forName("oracle.jdbc.driver.OracleDriver");                                                      
          
          //Kapcsolatfelvétel az adabázissal
          Connection c = DriverManager.getConnection("jdbc:oracle:thin:fg60/qwert@localhost/XE");                
          
          //Prepared Statement objektum létrehozása és a //paraméterezett SQL utasítás megadása
          PreparedStatement pstmt = c.prepareStatement("DELETE FROM mobiltelefon WHERE ar = ?");                  
          
          //A paraméter beállítása
          pstmt.setInt(1, 89900);                                                                                
          
          //SQL utasítás végrehajtása
          pstmt.executeUpdate();
     }
     
     //A try blokkban keletkezett kivételek elkapása
     catch (Exception ex) {            
         //A kivétel szövegének kiírása
        System.out.println(ex.toString());
     }
Paraméterezze a DELETE utasítás tábla opcióját és egy mező szerinti kiválasztást!
     try {
          Class.forName("oracle.jdbc.driver.OracleDriver");
          Connection c = DriverManager.getConnection("jdbc:oracle:thin:fg60/qwert@localhost/XE");
          String tablanev = "szolgaltato";
          String mnev = "nev";
          PreparedStatement pstmt = c.prepareStatement("EXECUTE IMMEDIATE 'DELETE FROM' || ?  || ' WHERE ' || ? || '=' || ?");
          pstmt.setString(1, "szolgaltato");
          pstmt.setString(2, "nev");
          pstmt.setString(3, "Tmobile");
          pstmt.executeUpdate();
     }
     catch (Exception ex) {
          System.out.println(ex.toString());
     }

Lekérdezek, kurzor-kezelés – ResultSet

Kérdezze le a vevő tábla első rekordjából az ügyfélszámot, a nevet és az e-mail címet!
     try{
          //Driver betöltés
          Class.forName("oracle.jdbc.driver.OracleDriver");                                                      
          
          //Kapcsolatfelvétel az adatbázissal
          Connection c = DriverManager.getConnection("jdbc:oracle:thin:fg60/qwert@localhost/XE");                
          
          //Statement objektum létrehozása
          Statement stmt = c.createStatement();                                                      
          
          //SQL utasítás megadása            
          String utasitas = "SELECT ugyfelszam, nev, e_mail FROM vevo";                                          
          
          //Az SQL utasítás végrehajtása és letárolása egy ResultSetbe
          ResultSet rs = stmt.executeQuery(utasitas);                                                            
          
          //A ResultSet első sorára lépés
          rs.next();                    
          
          //Az ügyfélszám kikérése az aktuális rekordból
          int ugyfelszam = rs.getInt("ugyfelszam");                                                              
          
          //A név kikérése az aktuális rekordból
          String nev = rs.getString("nev");                                                          
          
          //Az e-mail cím kikérése az aktuális rekordból
          String email = rs.getString("e_mail");                                                                  
          
          //Az ügyfélszám kiírása
          System.out.println("Ugyfelszam: " + ugyfelszam);
          
          //A név kiírása
          System.out.println("Név:: " + nev);                                                                    
          
          //Az e-mail cím kiírása
          System.out.println("E-mail: " + email);                                                                
          
          //A Result Set bezárása
          rs.close();                                                    
     }
     //A try blokkban keletkezett kivételek elkapása
     catch (Exception ex) {                                                                        
         //A kivétel szövegének kiírása
         System.out.println(ex.toString());                                                          
     }
Kérdezze le az összes vevő ügyfélszámát, nevét és e-mail címét és jelenítse meg „táblázatos" alakban!
     try{
          //Driver betöltés
          Class.forName("oracle.jdbc.driver.OracleDriver");                                                                              
          
          //Kapcsolatfelvétel az adatbázissal
          Connection c = DriverManager.getConnection("jdbc:oracle:thin:fg60/qwert@localhost/XE");                            
          
          //Statement objektum létrehozása
          Statement stmt = c.createStatement();                                                                                          
          
          //SQL utasítás megadása
          String utasitas = "SELECT * FROM vevo";                                                                                        
          
          //Az SQL utasítás végrehajtása és az eredmény letárolása
          ResultSet rs = stmt.executeQuery(utasitas);                                        
          
          //A ciklus az eredményhalmaz minden során végigmegy                                            
          while (rs.next()) {                                              
              //Az ügyfélszám, név és e-mail lekérése és kiírása az
              //aktuális rekordból                  
               System.out.println(rs.getInt("ugyfelszam") + "\t" + rs.getString("nev") + "\t" + rs.getString("e_mail"));      
          }
     
          //A ResultSet lezárása
          rs.close();
     
     //A try blokkban dobódott kivételek elkapása
     }
     catch (Exception ex) {                                                                
         //A kivétel szövegének kiírása
         System.out.println(ex.toString());
     }
Kérdezze le a vevő tábla első két rekordjából a nevet!
   try{
   //Driver betöltés
   Class.forName("oracle.jdbc.driver.OracleDriver");                                                   
   
   //Kapcsolatfelvétel az adatbázissal
   Connection c = DriverManager.getConnection("jdbc:oracle:thin:fg60/qwert@localhost/XE");             
   
   //Statement objektum létrehozása és beállítása
   Statement stmt = c.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);    
   
   //SQL utasítás végrehajtása és az eredményhalmaz letárolása
   ResultSet rs = stmt.executeQuery("SELECT * FROM vevo");                                             
   
   //A Result Set első sorára ugrás
   rs.first();                     
   
   //A név lekérése és kiírása az aktuális sorból
   System.out.println(rs.getString("nev"));                                                            
   
   //A Result Set következő sorára ugrás           
   rs.next();                                                                                                      
   
   //A név lekérése és kiírása az aktuális sorból
   System.out.println(rs.getString("nev"));                                                          
   
   //A try blokkban dobódott kivételek elkapása  
   } catch (Exception ex) {                                                                                
   //A kivétel szövegének kiírása
   System.out.println(ex.toString());                               
   }
Kérdezze le a mobiltelefon tábla utolsó két rekordjából a mobiltelefon típusát és árát!
     try{
          //Driver betöltés
          Class.forName("oracle.jdbc.driver.OracleDriver");                                                              
          
          //Kapcsolatfelvétel az adatbázissal
          Connection c = DriverManager.getConnection("jdbc:oracle:thin:fg60/qwert@localhost/XE");                        
          
          //Statement objektum létrehozása és beállítása
          Statement stmt = c.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);    
          
          //SQL utasítás végrehajtása és az eredményhalmaz letárolása
          ResultSet rs = stmt.executeQuery("SELECT * FROM mobiltelefon");                                                
          
          //A Result Set utolsó sorára ugrás
          rs.last();              
          
          //Visszalépés egy sorral
          rs.previous();                                                                                      
          
          //A tipus és az ár lekérése és kiírása            
          System.out.println(rs.getString("tipusa") + rs.getInt("ar"));                                                  
          
          //Következő sorra ugrás
          rs.next();                                                                                                      
          
          //A tipus és az ár lekérése és kiírása
          System.out.println(rs.getString("tipusa")+rs.getInt("ar"));                                                
     }
     //A try blokkban keletkezett kivételek elkapása
     catch (Exception ex) {                        
         //A kivétel szövegének kiírása                                            
         System.out.println(ex.toString());                                                                  
     }
Kérdezze le az árusít tábla 2. rekordjából a darabszámot!
   try{
     //Driver betöltés
     Class.forName("oracle.jdbc.driver.OracleDriver");                                                               
   
     //Kapcsolatfelvétel az adatbázissal
     Connection c = DriverManager.getConnection("jdbc:oracle:thin:fg60/qwert@localhost/XE");                         
   
     //Statement objektum létrehozása és beállítása
     Statement stmt = c.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);    
   
     //SQL utasítás végrehajtása és az eredményhalmaz letárolása
     ResultSet rs = stmt.executeQuery("SELECT * FROM arusit");                                           
   
     //A Result Set 2. sorára ugrás
     rs.absolute(2);                    
   
     //Az aktuális sorból a darabszám lekérése és kiírása                                                                             
     System.out.println(rs.getInt("db"));                                                                        
   } 
   //A try blokkban dobódott kivételek elkapása
   catch (Exception ex) {                                                                                
      //A kivétel szövegének kiírása
      System.out.println(ex.toString());                                                                  
   }
Kérdezze le a vevő tábla utolsó előtti 2. rekordból a lakcímet!
   try{
     //Driver betöltés
     Class.forName("oracle.jdbc.driver.OracleDriver");                                                                                                       
   
     //Kapcsolódás az adatbázishoz
     Connection c = DriverManager.getConnection("jdbc:oracle:thin:fg60/qwert@localhost/XE");                      
   
     //Statement objektum létrehozása és beállítása
     Statement stmt = c.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);                                            
   
     //Az SQL utasítás végrehajtása és az eredmény letárolása egy 
     //Result Setbe
     ResultSet rs = stmt.executeQuery("SELECT * FROM vevo");                                                                                     
   
     //A Result Set utolsó sorára ugrás
     rs.last();                                                                                                                                              
     //Az aktuális sortól 2-vel visszalépés
     rs.relative(-2);                      
   
     //A lakhely adatainak lekérése a Result Set aktuális sorából
     System.out.println(rs.getInt("i") + "\n" + rs.getString("v").trim() + ", " + rs.getString("u").trim() + " " + rs.getInt("hsz") +".");       
   } 
   //A try blokkban keletkezett kivételek elkapása
   catch (Exception ex) {                                                                                                                        
     //A kivétel szövegének kiírása
     System.out.println(ex.toString());                                                                                                          
   }

Tárolt eljárás-, függvényhívások – CallableStatement

Hívja meg a tel táblához tartozó csomag insert_tel tárolt eljárását!
   try {
   
     //Driver betöltés
     Class.forName("oracle.jdbc.driver.OracleDriver");                                                       
   
     //Kapcsolatfelvétel az adatbázissal
     Connection c = DriverManager.getConnection("jdbc:oracle:thin:fg60/qwert@localhost/XE");                 
   
     //Callable Statement objektum létrehozása, a tárolt eljárás meghívása és paraméterezése
     CallableStatement cstmt = c.prepareCall("call {tel_csomag.insert_tel(?,?,?)}");               
   
     //Első paraméter beállítása
     cstmt.setInt(1, 44);                                                                        
   
     //Második paraméter beállítása
     cstmt.setLong(2, 4567891);                                                                  
   
     //Harmadik paraméter beállítása
     cstmt.setString(3, "CDE321");                                                               
   
     //A Callable Statement végrehajtása
     cstmt.executeUpdate();                                                                      
   } 
   //A try blokkban keletkezett kivételek elkapása
   catch (Exception ex) {                                                                        
      //A kivételek szövegének kiírása
      System.out.println(ex.toString());                                                          
   }
Hívja meg az árusit táblához tartozó csomag update_arusit tárolt eljárást!
   try {
     //Driver betöltés
     Class.forName("oracle.jdbc.driver.OracleDriver");                                                       
   
     //Kapcsolatfelvétel az adatbázissal
     Connection c = DriverManager.getConnection("jdbc:oracle:thin:fg60/qwert@localhost/XE");     
   
     //Callable Statement objektum létrehozása, a tárolt eljárás meghívása és //paraméterezése
     CallableStatement cstmt = c.prepareCall("{ call arusit_csomag.update_arusit(?,?,?,?)}");       
   
     //Első paraméter beállítása
     cstmt.setInt(1, 765);                                                                       
   
     //Második paraméter beállítása
     cstmt.setInt(2, 15);                                                                        
   
     //Harmadik paraméter beállítása
     cstmt.setString(3, "ABC123");                                                               
     //Negyedik paraméter beállítása
     cstmt.setString(4, "1234ABC567");                                                           
   
     //A tárolt eljárás végrehajtása
     cstmt.executeUpdate();                                                                  
   } 
   //A dobódott kivételek elkapása     
   catch (Exception ex) {                                                                        
     //A kivétel szövegének kiírása
     System.out.println(ex.toString());                                                          
   }
Hívja meg a szolgáltató táblához tartozó csomag delete_szolgaltato tárolt eljárást!
   try {
     //Driver betöltés
     Class.forName("oracle.jdbc.driver.OracleDriver");                                           
   
     //Kapcsolatfelvétel az adatbázissal
     Connection c = DriverManager.getConnection("jdbc:oracle:thin:fg60/qwert@localhost/XE");     
   
     //Callable Statement objektum létrehozása és a tárolt eljárás meghívása és paraméterezése
     CallableStatement cstmt = c.prepareCall("{call szolgaltato_csomag.delete_szolgaltato(?)}");   
   
     //A paraméter beállítása
     cstmt.setString(1, "EFG678");                                                               
   
     //A Callable Statement végrehajtása
     cstmt.executeQuery();                                                                       
   } 
   //A dobódott kivételek elkapása
   catch (Exception ex) {                                                                        
     //A kivétel szövegének kiírása
     System.out.println(ex.toString());                                                          
   }
Hívja meg az elegedett(azonosito) függvényt majd írja ki az eredményt!
    try {
           //Driver betöltés
           Class.forName("oracle.jdbc.driver.OracleDriver");
           
           //Kapcsolatfelvétel az adatbázissal
           Connection c =
           DriverManager.getConnection("jdbc:oracle:thin:fg6/qwert@localhost/XE”);
   
           //Callable Statement objektum létrehozása, a függvény meghívása és 
           //paraméterezése
           CallableStatement cstmt = c.prepareCall("{? = call elegedett(?)}");
   
           //Első paraméter megadása
           cstmt.registerOutParameter(1, java.sql.Types.DOUBLE);
           
           //Második paraméter megadása
           cstmt.setString(2, "ABC123");
           
           //A Callable Statement végrehajtása
           cstmt.executeQuery();
           
           //Eredmény tárolása változóban
           double szazalek = cstmt.getDouble(1);
           
           //Az eredmény kiírása
           System.out.println("A vevok " + szazalek + "%-a elegedett a 
           szolgaltatoval.");
   }
   //A dobódott kivételek elkapása
   catch (Exception ex) {
           //A kivétel szövegének kiírása
           System.out.println(ex.toString());
   }

Hiba-, kivételkezelés

Kezelje le a driver betöltéskor keletkezhető hibákat!
   try {
        //Driver betöltése és inicializálása
         Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();                     
   } 
   //Kivétel, ha a driver nem található
   catch (ClassNotFoundException ex) {                                                   
       System.out.println("Nem talalhato az oracle.jdbc.driver.OracleDriver 
       osztály");
   } 
   //Kivétel, ha a driver nem tölthető be
   catch (IllegalAccessException ex) {                                                   
       System.out.println("Nem toltheto be az oracle.jdbc.driver.OracleDriver");
   } 
   //Kivétel, ha az osztály nem példányosítható
   catch (InstantiationException ex) {                                                   
       System.out.println("Nem peldanyosithato az oracle.jdbc.driver.OracleDriver");
   }
Kezelje le a kapcsolódáskor keletkezhető hibákat!
   try{
      //Driver betöltés
      Class.forName("oracle.jdbc.driver.OracleDriver");                                   
      //Kapcsolódás az adatbázishoz 
       DriverManager.getConnection("jdbc:oracle:thin:fg60/qwert@localhost/XE");            
   } 
   //Driver betöltés kivételének elkapása
   catch (ClassNotFoundException ex) {                                                   
      //A kivétel szövegének kiírása
      System.out.println(ex.toString());      
   } 
   //SQL kivételek elkapása
   catch (SQLException ex) {
      //A kivétel szövegének kiírása
      System.out.println("A kapcsolodas nem sikerult, a hiba oka:\n" + 
      ex.toString());    
   }

Metaadatok feldolgozása

Kérje le az Ön által használt adatbázis nevét és verzióját!
   try {
     //Driver betöltés
     Class.forName("oracle.jdbc.driver.OracleDriver");                                           
   
     //Kapcsolódás az adatbázishoz
     Connection c = DriverManager.getConnection("jdbc:oracle:thin:fg60/qwert@localhost/XE");     
   
     //A metaadatok lekérése
     DatabaseMetaData md = c.getMetaData();                                                      
   
     //Az adatbázis nevének lekérése és letárolása
     String nm = md.getDatabaseProductName();     
   
     //Az adatbázis verziójának lekérése és letárolása                                               
     String ver = md.getDatabaseProductVersion();                                                            
   
     //az adatbázis nevének és verziójának kiírása
     System.out.println("Adatbazis neve: " + nm + "\nAdatbazis verzioja: " + ver);               
   } 
   //Dobódott kivételek elkapása
   catch (Exception ex) {                                                                        
     //Kivétel szövegének kiírása
     System.out.println(ex.toString());                                                          
   }
Kérje le az Ön által használt JDBC driver nevét és verzióját!
   try {
     //Driver betöltés
     Class.forName("oracle.jdbc.driver.OracleDriver");                                                       
   
     //Kapcsolódás az adatbázishoz
     Connection c = DriverManager.getConnection("jdbc:oracle:thin:fg60/qwert@localhost/XE");     
   
     //Metaadatok lekérése
     DatabaseMetaData md = c.getMetaData();                                                      
   
     //Driver nevének lekérése és letárolása
     String dnm = md.getDriverName();                                                                        
   
     //Driver verziójának lekérése és letárolása
     String dver = md.getDriverVersion();                                                        
   
     //Driver nevének és verziójának kiírása
     System.out.println("Driver neve: " + dnm + "\nDriver verzioja: " + dver);                   
   } 
   //Dobódott kivételek elkapása
   catch (Exception ex) {                                                                        
     //Kivétel szövegének kiírása
     System.out.println(ex.toString());                                                          
   }
Listázza ki az Ön által használt adatbázis aktív sémáit!
   try {
     //Driver betöltés
     Class.forName("oracle.jdbc.driver.OracleDriver");                                           
   
     //Kapcsolatfelvétel az adatbázissal
     Connection c = DriverManager.getConnection("jdbc:oracle:thin:fg60/qwert@localhost/XE");     
   
     //Metaadatok lekérése
     DatabaseMetaData md = c.getMetaData();                                                      
   
     //Sémák lekérése és letárolása egy eredményhalmazba
     ResultSet rs = md.getSchemas();                                                             
   
     //A Result Set összes során végigmegy
     while (rs.next())                                                                           
        //A sémák lekérése és kiírása
        System.out.println(rs.getString("TABLE_SCHEM"));                                        
   }
   //Dobódott kivételek elkapása
   catch (Exception ex) {                                                                        
     //Kivétel szövegének kiírása
     System.out.println(ex.toString());
   }
Írassa ki hány db mezőt tartalmaz a szolgáltató tábla egy rekordja!
   try {
      //Driver betöltés
     Class.forName("oracle.jdbc.driver.OracleDriver");                                           
   
     //Kapcsolódás az adatbázishoz
     Connection c = DriverManager.getConnection("jdbc:oracle:thin:fg60/qwert@localhost/XE");     
   
     //Statement objektum létrehozása
     Statement stmt = c.createStatement();                                                       
   
     //SQL parancs futtatása és az eredményhalmaz letárolása
     ResultSet rs = stmt.executeQuery("SELECT * FROM szolgaltato");                                          
   
     //Az eredményhalmaz metaadatainak lekérése
     ResultSetMetaData rsmd = rs.getMetaData();                                                  
   
     //A mezőszámot tartalmazó metaadat letárolása
     int db = rsmd.getColumnCount();              
   
     //A mezőszám kiíratása
     System.out.println("A rekordnak " + db + " db mezoje van.");                                
   } 
   //Dobódott kivételek elkapása
   catch (Exception ex) {                                                                        
      //A kivétel szövegének kiírása
     System.out.println(ex.toString());                                                          
   }
Írassa ki a vevő tábla mezőinek nevét és típusát!
   try {
     //Driver betöltése
     Class.forName("oracle.jdbc.driver.OracleDriver");                                          
   
     //Kapcsolatfelvétel az adatbázissal 
     Connection c = DriverManager.getConnection("jdbc:oracle:thin:fg60/qwert@localhost/XE");     
   
     //Statement objektum létrehozása
     Statement stmt = c.createStatement();                                                       
   
     //SQL parancs végrehajtása és az eredményhalmaz letárolása
     ResultSet rs = stmt.executeQuery("SELECT * FROM vevo");                                     
   
     //Az eredményhalmaz metaadatainak lekérése
     ResultSetMetaData rsmd = rs.getMetaData();                                                  
     for (int i=1; i<=rsmd.getColumnCount(); i++) {
       //A mezőnevek lekérése
       String cnm = rsmd.getColumnName(i);                                                     
   
       //Mezőtípus lekérése
       String tnm = rsmd.getColumnTypeName(i);                                                                 
       //Aktuális mező nevének és típusának kiírása System.out.println("Mezo neve: " + cnm + ", tipusa: " + tnm);                           
     }
   } 
   //Dobódott kivételek elkapása
   catch (Exception ex) {    
     //Kivétel szövegének kiírása                                                                    
     System.out.println(ex.toString());
   }

ADO.NET

Kapcsolat felvétel

Hozzon létre egy kapcsolatot az OleDb connectorral Oracle adatbázishoz, nyissa meg azt, és amennyiben sikeres a kapcsolódás, írja azt ki a Console-ra. Hiba esetén a program jelezzen!
   try {
       // kapcsolat példányosítása, benne a kapcsolati string-gel
      OleDbConnection con = new OleDbConnection(@"Provider=MSDAORA.1;"
      +"Password=password; User ID=username; Data Source=localhost;");
   
      // kapcsolat megnyitása                
      con.Open();
   
      // kiírás a console-ra
      Console.WriteLine("A kapcsolódás sikeres.");                        
   
      // kapcsolat lezárása
      con.Close();        
      Console.ReadLine();
   }
   // kivétel elkapása
   catch (Exception ex)                                                                                
   {        
       // hiba esetén a hibaüzenet kiírása console-ra
     Console.WriteLine("Sikertelen kapcsolódás: " + ex.ToString());                
     Console.ReadLine();
   }
Hozzon létre az előzőhöz hasonlóan egy kapcsolatot az Oracle adatbázishoz OleDb connectorral, de a kapcsolati stringben használjon paramétereket. Sikeres kapcsolódás esetén írja azt ki a Console-ra. Hiba esetén a program jelezzen!
   try
   {
      // szöveges változók létrehozása paraméteres kapcsolathoz, a 
      // felhasználónév és jelszó letárolva bennük
      String user = "username", pwd="password";                
   
      // OleDbConnection példányosítása, benne a paraméterezett kapcsolati 
      // string-gel
      OleDbConnection con = new OleDbConnection(@"Provider=MSDAORA.1; 
      Password="+pwd+"; User ID="+user+"; Data Source=localhost;");
   
      // kapcsolat megnyitása                                        
      con.Open();                                
   
      // kiírás a console-ra
      Console.WriteLine("A kapcsolódás sikeres.");
   
      // kapcsolat lezárása
      con.Close();                                
      Console.ReadLine();
   }
   // kivétel elkapása
   catch (Exception ex)                                                                                
   {
      // hiba esetén a hibaüzenet kiírása console-ra
      Console.WriteLine("Sikertelen kapcsolódás: " + ex.ToString());                
      Console.ReadLine();
   }
Kapcsolódjon adatbázishoz Odbc driver segítségével, siker esetén ezt szöveggel jelezze a Console-on. Hiba esetén a program jelezzen!
   try
   {
      // OdbcConnection példányosítása, üres kapcsolati string-gel
     OdbcConnection con = new OdbcConnection();                        
   
     // kapcsolati string beállítása
     con.ConnectionString = "Driver={SQL Server};Server=localhost;"+"UID=username;PWD=password;Database=telefon;";
   
   
     // kapcsolat megnyitása        
     con.Open();                                        
   
     // kiírás a console-ra
     Console.WriteLine("A kapcsolódás sikeres.");        
   
     // kapcsolat lezárása
      con.Close();
      Console.ReadLine();
   }
   // kivétel elkapása
   catch (Exception ex)                                                                                
   {
      // hiba esetén a hibaüzenet kiírása console-ra
      Console.WriteLine("Sikertelen kapcsolódás: " + ex.ToString());        
      Console.ReadLine();
   }
Az előző feladat kapcsolatának paraméterezése a könnyebb használhatóság érdekében. Hiba esetén a program jelezzen!
   try
   {
      // szöveges változók létrehozása paraméteres kapcsolathoz, a 
      // felhasználónév és jelszó letárolva bennük
      String user = "username", pwd="password";        
   
      // OdbcConnection példányosítása, üres kapcsolati string-gel
      OdbcConnection con = new OdbcConnection();        
   
      // kapcsolati string beállítása paraméterekkel
      con.ConnectionString = "Driver={SQL  Server};Server=localhost;UID="
       +username+";PWD="+password+";Database=telefon;";
   
      // kapcsolat megnyitása                
       con.Open();                                                        
   
      // kiírás console-ra
      Console.WriteLine("A kapcsolódás sikeres.");        
   
      // kapcsolat lezárása
      con.Close();                                
      Console.ReadLine();
   }
   // kivétel elkapása
   catch (Exception ex)                                                                                
   {
      // hibaüzenet kiírása a console-ra
      Console.WriteLine("Sikertelen kapcsolódás: " + ex.ToString());
      Console.ReadLine();
   }

DDL, DML utasítások

Kapcsolódjon paraméteresen OleDb driverrel, majd hozzon létre egy ’temp’ nevű táblát, és töltse fel adatokkal. Hiba esetén a program jelezzen!
     try
     {
          // szöveges változók létrehozása a paraméterezett kapcsolathoz
          String user = "username", pwd = "password";               
          
          // kapcsolat példányosítása, paraméterezett kapcsolati string-gel
          OleDbConnection con = new OleDbConnection(@"Provider=MSDAORA.1; Password=" + pwd + "; User ID=" + user + "; Data Source=localhost;");
          
          // kapcsolat megnyitása                                       
          con.Open();                                                       
          
          // parancs létrehozása a kapcsolaton
          OleDbCommand cmd = con.CreateCommand();       
          
          // parancs szövegének beállítása - tábla létrehozása
          cmd.CommandText = "CREATE TABLE temp (ID CHAR(4), nev VARCHAR(25), email VARCHAR(25))";       
          
          // parancs végrehajtása
          cmd.ExecuteNonQuery();                                               
          
          // parancs szövegének beállítása - adatok felvitele a táblába
          cmd.CommandText = "INSERT INTO temp VALUES
          (1234,'nev1','nev1@hotmail.com')";
          // parancs végrehajtása
          cmd.ExecuteNonQuery();                                                               
          cmd.CommandText = "INSERT INTO temp VALUES
          (5678,'nev2','nev2@hotmail.com')";
          cmd.ExecuteNonQuery();
          
          // kapcsolat lezárása
          con.Close();       
          Console.ReadLine();
     }
     // keletkező kivételek elkapása
     catch (Exception ex)                                                                               
     {
          // kivétel / hiba szövegének a console-ra iratása
          Console.WriteLine("Hiba: " + ex.ToString());                                       
          Console.ReadLine();
     }
A létrehozott ’temp’ nevű táblát törölje az adatbázisból. Hiba esetén a program jelezzen.
     try
     {
          // paraméterezett kapcsolathoz a szöveges változók létrehozása
          String user = "username", pwd = "password";               
          
          // kapcsolat példányosítása, a kapcsolati string paraméterezett
          OleDbConnection con = new OleDbConnection(@"Provider=MSDAORA.1; Password=" + pwd + "; User ID=" + user + "; Data Source=localhost;");
          
          // kapcsolat megnyitása                       
          con.Open();               
          
          // utasítás létrehozása
          OleDbCommand cmd = con.CreateCommand();       
          
          // az utasítás: temp tábla eldobása
          cmd.CommandText = "DROP TABLE temp";
          
          // utasítás végrehajtása
          cmd.ExecuteNonQuery();               
          
          // kapcsolat lezárása
          con.Close();       
          Console.ReadLine();
     }
     // keletkező kivételek elkapása
     catch (Exception ex)                                                                               
     {
          // hibák kiíratása console-ra
          Console.WriteLine("Hiba: " + ex.ToString());                                       
          Console.ReadLine();
     }
Hozzon létre kapcsolatot, és törölje a ’vevo’ táblából azt a sort, amelyben az ’ugyfelszam’ értéke 11223344-re van állítva. Hiba esetén a program jelezzen.
     try
     {
          // szöveges változók létrehozása a paraméterezett kapcsolathoz
          String user = "username", pwd = "password";       
          
          // kapcsolat példányosítása, benne a paraméterezett kapcsolati string-
          // gel
          OleDbConnection con = new OleDbConnection(@"Provider=MSDAORA.1; Password=" + pwd + "; User ID=" + user + "; Data Source=localhost;");
          
          // kapcsolat megnyitása                                       
          con.Open();                                               
          
          // parancs létrehozása a kapcsolaton
          OleDbCommand cmd = con.CreateCommand();       
          
          // parancs szövegének beállítása - az 11223344 ügyfélszámú vevő törlése
          // a táblából
          cmd.CommandText = "DELETE FROM vevo WHERE ugyfelszam = 11223344";
          
          // parancs végrehajtása
          cmd.ExecuteNonQuery();               
          
          // kapcsolat lezárása
          con.Close();       
          Console.ReadLine();
     }
     // keletkező kivételek elkapása
     catch (Exception ex)                                                                               
     {
          // hibaüzenet console-ra iratása
          Console.WriteLine("Hiba: " + ex.ToString());                                       
          Console.ReadLine();
     }
Hozzon létre paraméterezett kapcsolatot, majd tároljon le egy új sort a ’vevo’ táblában. Hiba esetén a program jelezzen.
     try
     {
          // szöveges változók létrehozása a paraméterezett kapcsolathoz
          String user = "username", pwd = "password";       
          
          // paraméterezett kapcsolat példányosítása
          OleDbConnection con = new OleDbConnection(@"Provider=MSDAORA.1; Password=" + pwd + "; User ID=" + user + "; Data Source=localhost;");
          
          // kapcsolat megnyitása
          con.Open();               
          // utasítás létrehozása, az utasítás törzse üres
          OleDbCommand cmd = con.CreateCommand();       
          
          // utasítás szövegének megadása, új sor beszúrása a vevo táblába
          cmd.CommandText = "INSERT INTO vevo VALUES (11223344,'Agoston',"
          +"'agoston@hotmail.com',625214142,3245,'Hatvan','Valahol',324)";
          
          // utasítás végrehajtása
          cmd.ExecuteNonQuery();
          
          // kapcsolat lezárása
          con.Close();       
          Console.ReadLine();
     }
     // keletkező kivételek elkapása
     catch (Exception ex)
     {
          // hibák kiíratása console-ra
          Console.WriteLine("Hiba: " + ex.ToString());                                       
          Console.ReadLine();
     }
Sikeres kapcsolódás után állítsa az 11223344 ügyfélszámű vevő nevét Ágostonra! Hiba esetén a program jelezzen.
     try
     {
          // szöveges változók létrehozása a paraméterezett kapcsolathoz
          String user = "username", pwd = "password";
          
          // paraméterezett kapcsolat példányosítása
          OleDbConnection con = new OleDbConnection(@"Provider=MSDAORA.1; Password=" + pwd + "; User ID=" + user + "; Data Source=localhost;");       
          
          // kapcsolat megnyitása
          con.Open();               
          
          // parancs létrehozása
          OleDbCommand cmd = con.CreateCommand();       
          
          // parancs szövege
          cmd.CommandText = "UPDATE vevo SET nev='Agoston' WHERE
          ugyfelszam=11223344";
          
          // az utasítás végrehajtása
          cmd.ExecuteNonQuery();                       
          
          // a kapcsolat lezárása
          con.Close();                                                                               
          Console.ReadLine();
     }
     // keletkező kivételek elkapása
     catch (Exception ex)                                                                               
     {
          // hibák kiírása console-ra
          Console.WriteLine("Hiba: " + ex.ToString());                                       
          Console.ReadLine();
     }

Kétlépcsős utasítások

Kapcsolódjon paraméteresen az adatbázishoz, majd hajtson végre egy paraméterezett lekérdezést, az eredményt DataReader-ben tárolja, majd írja ki Console-ra. Hiba esetén a program jelezzen!
     try
     {
          // szöveges változók a paraméteres kapcsolódáshoz
          String user = "username", pwd = "password";       
          
          // OleDb kapcsolat, paraméteres kapcsolati string-gel
          OleDbConnection con = new OleDbConnection(@"Provider=MSDAORA.1; Password=" + pwd + "; User ID=" + user + "; Data Source=localhost;");
          
          // kapcsolat megnyitása                       
          con.Open();                               
          
          // nev mező lekérése a vevő táblából, ugyfelszam paraméterezve. ez a
          // parancs letárolva szöveges változóba
          String utasitas = "SELECT nev FROM vevo WHERE ugyfelszam = ?";
          
          // parancs példányosítása
          OleDbCommand cmd = con.CreateCommand();               
          
          // parancs szövegének megadása
          cmd.CommandText = utasitas;                               
          
          // paraméter példányosítás
          OleDbParameter parameter = new OleDbParameter();       
          
          // paraméter hozzáadása
          cmd.Parameters.Add(parameter);               
          
          // paraméter beállítása
          parameter.Value = "33445566";               
          
          // a parancs végrehajtása, az eredmény egy DataReader objektumban
          // tároljuk
          OleDbDataReader dataReader = cmd.ExecuteReader();       
          
          // ciklus az eredmény kiíratásához, a DataReader Read() metódusát
          // használva
          while (dataReader.Read())               
          
          // az aktuális ugyfelszam kiíratása console-ra
          Console.WriteLine("Nev: " + dataReader["nev"]);       
          
          // datareader lezárása
          dataReader.Close();               
          // kapcsolat lezárása
          con.Close();       
          Console.ReadLine();
     }
     // keletkező kivételek elkapása
     catch (Exception ex)                                                                               
     {
          // hibák kiíratása console-ra
          Console.WriteLine("Hiba: " + ex.ToString());                                       
          Console.ReadLine();
     }
Kapcsolat létrehozása után paraméterezett INSERT műveletet hajtson végre. Állítsa be a paraméterek értékét tetszőleges értékekre. Hiba esetén a program jelezzen.
     try
     {
          // szöveges változók létrehozása paraméterezett kapcsolathoz
          String user = "username", pwd = "password";       
          
          // paraméterezett kapcsolat példányosítása
          OleDbConnection con = new OleDbConnection(@"Provider=MSDAORA.1; Password=" + pwd + "; User ID=" + user + "; Data Source=localhost;");
          
          // kapcsolat megnyitása                               
          con.Open();                               
          
          // utasítás létrehozása a CreateCommand() metódus segítségével, az
          // utasítás törzse üres
          OleDbCommand cmd = con.CreateCommand();
          
          // utasítás szövege, az paraméterezett
          cmd.CommandText = "INSERT INTO vevo VALUES (?,?,?,?,?,?,?,?)";
          
          // OleDbParameter példányosítása
          OleDbParameter parameter1=new OleDbParameter();
          
          // paraméter értékének beállítása
          parameter1.Value = "99887766";                               
          
          // a paraméter hozzáadása az utasításhoz
          cmd.Parameters.Add(parameter1);               
          
          OleDbParameter parameter2 = new OleDbParameter();
          parameter2.Value = "Zeno";
          cmd.Parameters.Add(parameter2);
          
          OleDbParameter parameter3 = new OleDbParameter();
          parameter3.Value = "zeno@hotmail.com";
          cmd.Parameters.Add(parameter3);
          
          OleDbParameter parameter4 = new OleDbParameter();
          parameter4.Value = "6701112244";
          cmd.Parameters.Add(parameter4);
          
          OleDbParameter parameter5 = new OleDbParameter();
          parameter5.Value = "3421";
          cmd.Parameters.Add(parameter5);
          
          OleDbParameter parameter6 = new OleDbParameter();
          parameter6.Value = "Varos";
          cmd.Parameters.Add(parameter6);
          
          OleDbParameter parameter7 = new OleDbParameter();
          parameter7.Value = "Utca";
          cmd.Parameters.Add(parameter7);
          
          OleDbParameter parameter8 = new OleDbParameter();
          parameter8.Value = "34";
          cmd.Parameters.Add(parameter8);
                                         
          // utasítás végrehajtása
          cmd.ExecuteNonQuery();       
          
          // a kapcsolat lezárása
          con.Close();               
          Console.ReadLine();
     }
     // keletkező kivételek elkapása
     catch (Exception ex)                                                                               
     {
          // hibák szövegének kiíratása a console-ra
          Console.WriteLine("Hiba: " + ex.ToString());                                       
          Console.ReadLine();
     }
Az 7.4.2/5. feladathoz hasonlóan szintén az 11223344 ügyfélszámú vevő nevét írja át, de most paraméteresen. Hiba esetén a program jelezzen.
     try
     {
          // szöveges változók létrehozása a paraméterezett kapcsolathoz
          String user = "username", pwd = "password";                       
          
          // paraméterezett kapcsolat példányosítás
          OleDbConnection con = new OleDbConnection(@"Provider=MSDAORA.1; Password=" + pwd + "; User ID=" + user + "; Data Source=localhost;");       
          
          // kapcsolat megnyitása                                       
          con.Open();
          
          // új utasítás létrehozása                               
          OleDbCommand cmd = con.CreateCommand();               
          
          // az utasítás szövege, paraméterrel
          cmd.CommandText = "UPDATE vevo SET nev=? WHERE ugyfelszam=11223344";
          
          // paraméter példányosítása
          OleDbParameter parameter = new OleDbParameter();       
          
          // a paraméter értékének beállítása Tamas-ra
          parameter.Value="Tamas";       
          
          // a paraméter hozzáadása az utasításhoz
          cmd.Parameters.Add(parameter);               
          
          // utasítás végrehajtása (paraméterrel)
          cmd.ExecuteNonQuery();
          
          // kapcsolat lezárása
          con.Close();                                                               
          Console.ReadLine();
     }
     // keletkező kivételek elkapása
     catch (Exception ex)                                                                               
     {
          // kiírás console-ra
          Console.WriteLine("Hiba: " + ex.ToString());                                       
          Console.ReadLine();
     }
Kapcsolódjon adatbázishoz, majd töröljön a 'vevo' táblából paraméteresen. A paraméter az ügyfélszám mezőre vonatkozzon.
     try
     {
          // szöveges változók létrehozása a paraméterezett kapcsolathoz
          String user = "username", pwd = "password";               
          
          // kapcsolat példányosítása, benne a paraméterezett kapcsolati string-
          // gel
          OleDbConnection con = new OleDbConnection(@"Provider=MSDAORA.1; Password=" + pwd + "; User ID=" + user + "; Data Source=localhost;");
          
          // kapcsolat megnyitása                               
          con.Open();                                       
          
          // parancs létrehozása a kapcsolaton
          OleDbCommand cmd = con.CreateCommand();               
          
          // parancs szövegének beállítása paraméterezett DELETE parancsra
          cmd.CommandText = "DELETE FROM vevo WHERE ugyfelszam = ?";       
          
          // új paraméter példányosítása
          OleDbParameter parameter = new OleDbParameter();
          
          // paraméter hozzárendelése a parancshoz
          cmd.Parameters.Add(parameter);       
          
          // paraméter értékének beállítása
          parameter.Value="11223344";       
          
          // parancs végrehajtása
          cmd.ExecuteNonQuery();       
          
          // kapcsolat lezárása
          con.Close();
          Console.ReadLine();
     }
     // kivételek elkapása
     catch (Exception ex)                                                                               
     {
          // keletkező hibaüzenet kiíratása console-ra
          Console.WriteLine("Hiba: " + ex.ToString());                                       
          Console.ReadLine();
     }

Lekérdezek, kurzor-kezelés

Hozzon létre paraméterezett kapcsolatot, majd hajtson végre egy lekérdezést (pl.: „SELECT ugyfelszam FROM vevo”). Az eredményt egy DataReader-ben tárolja, majd irassa ki az első sorát. Hiba esetén a program jelezzen.
     try
     {
          // szöveges változók létrehozása a paraméterezett kapcsolathoz
          String user = "username", pwd = "password";       
          
          // kapcsolat példányosítása, benne a kapcsolati string-gel, ami
          // paraméterezett
          OleDbConnection con = new OleDbConnection(@"Provider=MSDAORA.1; Password=" + pwd + "; User ID=" + user + "; Data Source=localhost;");
          
          // kapcsolat megnyitása                               
          con.Open();                                                       
          
          // utasitas nevű string deklarálása, benne a SELECT paranccsal
          String utasitas = "SELECT ugyfelszam FROM vevo";       
          
          // utasítás létrehozása a kapcsolathoz
          OleDbCommand cmd = con.CreateCommand();               
          
          // az utasítás beállítása az utasitas szöveges változóhoz
          cmd.CommandText = utasitas;                                       
          
          // datareader példányosítása, feltöltés a parancs ExecuteReader()
          // metódusát használva
          OleDbDataReader dataReader = cmd.ExecuteReader();       
          
          // datareader első sorának beolvasása
          dataReader.Read();                                       
          
          // a datareaded ugyfelszam mezőjének kiíratása a console-ra
          Console.WriteLine("Ugyfelszam: " + dataReader["ugyfelszam"]);       
          
          // datareader lezárása
          dataReader.Close();                       
          
          // kapcsalat lezárása
          con.Close();               
          Console.ReadLine();
     }
     // kivételek elkapása
     catch (Exception ex)                                                                               
     {
          // hibaüzenet kiíratása
          Console.WriteLine("Hiba: " + ex.ToString());                                       
          Console.ReadLine();
     }
Az előző feladatban használt lekérdezés minden sorát írja ki. Használja a StringBuilder Append() metódusát. Hiba esetén a program jelezzen.
     try
     {
          // szöveges változók létrehozása a paraméterezett kapcsolathoz
          String user = "username", pwd = "password";       
          
          // kapcsolat példányosítása, benne a kapcsolati string-gel, ami
          // paraméterezett
          OleDbConnection con = new OleDbConnection(@"Provider=MSDAORA.1; Password=" + pwd + "; User ID=" + user + "; Data Source=localhost;");
          
          // kapcsolat megnyitása                               
          con.Open();
          
          // utasitas nevű string deklarálása, benne a SELECT paranccsal
          String utasitas = "SELECT ugyfelszam FROM vevo";
          
          // utasítás létrehozása a kapcsolathoz
          OleDbCommand cmd = con.CreateCommand();       
          
          // az utasítás beállítása az utasitas szöveges változóhoz
          cmd.CommandText = utasitas;               
          // paraméter példányosítása
          OleDbParameter parameter = new OleDbParameter();
          
          // datareader példányosítása, feltöltés a parancs ExecuteReader()
          // metódusát használva
          OleDbDataReader dataReader = cmd.ExecuteReader();
          
          // stringbuilder létrehozása az eredmény tárolásához
          System.Text.StringBuilder eredmeny = new System.Text.StringBuilder();
          
          // while ciklus használata az eredmeny stringbulider feltöltéséhez
          while (datareader.Read())                                                               
          {
               eredmeny.Append("ugyfelszam = ");
                       // a datareader ugyfelszam mezőjének értéke bekerül az eredmeny
               // nevű stringbuliderbe, annak Append() metódusát használva
                     eredmeny.Append(datareader["ugyfelszam"] + "\n");                                eredmeny.Append("\n");
          }
          // eredmeny kiíratása
          Console.WriteLine(eredmeny);       
          
          // a datareader bezárása
          dataReader.Close();       
          
          // kapcsolat lezárása
          con.Close();
          Console.ReadLine();
     }
     // keletkező kivételek elkapása
     catch (Exception ex)                                                                               
     {
          // hibaüzenet kiíratása
          Console.WriteLine("Hiba: " + ex.ToString());                                       
          Console.ReadLine();
     }
Ugyanezen lekérdezés kiíratása StringBuilder nélkül, azonnal a Console-ra. Hiba esetén a program jelezzen.
     try
     {
          // OdbcConnection példányosítása a kapcsolathoz
          OdbcConnection con = new OdbcConnection();       
          
          // kapcsolati string beállítása
          con.ConnectionString = "Driver={SQL  Server};Server=localhost;"
          +"UID=username;PWD=password;Database=telefon;";       
          
          // kapcsolat megnyitása       
          con.Open();                               
          // utasítás példányosítása
          OdbcCommand cmd = new OdbcCommand("SELECT ugyfelszam FROM vevo", con);
          
          // parancs végrehajtása, az eredményt egy DataReader objektum tárolja
          OdbcDataReader dataReader = cmd.ExecuteReader();       
          
          // ciklus, amígy a datareader-ből olvasás igaz-zal tér vissza (amíg
          // lehet olvasni)
          while (dataReader.Read())                                                               
          {
               // ugyfelszam kiíratása console-ra
               Console.WriteLine("Ugyfelszam: "+dataReader["ugyfelszam"]);               
          }
          // datareader lezárása
          dataReader.Close();       
          
          // kapcsolat lezárása
          con.Close();       
          Console.ReadLine();
     }
     // kivételek elkapása
     catch (Exception ex)                                                                       
     {
          // hiba kiíratása console-ra
          Console.WriteLine("Hiba: " + ex.ToString());                                       
          Console.ReadLine();
     }
Kapcsolódjon paraméteresen az adatbázishoz, hajtson végre egy lekérdezést, és az eredményt DataSet-ben tárolja. Ezután írja ki annak írja ki első sorát. Hiba esetén a program jelezzen.
     try
     {
          // szöveges változók létrehozása paraméterezett kapcsolathoz
          String user = "username", pwd = "password";                               
          
          // kapcsolat példányosítása, a kapcsolati string paraméterezett
          OleDbConnection con = new OleDbConnection(@"Provider=MSDAORA.1;
          Password="+ pwd + "; User ID=" + user + "; Data Source=localhost;");
          
          // kapcsolat megnyitása                                       
          con.Open();               
          
          // adapter létrehozása, benne a lekérdezés sql parancsával
          OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT ugyfelszam FROM vevo", con);
          
          // DataSet példányosítása a lekérdezett adatok táblázatban történő tárolásához
          DataSet dataSet = new DataSet();
          
          // az adapterben lévő lekérdezés végrehajtása, annak eredménye betöltve // a DataSet-be, a vevo nevű táblába
          adapter.Fill(dataSet, "vevo");       
          
          // DataRow objektum létrehozása, amiben letároljuk a DataSet vevo
          // táblájának 0. sorát
          DataRow row = dataSet.Tables["vevo"].Rows[0];       
          
          // a DataRow ugyfelszam nevű cellájában lévő érték kiíratása console-ra
          Console.WriteLine("Ugyfelszam:" + "\t" + row["ugyfelszam"]);
          
          // a DataSet kiürítése              
          dataSet.Clear();       
          
          // kapcsolat lezárása
          con.Close();       
          Console.ReadLine();
     }
     // keletkező kivételek elkapása
     catch (Exception ex)                                                                               
     {
          // hibák kiíratása console-ra
          Console.WriteLine("Hiba: " + ex.ToString());                                        Console.ReadLine();
     }
Az előző lekérdezés eredményét a DataSet-ből foreach ciklussal irassa ki. Hiba esetén a program jelezzen.
     try
     {
          // szöveges változók a paraméterezhető kapcsolathoz
          String user = "username", pwd = "password";       
          
          // paraméterezett kapcsolat példányosítása
          OleDbConnection con = new OleDbConnection(@"Provider=MSDAORA.1; Password=" + pwd + "; User ID=" + user + "; Data Source=localhost;");
          
          // kapcsolat megnyitása                                                       
          con.Open();          
          
          // új adapter példányosítása, benne a paranccsal
          OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT ugyfelszam FROM vevo", con);
          
          // DataSet példányosítás az adatok tárolására
          DataSet dataSet = new DataSet();       
          
          // a parancs eredményének betöltése a DataSet-be, a "vevo" táblába
          adapter.Fill(dataSet, "vevo");       
          
          // foreach ciklussal a vevo táblából sorokat (jelen esetben mindig az
          // ugyfelszam cellát) szedjük ki
          foreach (DataRow row in dataSet.Tables["vevo"].Rows)                               
          {
               Console.WriteLine("Ugyfelszam:" + "\t" + row["ugyfelszam"]);
          }
          // kapcsolat lezárása
          con.Close();
          Console.ReadLine();
     }
     // keletkező kivételek elkapása
     catch (Exception ex)
     {
          // hibák kiíratása console-ra
          Console.WriteLine("Hiba: " + ex.ToString());
          Console.ReadLine();
     }

Tárolt eljárás-, függvényhívások

Sikeres kapcsolódás után a ’vevo_csomag’ ’delete_vevo’ tárolt eljárását használva törölje azon vevőt, akinek ügyfélszáma 11223344. Hiba esetén a program jelezzen.
     try
     {
          // szöveges változók létrehozása a paraméterezett kapcsolathoz
          String user = "username", pwd = "password";                               
          
          // paraméterezett kapcsolat pédányosítása
          OleDbConnection con = new OleDbConnection(@"Provider=MSDAORA.1; Password=" + pwd + "; User ID=" + user + "; Data Source=localhost;");       
          
          // kapcsolat megnyitása az Open() metódussal
          con.Open();                               
          
          // utasítás létrehozása üres törzzsel
          OleDbCommand cmd = con.CreateCommand();       
          
          // az utasítás típusa egy tárolt eljárás
          cmd.CommandType = System.Data.CommandType.StoredProcedure;
          
          // az utasítás szövege: a vevo_csomag-ban taláható delete_vevo procedúra
          // végrehajtása
          cmd.CommandText = "vevo_csomag.delete_vevo";
          
          // paraméter példányosítása
          OleDbParameter parameter = new OleDbParameter();
          
          // paraméter értéke: ezt az ugyfelszamú vevőt törli az eljárás a
          // táblából
          parameter.Value = "11223344";
          
          // a paraméter hozzárendelése az utasításhoz
          cmd.Parameters.Add(parameter);
          
          // utasítás végrehajtása
          cmd.ExecuteNonQuery();
          
          // kapcsolat lezárása
          con.Close();
          Console.ReadLine();
     }
     // keletkező kivételek elkapása
     catch (Exception ex)                                                                               
     {
          // hibák kiíratása console-ra
          Console.WriteLine("Hiba: " + ex.ToString());                                       
          Console.ReadLine();
     }
Szúrjon be egy új sort a ’vevo’ táblába a ’vevo_csomag’-ban található ’insert_vevo’ tárolt eljárás segítségével. Hiba esetén a program jelezzen!
     try
     {
          // szöveges változók létrehozása paraméterezett kapcsolathoz
          String user = "username", pwd = "password";                                       
          
          // paraméterezett kapcsolat példányosítása
          OleDbConnection con = new OleDbConnection(@"Provider=MSDAORA.1; Password=" + pwd + "; User ID=" + user + "; Data Source=localhost;");
          
          // kapcsolat megnyitása                       
          con.Open();                       
          
          // utasítás létrehozása
          OleDbCommand cmd = con.CreateCommand();
          
          // az utasítás típusa: belső tárolt eljárás
          cmd.CommandType = System.Data.CommandType.StoredProcedure;       
          
          // az utasítás törzsének megadása: a vevo_csomag-ban taláható
          // insert_vevo procedúra használata
          cmd.CommandText = "vevo_csomag.insert_vevo";                                                               
          // paraméter példányosítása
          OleDbParameter parameter1 = new OleDbParameter();                       
          
          // paraméter értékének megadása
          parameter1.Value = "11223344";                       
          
          // paraméter hozzárendelése az utasításhoz
          cmd.Parameters.Add(parameter1);                                                                                       
          OleDbParameter parameter2 = new OleDbParameter();
          parameter2.Value = "Hugo";
          cmd.Parameters.Add(parameter2);
          
          OleDbParameter parameter3 = new OleDbParameter();
          parameter3.Value = "hugo@hotmail.com";
          cmd.Parameters.Add(parameter3);
          
          OleDbParameter parameter4 = new OleDbParameter();
          parameter4.Value = "670652244";
          cmd.Parameters.Add(parameter4);
          
          OleDbParameter parameter5 = new OleDbParameter();
          parameter5.Value = "3671";
          cmd.Parameters.Add(parameter5);
          
          OleDbParameter parameter6 = new OleDbParameter();
          parameter6.Value = "Varos";
          cmd.Parameters.Add(parameter6);
          
          OleDbParameter parameter7 = new OleDbParameter();
          parameter7.Value = "Ut";
          cmd.Parameters.Add(parameter7);
          
          OleDbParameter parameter8 = new OleDbParameter();
          parameter8.Value = "54";
          cmd.Parameters.Add(parameter8);
          
          // utasítás végrehajtása
          cmd.ExecuteNonQuery();       
          
          // kapcsolat lezárása
          con.Close();                                                                               
          Console.ReadLine();
     }
     // keletkező kivételek elkapása
     catch (Exception ex)                                                                               
     {
          // hibák kiíratása console-ra
          Console.WriteLine("Hiba: " + ex.ToString());                                       
          Console.ReadLine();
     }
Kapcsolódjon az adatbázishoz, mad a 'vevo_csomag'-ban található 'update_vevo' tárolt eljárást használva írja felül az 11223344 ügyfélszámú ügyfél adatait tetszőleges értékekkel. Hiba esetén a program jelezzen.
     try
     {
          // szöveges változók létrehozása a paraméterezett kapcsolathoz
          String user = "username", pwd = "password";                       
          
          // paraméterezett kapcsolat példányosítása
          OleDbConnection con = new OleDbConnection(@"Provider=MSDAORA.1; Password=" + pwd + "; User ID=" + user + "; Data Source=localhost;");       
          
          // kapcsolat megnyitása
          con.Open();               
          
          // utasítás létrehozása
          OleDbCommand cmd = con.CreateCommand();               
          
          // az utasítás egy tárolt eljárás
          cmd.CommandType = System.Data.CommandType.StoredProcedure;       
          
          // utasítás: update_vevo eljárás a vevo_csomag-ból
          cmd.CommandText = "vevo_csomag.update_vevo";                                       
          
          // paraméter példányosítása
          OleDbParameter parameter1 = new OleDbParameter();
          
          // értékadás a paraméternek
          parameter1.Value = "11223344";       
          
          // paraméter hozzárendelése az utasításhoz
          cmd.Parameters.Add(parameter1);                                                                                               
          OleDbParameter parameter2 = new OleDbParameter();
          parameter2.Value = "Kazmer";
          cmd.Parameters.Add(parameter2);
          
          OleDbParameter parameter3 = new OleDbParameter();
          parameter3.Value = "hugo@hotmail.com";
          cmd.Parameters.Add(parameter3);
          
          OleDbParameter parameter4 = new OleDbParameter();
          parameter4.Value = "670652244";
          cmd.Parameters.Add(parameter4);
          
          OleDbParameter parameter5 = new OleDbParameter();
          parameter5.Value = "3671";
          cmd.Parameters.Add(parameter5);
          
          OleDbParameter parameter6 = new OleDbParameter();
          parameter6.Value = "Varos";
          cmd.Parameters.Add(parameter6);
          
          OleDbParameter parameter7 = new OleDbParameter();
          parameter7.Value = "Ut";
          cmd.Parameters.Add(parameter7);
          
          OleDbParameter parameter8 = new OleDbParameter();
          parameter8.Value = "54";
          cmd.Parameters.Add(parameter8);
          
          // utasítás végrehajtása
          cmd.ExecuteNonQuery();       
          
          // kapcsolat lezárása
          con.Close();                                                                               
          Console.ReadLine();
     }
     // keletkező kivételek elkapása
     catch (Exception ex)                                                                               
     {
          // hibák kiíratása console-ra
          Console.WriteLine("Hiba: " + ex.ToString());               
          Console.ReadLine();
     }

XML kezelés

Kapcsolódjon az adatbázishoz, majd egy tetszőleges lekérdezés adatait mentse XML fileba. Ehhez szüksége lesz a példányosított DataSet WriteXml() metódusára. Hiba esetén a program jelezzen.
     try
     {
          // szöveges változók létrehozása a paraméterezett kapcsolathoz
          String user = "username", pwd = "password";                               
          
          // kapcsolat példányosítása                               
          OleDbConnection con = new OleDbConnection(@"Provider=MSDAORA.1; Password=" + pwd + "; User ID=" + user + "; Data Source=localhost;");       
          
          // kapcsolat megnyitása
          con.Open();               
          
          // egy string létrehozása, benne az utasításunkkal
          String utasitas = "SELECT ugyfelszam FROM vevo";       
          
          // egy OleDbCommand objektum példányosítása
          OleDbCommand cmd = con.CreateCommand();               
          
          // a cmd szövege az előb létrehozott string legyen
          cmd.CommandText = utasitas;               
          
          // adapter példányosítása
          OleDbDataAdapter adapter = new OleDbDataAdapter();       
          
          // parancs beállítása az adapterre
          adapter.SelectCommand = cmd;       
          
          // DataSet példányosítás
          DataSet dataSet = new DataSet();       
          
          // eredmények betöltése a dataSet-be
          adapter.Fill(dataSet, "vevo");       
          
          // a dataSet tartalmának kiírása xml file-ba
          dataSet.WriteXml(@"vevo.xml");                       
          
          // kapcsolat lezárása
          con.Close();                                                       
          Console.ReadLine();
     }
     // keletkező kivételek elkapása
     catch (Exception ex)                                                                               
     {
          // hibák kiírása console-ra
          Console.WriteLine("Hiba: " + ex.ToString());                                       
          Console.ReadLine();
     }
Az előző feladathoz hasonlóan szintén XML fileba mentse a lekérdezés eredményét, a mentést követően azonban törölje a DataSet-et, és töltse bele vissza az XML fileból a mentett adatokat, és ezek után írja ki a tartalmát Console-ra. Használja a WriteXml() és ReadXml() metódusokat! Hiba esetén a program jelezzen.
     try
     {       
     // szöveges változók létrehozása a paraméterezett kapcsolathoz
     String user = "username", pwd = "password";                                       
     
     // kapcsolat példányosítása
     OleDbConnection con = new OleDbConnection(@"Provider=MSDAORA.1; Password=" + pwd + "; User ID=" + user + "; Data Source=localhost;");       
     
     // parancs szövege változóban
     String utasitas = "SELECT ugyfelszam FROM vevo";               
     
     // parancs létrehozása
     OleDbCommand cmd = con.CreateCommand();               
     
     // a parancs szövege a szöveges változóban lévő szöveg legyen
     cmd.CommandText = utasitas;                                       
     
     // adapter példányosítás
     OleDbDataAdapter adapter = new OleDbDataAdapter();               
     
     // parancs beállítása az adapterre
     adapter.SelectCommand = cmd;               
     
     // DataSet példányosítás
     DataSet dataSet = new DataSet();
     
     // kapcsolat megnyitása
     con.Open();                       
     
     // az eredmények betöltése a dataSet-be
     adapter.Fill(dataSet, "ugyfelszam");       
     
     // kapcsolat lezárása
     con.Close();       
     
     // adatok írása xml file-ba
     dataSet.WriteXml("ugyfelszam.xml");       
     
     // dataSet kiürítése
     dataSet.Clear();       
     // adatok olvasása xml file-ból vissza a dataSet-be
     dataSet.ReadXml("ugyfelszam.xml");          
     
     // dataTable létrehozása
     DataTable dataTable = dataSet.Tables["ugyfelszam"];       
     
     // ciklus a dataTable minden egyes mezőjére
     foreach (DataRow row in dataTable.Rows)                                               
     {
          // aktuális ügyfélszám kiírása
          Console.WriteLine("Ugyfelszam: " + row["ugyfelszam"]);               
     }
     Console.ReadLine();
     }
     // keletkező hibák elkapása
     catch (Exception ex)                                                                               
     {
          // hibák kiírása console-ra
          Console.WriteLine("Hiba: " + ex.ToString());       
          Console.ReadLine();
     }
Mentse az XML file-t sémával!
     try
     {       
     // szöveges változók létrehozása a paraméterezett kapcsolathoz
     String user = "username", pwd = "password";               
     
     // kapcsolat példányosítása
     OleDbConnection con = new OleDbConnection(@"Provider=MSDAORA.1; Password=" + pwd + "; User ID=" + user + "; Data Source=localhost;");       
     
     // parancs szövege változóban
     String utasitas = "SELECT ugyfelszam FROM vevo";               
     
     // parancs létrehozása
     OleDbCommand cmd = con.CreateCommand();       
     
     // a parancs szövege a szöveges változóban lévő szöveg legyen
     cmd.CommandText = utasitas;                                               
     
     // adapter példányosítás
     OleDbDataAdapter adapter = new OleDbDataAdapter();               
     
     // parancs beállítása az adapterre
     adapter.SelectCommand = cmd;               
     
     // DataSet példányosítás
     DataSet dataSet = new DataSet();
     
     // kapcsolat megnyitása
     con.Open();                                                               
     
     // az eredmények betöltése a dataSet-be
     adapter.Fill(dataSet, "ugyfelszam");
     
     // kapcsolat lezárása
     con.Close();               
     
     // adatok írása xml file-ba
     dataSet.WriteXml("ugyfelszam.xml");                       
     
     // adatok írása xml file-ba sémával
     dataSet.WriteXml("ugyfelszam_2.xml", XmlWriteMode.WriteSchema);       
     
     // séma kiírása
     dataSet.WriteXmlSchema("ugyfelszam_2_schema.xml");               
     
     // dataSet kiürítése
     dataSet.Clear();       
     
     // adatok olvasása xml file-ból vissza a dataSet-be
     dataSet.ReadXml("ugyfelszam.xml");                       
     
     // dataTable létrehozása
     DataTable dataTable = dataSet.Tables["ugyfelszam"];               
     
     // ciklus a dataTable minden egyes mezőjére
     foreach (DataRow row in dataTable.Rows)                                               
     {
          // aktuális ügyfélszám kiírása
          Console.WriteLine("Ugyfelszam: " + row["ugyfelszam"]);               
     }
     Console.ReadLine();
     }
     // keletkező hibák elkapása
     catch (Exception ex)                                                                               
     {
          // hibák kiírása console-ra
          Console.WriteLine("Hiba: " + ex.ToString());                                       
          Console.ReadLine();
     }
Töltse be egy DataSet-be egy korábban lementett lekérdezés (XML file) tartalmát, majd irassa ki a DataSet tartalmát. Ne kapcsolódjon adatbázishoz. Hiba esetén a program jelezzen!
   try
   {
   // dataSet létrehozása
   DataSet dataSet = new DataSet();
   
   // egy xml file beolvasása a dataSet-be
   dataSet.ReadXml("ugyfelszam.xml");                
   
   // dataTable létrehozása                                
   DataTable dataTable = dataSet.Tables["ugyfelszam"];                
   
   // ciklus a dataTable minden mezőjére
   foreach (DataRow row in dataTable.Rows)                                                
   {
   // a dataTable ugyfelszam mezőjének kiírása
   Console.WriteLine("Ugyfelszam: " + row["ugyfelszam"]);                
   }
   Console.ReadLine();
   }
   // keletkező kivételek elkapása
   catch (Exception ex)                                                                                
   {
   // ezek kiírása console-ra
   Console.WriteLine("Hiba: " + ex.ToString());                                        
   Console.ReadLine();
   }

Metaadatok feldolgozása

Írjon programot, amely kapcsolódik az adatbázishoz, és kérdezze le a 'vevo' tábla néhány metainformációját. Ha a program nem tér vissza sorral, az azt jelenti, hogy a tábla nem létezik. Hiba esetén a program jelezzen!
     try
     {
          // szöveges változók létrehozása a paraméterezett kapcsolathoz
          String user = "username", pwd = "password";
          
          // kapcsolat példányosítása, benne a kapcsolati string-gel, ami
          // paraméterezett
          OleDbConnection con = new OleDbConnection(@"Provider=MSDAORA.1; Password=" + pwd + "; User ID=" + user + "; Data Source=localhost;");
          
          // kapcsolat megnyitása       
          con.Open();
          
          // a tables DataTable-be kerülnek a 'vevo' tábla metainformációi
          DataTable tables = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, "vevo", "TABLE" });
          
          foreach (DataRow row in tables.Rows)
          {
               // a tábla neve kiíratása (VEVO)
               Console.WriteLine(row["TABLE_NAME"]);
                      
               // a tábla leírása (ha adtunk meg ilyet)
               Console.WriteLine(row["DESCRIPTION"]);
                      
               // létrehozás dátuma
               Console.WriteLine(row["DATE_CREATED"]);
          }
          // kapcsolat lezárása
          con.Close();
          Console.ReadLine();
     }
     // keletkező kivételek elkapása
     catch (Exception ex)
     {
          // kivételek kiírása Console-ra
          Console.WriteLine("Hiba: " + ex.ToString());
          Console.ReadLine();
     }
Kapcsolódjon az adatbázishoz, majd listázza ki az abban található táblák mezőinek azonosítóit. Hiba esetén a program jelezzen.
     try
     {
          // szöveges változók létrehozása a paraméterezett kapcsolathoz
          String user = "username", pwd = "password";
          
          // kapcsolat példányosítása, benne a kapcsolati string-gel, ami
          // paraméterezett
          OleDbConnection con = new OleDbConnection(@"Provider=MSDAORA.1; Password=" + pwd + "; User ID=" + user + "; Data Source=localhost;");
          
          // kapcsolat megnyitása                       
          con.Open();
          
          // a tables DataTable-be kerülnek az adatbázisban található mezők
          // információi
          DataTable tables = con.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, null);
          
          foreach (DataRow row in tables.Rows)
          {
               // kiírás Console-ra: TÁBLANÉV : MEZŐNÉV formátumban
                       // az összes adatbázisban található mező kiíródik
               Console.WriteLine(row["TABLE_NAME"] + " : " + row["COLUMN_NAME"]);
          }
          // kapcsalat lezárása
          con.Close();
          Console.ReadLine();
     }
     // keletkező kivételek elkapása
     catch (Exception ex)
     {
          // kivételek kiírása Console-ra
          Console.WriteLine("Hiba: " + ex.ToString());
          Console.ReadLine();
     }
Kapcsolódjon az adatbázishoz, majd listázza ki az abban található VEVO tábla CHAR típusú mezőinek azonosítóit, illetve azok hosszát. Hiba esetén a program jelezzen!
      try
     {
          // szöveges változók létrehozása a paraméterezett kapcsolathoz
          String user = "username", pwd = "password";
          
          // kapcsolat példányosítása, benne a kapcsolati string-gel, ami
          // paraméterezett
          OleDbConnection con = new OleDbConnection(@"Provider=MSDAORA.1; Password=" + pwd + "; User ID=" + user + "; Data Source=localhost;");
          
          // a kapcsolat megnyitása
          con.Open();
          
          // a tables-be bekerül az adatbázis összes mezőjének metainformációja
          DataTable tables = con.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, null);
          
          foreach (DataRow row in tables.Rows)
          {
               
               // ha a mező 'DATA_TYPE' tulajdonsága 129 (CHAR), és a tábla neve
               // 'vevo', akkor írja ki a mező metainformációit
               if((Convert.ToInt32(row["DATA_TYPE"]) == 129) &&
               (Convert.ToString(row["TABLE_NAME"])=="VEVO"))
               {
                            Console.WriteLine(row["TABLE_NAME"] + ", " +
                    row["COLUMN_NAME"] + ", " + row["DATA_TYPE"] + ", " +
                    row["CHARACTER_MAXIMUM_LENGTH"]);
               }
          }
          
          //kapcsolat lezárása
          con.Close();
          Console.ReadLine();
     }
     //keletkező kivételek elkapása
     catch (Exception ex)
     {
          // kivétel szövegének kiírása Console-ra
          Console.WriteLine("Hiba: " + ex.ToString());
          Console.ReadLine();
     }

Hibakezelés

Kapcsolódjon az adatbázishoz, majd írja ki a kapcsolat főbb tulajdonságait, valamint ha OleDbException keletkezik, azt kapja el. Használja a finally ágat is, itt zárja le a kapcsolatot.
      // szöveges változók a paraméterezett kapcsolathoz
     String user = "username", pwd = "password";
     
     // kapcsolat példányosítása, itt a paraméterezett kapcsolati String
     OleDbConnection con = new OleDbConnection(@"Provider=MSDAORA.1; Password="+ pwd + "; User ID=" + user + "; Data Source=localhost;");
     
     try
     {
          // kapcsolat megnyitása
          con.Open();
          Console.WriteLine("Kapcsolat megnyitva.");
          Console.WriteLine("\tKapcsolat String: {0}",con.ConnectionString);
          Console.WriteLine("\tAdatbázis: {0}",con.Database);
          Console.WriteLine("\tAdatforrás: {0}",con.DataSource);
          Console.WriteLine("\tSzerver verzió: {0}",con.ServerVersion);
          Console.WriteLine("\tÁllapot: {0}",con.State);
     }
     // keletkező OleDbException elkapása
     catch (OleDbException e)
     {
          // a hiba okának kiírása Console-ra
          Console.WriteLine("Hiba: " + e);
          Console.ReadLine();
     }
     finally
     {
          // végül a kapcsolat lezárása
          con.Close();
          Console.WriteLine("Kapcsolat lezárva.");
          Console.ReadLine();
     }
Kapcsolódjon az adatbázishoz, és kapja el a lehetséges exception-öket. Használja a finally ágat is, itt zárja le a kapcsolatot.
     String user = "username", pwd = "password";
     OleDbConnection con = new OleDbConnection(@"Provider=MSDAORA.1; Password="+ pwd + "; User ID=" + user + "; Data Source=localhost;");
     
     try
     {
          con.Open();
          
          // adapter létrehozása, benne a lekérdezés sql parancsával
          OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT ugyfelszam FROM vevo", con);
          
          // DataSet példányosítása a lekérdezett adatok táblázatban történő
          // tárolásához
          DataSet dataSet = new DataSet();
          
          // az adapterben lévő lekérdezés végrehajtása, annak eredménye betöltve
          // a DataSet-be, a vevo nevű táblába
          adapter.Fill(dataSet, "vevo");
          
          // ez a sor hibás, exceptiont fog okozni
          DataRow row = dataSet.Tables["nincs_ilyen_table"].Rows[0];
          
          // a DataRow ugyfelszam nevű cellájában lévő érték kiíratása console-ra
          Console.WriteLine("Ugyfelszam:" + "\t" + row["ugyfelszam"]);
          
          // a DataSet kiürítése              
          dataSet.Clear();
     }
     // DataException elkapása, majd kiíratása
     catch (DataException e)
     {
          Console.WriteLine("DataException: " + e);
          Console.ReadLine();
     }
     // SystemException elkapása, majd kiíratása
     catch (SystemException e)
     {
          Console.WriteLine("SystemException: " + e);
          Console.ReadLine();
     }
     // minden más Exception kiíratása
     catch (Exception e)
     {
          Console.WriteLine("Other Exception: " + e);
          Console.ReadLine();
     }
     finally
     {
          // végül a kapcsolat lezárása
          con.Close();
          Console.WriteLine("Kapcsolat lezárva.");
          Console.ReadLine();
     }

ORM framework-ök, perzisztencia felületek

Hibernate

Építse fel az igényelt adatbázis kapcsolatot a JDeveloper környezetben.

A JDeveloper View menüpontjában válasszuk ki a Database Navigator pontot.

Ezután hívjuk meg a New Connection funkciót egy új adatbázis kapcsolat létrehozatalára.

Állítsuk be a kapcsolat főbb paramétereit.

  1. Connection name : kl1 (kapcsolat azonosító)

  2. Connection type: Oracle JDBC (kapcsolat típusa)

  3. Username: proba (adatbázis felhasználó neve)

  4. Password: proba (ejlszó)

  5. Driver: Thin (jdbc megható tipusa)

  6. Hostname: localhost (szerver gép)

  7. JDBC port: 1521 (a figyelő portszáma)

  8. SID: XE

Építse fel az adatmodell a JDeveloper környezetben.

Egy új Java osztályt kell létrehozni., mely illeszkedik az EJB körrnyezetre. A generálás lépései:

  1. A New funkció aktivizálás a minta alkalmazáson belül

  2. Az új elem típusa: Business Tier - EJBMode - Entiites from tables. A megjelenő paraméter beállító lapokon az alábbi információkat kell megadni:

  3. Persistence unit: a perzisztens adatkezelő rész azonosítója

  4. Adatkapcsolat típusa (pl. online vagy offline)

  5. adatbázis kapcsolati objektum

  6. adattáblák kijelölése, melyekhez perzisztens osztályok jönnek majd létre

A generálás eredményeként létrejön a perzisztenciát támogató osztályok annotált leírása.

   package jpa_kl;
   import java.io.Serializable;
   import javax.persistence.Column;
   import javax.persistence.Entity;
   import javax.persistence.Id;
   import javax.persistence.NamedQueries;
   import javax.persistence.NamedQuery;
   
   @Entity
   @NamedQueries({
      @NamedQuery(name = "Termek.findAll", query = "select o from Termek o")
   })
   
   public class Termek implements Serializable {
      private String megyseg;
      @Id
      @Column(nullable = false)
      private Long tkod;
      private String tnev;
   
   
      public Termek() {
      }
   
      public Termek(String megyseg, Long tkod, String tnev) {
        this.megyseg = megyseg;
        this.tkod = tkod;
        this.tnev = tnev;
      }
   
      public String getMegyseg() {
        return  megyseg;
      }
   
      public void setMegyseg(String megyseg) {
        this.megyseg = megyseg;
      }
   
      public Long getTkod() {
        return  tkod;
      }
   
      public void setTkod(Long tkod) {
        this.tkod = tkod;
      }
   
      public String getTnev() {
        return  tnev;
      }
   
      public void setTnev(String tnev) {
        this.tnev = tnev;
      }
   }

Ellenőrizze a létrejött persistence.xml konfigurációs állományt.

<?xml version="1.0" encoding="windows-1250" ?>
   
   <persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://version="1.0" xmlns="http://java.sun.com/xml/ns/persistence">
      <persistence-unit name="JPA_KL">
        <provider>
          org.eclipse.persistence.jpa.PersistenceProvider
        </provider>
        <jta-data-source>
          java:/app/jdbc/jdbc/kl1DS
        </jta-data-source>
        <class>
          JPA_KL.Termek
        </class>
        <properties> 
          <property name="eclipselink.target-server" value="WebLogic_10"/>
          <property name="javax.persistence.jtaDataSource"
            value="java:/app/jdbc/jdbc/kl1DS"/>
        </properties>
     </persistence-unit>
   </persistence>

Hozza létre az entitásokat kezelő menedzser osztályt.

A projekt META-INF részében a persistence.xml állományra álljunk rá, s aktivizáljuk a New Java Service Facade funckiót a jobbegérgombon keresztül. A paraméterbeállító ablakokban az alábbi értékekeket jelöljük be:

  1. JPA

  2. generate main()

  3. JDBC connection

  4. Table generation: none

A generált mintapélda példányosítja az entitás kezelő osztályt is. A kapcsolódó kódlista:

   package jpa_kl;
   import java.util.List;
   import javax.persistence.EntityManager;
   import javax.persistence.EntityManagerFactory;
   import javax.persistence.EntityTransaction;
   import javax.persistence.Persistence;
   import javax.persistence.Query;
   
   public class JavaServiceFacade {
      private EntityManagerFactory emf = 
      Persistence.createEntityManagerFactory("public JavaServiceFacade() {
   }
   
   public static void main(String [] args) {
      final JavaServiceFacade javaServiceFacade = new JavaServiceFacade();
      // TODO: Call methods on javaServiceFacade here...
   }
   
   private EntityManager getEntityManager() {
      return  emf.createEntityManager();
   }
   
   public Object mergeEntity(Object entity) {
      final EntityManager em = getEntityManager();
      try {
         final EntityTransaction et = em.getTransaction();
         try {
            et.begin();
            em.merge(entity);
            et.commit();
         } finally {
            if (et != null && et.isActive()) {
               entity = null;
               et.rollback();
            }
        }
      } finally {
        if (em != null && em.isOpen()) {
          em.close();
        }
      }
      return  entity;
   }
   
   public Object persistEntity(Object entity) {
      final EntityManager em = getEntityManager();
      try {
         final EntityTransaction et = em.getTransaction();
         try {
            et.begin();
            em.persist(entity);
            et.commit();
         } finally {
            if (et != null && et.isActive()) {
               entity = null;
               et.rollback();
            }
        }
      } finally {
        if (em != null && em.isOpen()) {
           em.close();
        }
      }
      return  entity;
   }
   
   
   /** <code>select o from Termek o</code> */
   public List<Termek> queryTermekFindAll() {
      return  
      getEntityManager().createNamedQuery("Termek.findAll").getResultList();
   }
   
   
   /** <code>select o from Termek o</code> */
   public List<Termek> queryTermekFindAllByRange(int firstResult,
   int maxResults) {
       Query query = getEntityManager().createNamedQuery("Termek.findAll");
       if (firstResult > 0) {
          query = query.setFirstResult(firstResult);
       }
       if (maxResults > 0) {
          query = query.setMaxResults(maxResults);
       }
       return  query.getResultList();
   }
   
   
   public void removeTermek(Termek termek) {
       final EntityManager em = getEntityManager();
       try {
          final EntityTransaction et = em.getTransaction();
          try {
            et.begin();
            termek = em.find(Termek.class, termek.getTkod());
            em.remove(termek);
            et.commit();
          } finally {
             if (et != null && et.isActive()) {
                et.rollback();
             }
          }
        } finally {
           if (em != null && em.isOpen()) {
              em.close();
           }
        }
      }
   }
      

A persistence.xml konfigurációs állomány tartalma is megváltozott. Az új leírás:

   <?xml version="1.0" encoding="windows-1250" ?>
   <persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://version="1.0" xmlns="http://java.sun.com/xml/ns/persistence">
     <persistence-unit name="JPA_KL">
       <provider>
         org.eclipse.persistence.jpa.PersistenceProvider
       </provider>
       <jta-data-source>
         java:/app/jdbc/jdbc/kl1DS
       </jta-data-source>
       <class>
         jpa_kl.Termek
       </class>
       <properties>
         <property name="eclipselink.target-server" value="WebLogic_10"/>
         <property name="javax.persistence.jtaDataSource"
   value="java:/app/jdbc/jdbc/kl1DS"/>
       </properties>
     </persistence-unit>
     <persistence-unit name="JPA_KL-1" transaction-type="RESOURCE_LOCAL">
       <provider>
        org.eclipse.persistence.jpa.PersistenceProvider
       </provider>
       <class>
         jpa_kl.Termek
       </class>
       <properties>
         <property name="eclipselink.jdbc.driver"
          value="oracle.jdbc.OracleDriver"/>
         <property name="eclipselink.jdbc.url"
          value="jdbc:oracle:thin:@localhost:1521:XE"/>
         <property name="eclipselink.jdbc.user" value="proba"/>
         <property name="eclipselink.jdbc.password"
          value="6811C4C05D5E63CC5650D51F031506B0"/>
         <property name="eclipselink.logging.level" value="FINER"/>
         <property name="eclipselink.target-server" value="WebLogic_10"/>
       </properties>
     </persistence-unit>
   </persistence>
   

Módosítsa úgy a kliens osztályt, hogy az listázza ki az adatbázsiban tárolt termékek neveit.

Ehhez a main() metódust módosítjuk, melynek új alakja:

   public static void main(String [] args) {
      final JavaServiceFacade javaServiceFacade = new JavaServiceFacade();
      List <Termek> ll;
      
      ll = javaServiceFacade.queryTermekFindAll();
      for (int i=0; i<ll.size(); i++) {
        Termek tt = ll.get(i);
        System.out.println(tt.getTnev());
      }
   }

Vigyen fele egy új terméket az adatbázisba perziszetens objektumon keresztül.

public static void main(String [] args) {
      final JavaServiceFacade javaServiceFacade = new JavaServiceFacade();
      Termek tt = new Termek("db",45l,"babszem");
      javaServiceFacade.persistEntity(tt);
   }

Kérdezze le a termékek darabszámát egy native SQL lekérdezésen keresztül.

public void lekerdo (String betu){
      final EntityManager em = getEntityManager();
      String parancs = "SELECT to_char(count(*)) FROM termek ";
      List ll = (List) em.createNativeQuery(parancs).getSingleResult();
      System.out.println("db="+ ll.get(0));
   }

Kérdezze le a egy adott mennyiségi egységhez tartozó termékek neveit egy paraméteres native SQL lekérdezésen keresztül.

public void lekerdo (String me){
      final EntityManager em = getEntityManager();
      String parancs = 
        "SELECT tnev FROM termek WHERE ltrim(rtrim(megyseg)) = ?”
      List ll = 
       (List) em.createNativeQuery(parancs).
         setParameter(1,me.trim());
      for (int i=0; i<ll.size(); i++) {
         System.out.println(ll.get(i));
      }
   }

JPA

Entity létrehozás

Hozzon létre „Entity” osztályt a „vevő” táblára!
   @Entity
   @Table(name="vevo")
   public class Vevo implements Serializable {        
   
           private static final long serialVersionUID = 1L;
           
           @Id
           @Column(name="ugyfelszam")
           private int ugyfelszam;
           private String nev;
           private String e_mail;
           private int tel;
           
           @Column(name="i")
           private int irsz;
           
           @Column(name="v")
           private String varos;
           
           @Column(name="u")
           private String utca;
           private int hsz;
                   
           public Vevo() {
                   super();
           }
   
           public int getUgyfelszam() {
                   return  ugyfelszam;
           }
   
           public void setUgyfelszam(int ugyfelszam) {
                   this.ugyfelszam = ugyfelszam;
           }
   
           public String getNev() {
                   return  nev;
           }
   
           public void setNev(String nev) {
                   this.nev = nev;
           }
   
           public String getE_mail() {
                   return  e_mail;
           }
   
           public void setE_mail(String e_mail) {
                   this.e_mail = e_mail;
           }
   
           public int getTel() {
                   return  tel;
           }
   
           public void setTel(int tel) {
                   this.tel = tel;
           }
   
           public int getIrsz() {
                   return  irsz;
           }
   
           public void setIrsz(int irsz) {
                   this.irsz = irsz;
           }
   
           public String getVaros() {
                   return  varos;
           }
   
           public void setVaros(String varos) {
                   this.varos = varos;
           }
   
           public String getUtca() {
                   return  utca;
           }
   
           public void setUtca(String utca) {
                   this.utca = utca;
           }
   
           public int getHsz() {
                   return  hsz;
           }
   
           public void setHsz(int hsz) {
                   this.hsz = hsz;
           }
   
           @Override
           public String toString() {
   return  "Vevo [ugyfelszam=" + ugyfelszam + ", nev=" + nev + ", 
   e_mail="+ e_mail + ", tel=" + tel + ", irsz=" + irsz + 
   ", varos="+ varos + ", utca=" + utca + ", hsz=" + hsz
   + "]";
           }
   }
Hozzon létre „Entity” osztályt a „szolgáltató” táblára!
@Entity
   @Table(name="szolgaltato")
   public class Szolgaltato implements Serializable {
           
           private static final long serialVersionUID = 1L;
           
           @Id
           @Column(name="cegazonosito")
           private String cegazonosito;
           private String nev;
           @Column(name="i")
           private int irsz;
           @Column(name="v")
           private String varos;
           @Column(name="u")
           private String utca;
           private int hsz;
           
           public Szolgaltato() {
                   super();
           }
   
           public String getCegazonosito() {
                   return  cegazonosito;
           }
   
           public void setCegazonosito(String cegazonosito) {
                   this.cegazonosito = cegazonosito;
           }
   
           public String getNev() {
                   return  nev;
           }
   
           public void setNev(String nev) {
                   this.nev = nev;
           }
   
           public int getIrsz() {
                   return  irsz;
           }
   
           public void setIrsz(int irsz) {
                   this.irsz = irsz;
           }
   
           public String getVaros() {
                   return  varos;
           }
   
           public void setVaros(String varos) {
                   this.varos = varos;
           }
   
           public String getUtca() {
                   return  utca;
           }
   
           public void setUtca(String utca) {
                   this.utca = utca;
           }
   
           public int getHsz() {
                   return  hsz;
           }
   
           public void setHsz(int hsz) {
                   this.hsz = hsz;
           }
   
           public Collection<Tel> getTels() {
                   return  tels;
           }
   
           public void setTels(List<Tel> tels) {
                   this.tels = tels;
           }
           
           @Override
           public String toString() {
                   return  "Szolgaltato [cegazonosito=" + cegazonosito + ", nev=" + 
   nev+ ", irsz=" + irsz + ", varos=" + varos + ", 
   utca=" + utca+ ", hsz=" + hsz + "]";
           }
   }
Hozzon létre „Entity” osztályt a „mobiltelefon” táblára!
@Entity
   @Table(name="mobiltelefon")
   public class Mobiltelefon implements Serializable {
           private static final long serialVersionUID = 1L;
   
           @Id
           @Column(name="cikkszam")
           private String cikkszam;
   
           private int ar;
   
           private String leiras;
   
           private String tipusa;
           
   public Mobiltelefon() {
                   super();
               }
   
           public String getCikkszam() {
                   return  this.cikkszam;
           }
   
           public void setCikkszam(String cikkszam) {
                   this.cikkszam = cikkszam;
           }
   
           public int getAr() {
                   return  this.ar;
           }
   
           public void setAr(int ar) {
                   this.ar = ar;
           }
   
           public String getLeiras() {
                   return  this.leiras;
           }
   
           public void setLeiras(String leiras) {
                   this.leiras = leiras;
           }
   
           public String getTipusa() {
                   return  this.tipusa;
           }
   
           public void setTipusa(String tipusa) {
                   this.tipusa = tipusa;
           }
   
   @Override
           public String toString() {
                   return  "Mobiltelefon [cikkszam=" + cikkszam + ", ar=" + ar
                                   + ", leiras=" + leiras + ", tipusa=" + tipusa
                                   + ", szolgaltatok=" + szolgaltatok + "]";
           }
   
   }

Kapcsolatok kezelése

Hozzon létre „Entity” osztályt a „tel” táblára, figyeljen az 1:N kapcsolat annotálására, legyen kétirányú a kapcsolat!
@Entity
   @Table(name="tel")
   public class Tel implements Serializable {
   
           private static final long serialVersionUID = 1L;
   
           @Id
           @GeneratedValue(strategy=GenerationType.SEQUENCE)
           @Column(name="id")
           private int id;
           
           private int telszam;
   
           @ManyToOne
           @JoinColumn(name="szolgaltato",
                               referencedColumnName="cegazonosito")
           private Szolgaltato szolgaltato;
           
           public Tel() {
                   super();
           }
   
           public int getId() {
                   return  id;
           }
   
           public void setId(int id) {
                   this.id = id;
           }
   
           public int getTelszam() {
                   return  telszam;
           }
   
           public void setTelszam(int telszam) {
                   this.telszam = telszam;
           }
   
           public Szolgaltato getSzolgaltato() {
                   return  szolgaltato;
           }
           
           public void setSzolgaltato(Szolgaltato szolgaltato) {
                   this.szolgaltato = szolgaltato;
           }
           
           @Override
           public String toString() {
                   return  "Tel [id=" + id + ", telszam=" + telszam + ", szolgaltato="
                                   + szolgaltato + "]";
           }
   
   “Szolgaltato osztály” osztály módosítása a kétirányú kapcsolat miatt:
   
   @OneToMany(mappedBy="szolgaltato", fetch=FetchType.EAGER)
           private Collection<Tel>tels;
           …
   public Szolgaltato() {
                   super();
                   tels = new ArrayList<Tel>();
           }
   …
           public Collection<Tel> getTels() {
                   return  tels;
           }
   
           public void setTels(List<Tel> tels) {
                   this.tels = tels;
           }
           public void addTel(Tel t) {
                   if (!this.tels.contains(t)) {
                           this.tels.add(t);
                           if (t.getSzolgaltato() != null) {
                                   t.getSzolgaltato().getTels().remove(t);
                           }
                           t.setSzolgaltato(this);
                   }
           }
Egészítse ki a megfelelő osztályokat, hogy kezeljék az „árusít” kapcsolatot! Figyeljen az N:M kapcsolat annotálására!
Szolgáltató osztály:
   @Entity
   @Table(name="szolgaltato")
   public class Szolgaltato implements Serializable {
           
           private static final long serialVersionUID = 1L;
           
           @Id
           @Column(name="cegazonosito")
           private String cegazonosito;
           private String nev;
           @Column(name="i")
           private int irsz;
           @Column(name="v")
           private String varos;
           @Column(name="u")
           private String utca;
           private int hsz;
   
           @OneToMany(mappedBy="szolgaltato", fetch=FetchType.EAGER)
           private Collection<Tel>tels; 
           
           @ManyToMany
           @JoinTable(
                           name="arusit",
                           joinColumns=@JoinColumn(
                                                   name="szolgaltato",
                                                   referencedColumnName="cegazonosito"),
                           inverseJoinColumns=@JoinColumn(
                                                   name="mobiltelefon",
                                                   referencedColumnName="cikkszam")
                           )
           private Collection<Mobiltelefon> mobiltelefonok;
           
           
           public Szolgaltato() {
                   super();
                   tels = new ArrayList<Tel>();
                   mobiltelefonok = new ArrayList<Mobiltelefon>();
           }
   
           public String getCegazonosito() {
                   return  cegazonosito;
           }
   
           public void setCegazonosito(String cegazonosito) {
                   this.cegazonosito = cegazonosito;
           }
   
           public String getNev() {
                   return  nev;
           }
   
           public void setNev(String nev) {
                   this.nev = nev;
           }
   
           public int getIrsz() {
                   return  irsz;
           }
   
           public void setIrsz(int irsz) {
                   this.irsz = irsz;
           }
   
           public String getVaros() {
                   return  varos;
           }
   
           public void setVaros(String varos) {
                   this.varos = varos;
           }
   
           public String getUtca() {
                   return  utca;
           }
   
           public void setUtca(String utca) {
                   this.utca = utca;
           }
   
           public int getHsz() {
                   return  hsz;
           }
   
           public void setHsz(int hsz) {
                   this.hsz = hsz;
           }
   
           public Collection<Tel> getTels() {
                   return  tels;
           }
   
           public void setTels(List<Tel> tels) {
                   this.tels = tels;
           }
   
           public Collection<Mobiltelefon> getMobiltelefonok() {
                   return  mobiltelefonok;
           }
   
           public void setMobiltelefonok(Collection<Mobiltelefon> mobiltelefonok) {
                   this.mobiltelefonok = mobiltelefonok;
           }
   
           
           public void addTel(Tel t) {
                   if (!this.tels.contains(t)) {
                           this.tels.add(t);
                           if (t.getSzolgaltato() != null) {
                                   t.getSzolgaltato().getTels().remove(t);
                           }
                           t.setSzolgaltato(this);
                   }
           }
           
           public void addMobiltelefon(Mobiltelefon m) {
                   if (!this.mobiltelefonok.contains(m)) {
                           this.mobiltelefonok.add(m);
                   }
                   if (!m.getSzolgaltatok().contains(this)) {
                           m.addSzolgaltato(this);
                   }
           }
           
           
           @Override
           public String toString() {
           +        return  "Szolgaltato [cegazonosito=" + cegazonosito + ", nev=" + 
   nev+ ", irsz=" + irsz + ", varos=" + varos + ", 
   utca=" + utca+ ", hsz=" + hsz + "]";
           }
   }
   Mobiltelefon osztály:
   @Entity
   @Table(name="mobiltelefon")
   public class Mobiltelefon implements Serializable {
           private static final long serialVersionUID = 1L;
   
           @Id
           @Column(name="cikkszam")
           private String cikkszam;
   
           private int ar;
   
           private String leiras;
   
           private String tipusa;
   
           @ManyToMany(mappedBy="mobiltelefonok", fetch=FetchType.EAGER)
           private Collection<Szolgaltato> szolgaltatok;
                   
   public Mobiltelefon() {
                   super();
                   szolgaltatok = new ArrayList<Szolgaltato>();
   }
   
           public String getCikkszam() {
                   return  this.cikkszam;
           }
   
           public void setCikkszam(String cikkszam) {
                   this.cikkszam = cikkszam;
           }
   
           public int getAr() {
                   return  this.ar;
           }
   
           public void setAr(int ar) {
                   this.ar = ar;
           }
   
           public String getLeiras() {
                   return  this.leiras;
           }
   
           public void setLeiras(String leiras) {
                   this.leiras = leiras;
           }
   
           public String getTipusa() {
                   return  this.tipusa;
           }
   
           public void setTipusa(String tipusa) {
                   this.tipusa = tipusa;
           }
   
           public Collection<Szolgaltato> getSzolgaltatok() {
                   return  szolgaltatok;
           }
   
           public void setSzolgaltatok(Collection<Szolgaltato> szolgaltatok) {
                   this.szolgaltatok = szolgaltatok;
           }
           
           public void addSzolgaltato(Szolgaltato sz) {
                   if (!this.szolgaltatok.contains(sz)) {
                           this.szolgaltatok.add(sz);
                   }
                   if (!sz.getMobiltelefonok().contains(this)) {
                           sz.getMobiltelefonok().add(this);
                   }
           }
   
           @Override
           public String toString() {
                   return  "Mobiltelefon [cikkszam=" + cikkszam + ", ar=" + ar
                                   + ", leiras=" + leiras + ", tipusa=" + tipusa
                                   + ", szolgaltatok=" + szolgaltatok + "]";
           }
   }
Egészítse ki a megfelelő osztályokat, hogy kezeljék az „elégedettség” kapcsolatot! Figyeljen az N:M kapcsolat annotálására!
Vevő osztály:
   @Entity
   @Table(name="vevo")
   public class Vevo implements Serializable {
   
           
           private static final long serialVersionUID = 1L;
           
           @Id
           @Column(name="ugyfelszam")
           private int ugyfelszam;
           private String nev;
           private String e_mail;
           private int tel;
           
           @Column(name="i")
           private int irsz;
           
           @Column(name="v")
           private String varos;
           
           @Column(name="u")
           private String utca;
           private int hsz;
           
           @ManyToMany(fetch=FetchType.EAGER)
           @JoinTable(
                           name="elegedettseg",
                           joinColumns=@JoinColumn(
                                           name="vevo",
                                           referencedColumnName="ugyfelszam"),
                           inverseJoinColumns=@JoinColumn(
                                           name="szolgaltato",
                                           referencedColumnName="cegazonosito")
           )
           private Collection<Szolgaltato>szolgaltatok;
           
           public Vevo() {
                   super();
                   this.szolgaltatok = new ArrayList<Szolgaltato>();
           }
   
           public int getUgyfelszam() {
                   return  ugyfelszam;
           }
   
           public void setUgyfelszam(int ugyfelszam) {
                   this.ugyfelszam = ugyfelszam;
           }
   
           public String getNev() {
                   return  nev;
           }
   
           public void setNev(String nev) {
                   this.nev = nev;
           }
   
           public String getE_mail() {
                   return  e_mail;
           }
   
           public void setE_mail(String e_mail) {
                   this.e_mail = e_mail;
           }
   
           public int getTel() {
                   return  tel;
           }
   
           public void setTel(int tel) {
                   this.tel = tel;
           }
   
           public int getIrsz() {
                   return  irsz;
           }
   
           public void setIrsz(int irsz) {
                   this.irsz = irsz;
           }
   
           public String getVaros() {
                   return  varos;
           }
   
           public void setVaros(String varos) {
                   this.varos = varos;
           }
   
           public String getUtca() {
                   return  utca;
           }
   
           public void setUtca(String utca) {
                   this.utca = utca;
           }
   
           public int getHsz() {
                   return  hsz;
           }
   
           public void setHsz(int hsz) {
                   this.hsz = hsz;
           }
           
           public Collection<Szolgaltato> getSzolgaltatok() {
                   return  szolgaltatok;
           }
   
           public void setSzolgaltatok(Collection<Szolgaltato> szolgaltatok) {
                   this.szolgaltatok = szolgaltatok;
           }
   
           public void addSzolgaltato(Szolgaltato sz) {
                   if (!this.szolgaltatok.contains(sz)) {
                           this.szolgaltatok.add(sz);
                   }
                   if (!sz.getVevok().contains(this)) {
                           sz.getVevok().add(this);
                   }
           }
           
           @Override
           public String toString() {
                   return  "Vevo [ugyfelszam=" + ugyfelszam + ", nev=" + nev + ", 
   e_mail="+ e_mail + ", tel=" + tel + ", irsz=" + irsz
   + ", varos="+ varos + ", utca=" + utca + ", hsz=" + 
   hsz + "]";
           }
   }
   Szolgáltató osztály:
   @Entity
   @Table(name="szolgaltato")
   public class Szolgaltato implements Serializable {
           
           private static final long serialVersionUID = 1L;
           
           @Id
           @Column(name="cegazonosito")
           private String cegazonosito;
           private String nev;
           @Column(name="i")
           private int irsz;
           @Column(name="v")
           private String varos;
           @Column(name="u")
           private String utca;
           private int hsz;
   
           @OneToMany(mappedBy="szolgaltato", fetch=FetchType.EAGER)
           private Collection<Tel> tels; 
           
           @ManyToMany
           @JoinTable(
                           name="arusit",
                           joinColumns=@JoinColumn(
                                                   name="szolgaltato",
                                                   referencedColumnName="cegazonosito"),
                           inverseJoinColumns=@JoinColumn(
                                                   name="mobiltelefon",
                                                   referencedColumnName="cikkszam")
                           )
           private Collection<Mobiltelefon>mobiltelefonok;
           
           
           @ManyToMany(mappedBy="szolgaltatok")
           private Collection<Vevo> vevok;
           
           public Szolgaltato() {
                   super();
                   tels = new ArrayList<Tel>();
                   mobiltelefonok = new ArrayList<Mobiltelefon>();
                   vevok = new ArrayList<Vevo>();
           }
   
           public String getCegazonosito() {
                   return  cegazonosito;
           }
   
           public void setCegazonosito(String cegazonosito) {
                   this.cegazonosito = cegazonosito;
           }
   
           public String getNev() {
                   return nev;
           }
   
           public void setNev(String nev) {
                   this.nev = nev;
           }
   
           public int getIrsz() {
                   return irsz;
           }
   
           public void setIrsz(int irsz) {
                   this.irsz = irsz;
           }
   
           public String getVaros() {
                   return varos;
           }
   
           public void setVaros(String varos) {
                   this.varos = varos;
           }
   
           public String getUtca() {
                   return utca;
           }
   
           public void setUtca(String utca) {
                   this.utca = utca;
           }
   
           public int getHsz() {
                   return hsz;
           }
   
           public void setHsz(int hsz) {
                   this.hsz = hsz;
           }
   
           public Collection<Tel> getTels() {
                   return tels;
           }
   
           public void setTels(List<Tel> tels) {
                   this.tels = tels;
           }
   
           public Collection<Mobiltelefon> getMobiltelefonok() {
                   return mobiltelefonok;
           }
   
           public void setMobiltelefonok(Collection<Mobiltelefon> mobiltelefonok) {
                   this.mobiltelefonok = mobiltelefonok;
           }
   
           public Collection<Vevo> getVevok() {
                   return vevok;
           }
   
           public void setVevok(Collection<Vevo> vevok) {
                   this.vevok = vevok;
           }
           
           public void addTel(Tel t) {
                   if (!this.tels.contains(t)) {
                           this.tels.add(t);
                           if (t.getSzolgaltato() != null) {
                                   t.getSzolgaltato().getTels().remove(t);
                           }
                           t.setSzolgaltato(this);
                   }
           }
           
           public void addMobiltelefon(Mobiltelefon m) {
                   if (!this.mobiltelefonok.contains(m)) {
                           this.mobiltelefonok.add(m);
                   }
                   if (!m.getSzolgaltatok().contains(this)) {
                           m.addSzolgaltato(this);
                   }
           }
           
           public void addVevo(Vevo v) {
                   if (!this.vevok.contains(v)) {
                           this.vevok.add(v);
                   }
                   if (!v.getSzolgaltatok().contains(this)) {
                           v.getSzolgaltatok().add(this);
                   }
           }
           
           @Override
           public String toString() {
                   return "Szolgaltato [cegazonosito=" + cegazonosito + ", nev=" + 
   nev+ ", irsz=" + irsz + ", varos=" + varos + ", 
   utca=" + utca+ ", hsz=" + hsz + "]";
           }
   }

Persistence XML

Írja meg a „persistence.xml” fájlt a JPA használatához!
<?xml version="1.0" encoding="UTF-8"?>
   <persistence version="2.0" xmlns= xmlns:xsi= xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
           <persistence-unitname="Feladatok"transaction-type="RESOURCE_LOCAL">
                   <class>feladatok.jpa.model.Mobiltelefon</class>
                   <class>feladatok.jpa.model.Vevo</class>
                   <class>feladatok.jpa.model.Szolgaltato</class>
                   <class>feladatok.jpa.model.Tel</class>
                   <properties>
   <propertyname="javax.persistence.jdbc.url"
   value="jdbc:mysql://localhost:3306/feladatok"/>
                           <propertyname="javax.persistence.jdbc.user"value="proba"/>
                           <propertyname="javax.persistence.jdbc.password"
   value="feladatok"/>
                           <propertyname="javax.persistence.jdbc.driver"
   value="com.mysql.jdbc.Driver"/>
                           <propertyname="eclipselink.ddl-generation"value="create-
   tables"/>
                           <propertyname="eclipselink.ddl-generation.output-mode"
   value="database"/>
                   </properties>
           </persistence-unit>
   </persistence>

Kezelő osztályok léterhozása

Hozzon létre egy „VevoKezelo” osztályt, amely a vevo táblát kezeli: felvitel, módosítás, törlés, összes adat lekérdezés!
public class VevoKezelo {
           private EntityManager em;
           
           public VevoKezelo(EntityManager em) {
                   this.em = em;
           }
           
           public void insert(Vevo v) {
                   if (v != null) {
                           em.persist(v);
                   }
           }
           public void insert(int ugyfelszam, String nev, String email, int tel, 
                                   int irsz, String varos, String utca, int hsz) {
                   Vevo v = new Vevo();
                   v.setUgyfelszam(ugyfelszam);
                   v.setNev(nev);
                   v.setE_mail(email);
                   v.setTel(tel);
                   v.setIrsz(irsz);
           +        v.setVaros(varos);
                   v.setUtca(utca);
                   v.setHsz(hsz);
                   this.insert(v);
           }
           
           public Vevo update(Vevo v) {
                   if (v != null) {
                           return em.merge(v);
                   }
                   return null;
           }
           
           public void remove(Vevo v) {
                   if (v != null)
                           em.remove(v);
           }
           
           public void remove(int ugyfelszam) {
                   this.remove(find(ugyfelszam));
           }
           
           public Vevo find(int ugyfelszam) {
                   return em.find(Vevo.class, ugyfelszam);
           }
           
           @SuppressWarnings("unchecked")
           public Collection<Vevo> findAll() {
                   return (Collection<Vevo>)em.createQuery("select v from Vevo 
   v").getResultList();
           }
   }
Hozzon létre egy „SzolgaltatoKezelo” osztályt, amely a szolgáltató táblát kezeli: felvitel, módosítás, törlés, összes adat lekérdezés!
   public class SzolgaltatoKezelo {
           private EntityManager em;
           
           public SzolgaltatoKezelo(EntityManager em) {
                   this.em = em;
           }
           
           public void insert(Szolgaltato sz) {
                   if (sz != null) {
                           em.persist(sz);
                   }
           }
   
   public void insert(String cegazonosito, String nev, int irsz, 
    Stringvaros, String utca, int hsz) {
                   Szolgaltato sz = new Szolgaltato();
                   sz.setCegazonosito(cegazonosito);
                   sz.setNev(nev);
                   sz.setVaros(varos);
                   sz.setUtca(utca);
                   sz.setHsz(hsz);
                   this.insert(sz);
           }
           
           public void remove(Szolgaltato sz) {
                   if (sz != null) {
                           em.remove(sz);
                   }
           }
           
           public void remove(String cegazonosito) {
                   this.remove(find(cegazonosito));
           }
           
           public Szolgaltato find(String cegazonosito) {
                   return em.find(Szolgaltato.class, cegazonosito);
           }
           
           @SuppressWarnings("unchecked")
           public Collection<Szolgaltato> findAll() {
                   return  (Collection<Szolgaltato>)em.createQuery("select sz from 
   Szolgaltato sz").getResultList();
           }
   }
Egészítse ki a „SzolgaltatoKezelo” osztályt, hogy kezelje az árusításokat!
public class SzolgaltatoKezelo {
           private EntityManager em;
           
           public SzolgaltatoKezelo(EntityManager em) {
                   this.em = em;
           }
           
           public void insert(Szolgaltato sz) {
                   if (sz != null) {
                           em.persist(sz);
                   }
           }
   
           public void insert(String cegazonosito, String nev, int irsz, 
    String varos, String utca, int hsz) {
                   Szolgaltato sz = new Szolgaltato();
                   sz.setCegazonosito(cegazonosito);
                   sz.setNev(nev);
                   sz.setVaros(varos);
                   sz.setUtca(utca);
                   sz.setHsz(hsz);
                   this.insert(sz);
           }
           
           public void remove(Szolgaltato sz) {
                   if (sz != null) {
                           em.remove(sz);
                   }
           }
           
           public void remove(String cegazonosito) {
                   this.remove(find(cegazonosito));
           }
           
           public Szolgaltato find(String cegazonosito) {
                   return em.find(Szolgaltato.class, cegazonosito);
           }
           
           @SuppressWarnings("unchecked")
           public Collection<Szolgaltato> findAll() {
                   return  (Collection<Szolgaltato>)em.createQuery("select sz from 
   Szolgaltato sz").getResultList();
           }
           
           // Kiegészítés, hogy az árusításokat is kezelje
           
           public void elad(Szolgaltato sz, Mobiltelefon m) {
                   sz.addMobiltelefon(m);
           }
           
           public Collection<Mobiltelefon> eladottTelefonok(Szolgaltato sz) {
                   return  sz.getMobiltelefonok();
           }
           
           publicboolean isTelefonEladott(Mobiltelefon m) {
                   for (Szolgaltato sz : findAll() ) {
                           if (sz.getMobiltelefonok().contains(m))
                                   return true;
                   }
                   return false;
           }
   }
   
Készítsen egy „Kezelo” generikus absztrakt osztályt és származtassa le a „VevoKezelo” és a „SzolgaltatoKezelo” osztályokat belőle! Módosítsa a megoldáshoz a már elkészült leszármazott osztályokat!
Kezelő osztály:
   public abstract class Kezelo<T> {
           private Class<T> type;
           protected EntityManager em;
           
           protected Kezelo(EntityManager em, Class<T> type) {
                   this.em=em;
                   this.type = type;
           }
           
           public void insert(T item) {
                   if (item != null)
                           em.persist(item);
           }
           
           public T update(T item) {
                   if (item != null)
                           return em.merge(item);
                   else
                           return null;
           }
           
           public void remove(T item) {
                   if (item!=null)
                           em.remove(em.merge(item));
           }
           
           public T find(Object key) {
                   return em.find(type, key);
           }
           
           public abstract Collection<T> findAll();  
   }
   
   Módosított VevőKezelő osztály:
   public class VevoKezelo extends Kezelo<Vevo> {
           
           public VevoKezelo(EntityManager em) {
                   super(em,Vevo.class);
           }
           
           public void insert(int ugyfelszam, String nev, String email, int tel, 
                           int irsz, String varos, String utca, int hsz) {
                   Vevo v = new Vevo();
                   v.setUgyfelszam(ugyfelszam);
                   v.setNev(nev);
                   v.setE_mail(email);
                   v.setTel(tel);
                   v.setIrsz(irsz);
                   v.setVaros(varos);
                   v.setUtca(utca);
                   v.setHsz(hsz);
                   super.insert(v);
           }
           
           public void remove(int ugyfelszam) {
                   super.remove(find(ugyfelszam));
           }
           
           @Override
           @SuppressWarnings("unchecked")
           public Collection<Vevo> findAll() {
                   return  (Collection<Vevo>)em.createQuery("select v from Vevo 
   v").getResultList();
           }
   }
   
   Módosított SzolgáltatóKezelő osztály:
   public class SzolgaltatoKezelo extends Kezelo<Szolgaltato> {
   
           public SzolgaltatoKezelo(EntityManager em) {
                   super(em,Szolgaltato.class);
           }
   
           public void insert(String cegazonosito, String nev, int irsz, 
          String varos, String utca, int hsz) {
                   Szolgaltato sz = new Szolgaltato();
                   sz.setCegazonosito(cegazonosito);
                   sz.setNev(nev);
                   sz.setVaros(varos);
                   sz.setUtca(utca);
                   sz.setHsz(hsz);
                   super.insert(sz);
           }
           
           public void remove(String cegazonosito) {
                   super.remove(find(cegazonosito));
           }
           
           @SuppressWarnings("unchecked")
           @Override
           public Collection<Szolgaltato> findAll() {
                   return  (Collection<Szolgaltato>)em.createQuery("select sz from 
   Szolgaltato sz").getResultList();
           }
           
           // Kiegészítés, hogy az árusításokat is kezelje
           
           public void elad(Szolgaltato sz, Mobiltelefon m) {
                   sz.addMobiltelefon(m);
           }
           
           public Collection<Mobiltelefon> eladottTelefonok(Szolgaltato sz) {
                   return  sz.getMobiltelefonok();
           }
           
           publicboolean isTelefonEladott(Mobiltelefon m) {
                   for (Szolgaltato sz : findAll() ) {
                           if (sz.getMobiltelefonok().contains(m))
                                   return true;
                   }
                   return false;
           }
   }

Műveletek végrehajtása, entity-k, kezelők akalmazása

Vigyen fel egy új vevőt!
public class Main {
           
           private static final String PERSISTENCE_UNIT_NAME = "Feladatok";
           private static EntityManagerFactory factory;
           
           public static void main(String[] args) {
                   factory = Persistence.createEntityManagerFactory(
   PERSISTENCE_UNIT_NAME);
                   EntityManager em = factory.createEntityManager();
                   VevoKezelo vk = new VevoKezelo(em);
                   
                   Vevo v = new Vevo();
                   v.setUgyfelszam(987654322);
                   v.setNev("JPA_XYZ");
                   v.setE_mail("JPAvevo@jpa.hu");
                   v.setIrsz(9999);
                   v.setVaros("Város1");
                   v.setUtca("Utca1");
                   v.setHsz(99);
                   
                   em.getTransaction().begin();
                   vk.insert(v);
                   em.getTransaction().commit();
           }
   }
Vigyen fel egy új szolgáltatót!
public class Main {
           
           private static final String PERSISTENCE_UNIT_NAME = "Feladatok";
           private static EntityManagerFactory factory;
           
           public static void main(String[] args) {
                   factory = Persistence.createEntityManagerFactory(
   PERSISTENCE_UNIT_NAME);
                   EntityManager em = factory.createEntityManager();
                   SzolgaltatoKezelo szk = new SzolgaltatoKezelo(em);
                   
                   em.getTransaction().begin();
                   szk.insert("987651234","Cég99",8888,"Város2","Utca2",88);
                   em.getTransaction().commit();
           }
   }
Kapcsolja össze a vevőt a szolgáltatóval (elégedettség kapcsolat)!
public class Main {
           
           private static final String PERSISTENCE_UNIT_NAME = "Feladatok";
           private static EntityManagerFactory factory;
           
           public static void main(String[] args) {
                   factory = Persistence.createEntityManagerFactory(
   PERSISTENCE_UNIT_NAME);
                   EntityManager em = factory.createEntityManager();
                   VevoKezelo vk = new VevoKezelo(em);
                   SzolgaltatoKezelo szk = new SzolgaltatoKezelo(em);
                   Vevo v = vk.find(987654322);
                   Szolgaltato sz = szk.find("987651234");
                   v.addSzolgaltato(sz);
                   em.getTransaction().begin();
                   vk.update(v);
                   em.getTransaction().commit();
           }
   }
Módosítson egy vevőt!
public class Main {
           
           private static final String PERSISTENCE_UNIT_NAME = "Feladatok";
           private static EntityManagerFactory factory;
           
           public static void main(String[] args) {
                   factory = Persistence.createEntityManagerFactory(
   PERSISTENCE_UNIT_NAME);
                   EntityManager em = factory.createEntityManager();
                   VevoKezelo vk = new VevoKezelo(em);
                   Vevo v = vk.find(11223344);
                   v.setVaros("Új-város");
                   v.setE_mail("újmail@jpa.hu");
                   em.getTransaction().begin();
                   vk.update(v);
                   em.getTransaction().commit();
           }
   }
Módosítson egy szolgáltatót!
public class Main {
           
           private static final String PERSISTENCE_UNIT_NAME = "Feladatok";
           private static EntityManagerFactory factory;
           
           public static void main(String[] args) {
                   factory = Persistence.createEntityManagerFactory(
   PERSISTENCE_UNIT_NAME);
                   EntityManager em = factory.createEntityManager();
                   SzolgaltatoKezelo szk = new SzolgaltatoKezelo(em);
                   Szolgaltato sz = szk.find("987651234");
                   sz.setIrsz(1234);
                   sz.setUtca("Újutca");
                   sz.setVaros("Város-11");
                   em.getTransaction().begin();
                   szk.update(sz);
                   em.getTransaction().commit();
           }
   }
Töröljön egy vevőt!
public class Main {
           
           private static final String PERSISTENCE_UNIT_NAME = "Feladatok";
           private static EntityManagerFactory factory;
           
           public static void main(String[] args) {
                   factory = Persistence.createEntityManagerFactory(
   PERSISTENCE_UNIT_NAME);
                   EntityManager em = factory.createEntityManager();
                   VevoKezelo vk = new VevoKezelo(em);
                   Vevo v = vk.find(11223344);
                   em.getTransaction().begin();
                   vk.remove(v);
                   em.getTransaction().commit();
           }
   }
Töröljön egy szolgáltatót!
public class Main {
           
           private static final String PERSISTENCE_UNIT_NAME = "Feladatok";
           private static EntityManagerFactory factory;
           
           public static void main(String[] args) {
                   factory = Persistence.createEntityManagerFactory(
   PERSISTENCE_UNIT_NAME);
                   EntityManager em = factory.createEntityManager();
                   SzolgaltatoKezelo szk = new SzolgaltatoKezelo(em);
                   Szolgaltato sz = szk.find("987651234");
                   em.getTransaction().begin();
                   szk.remove(sz);
                   em.getTransaction().commit();
           }
   }
Listázza ki a vevőket!
public class Main {
           
           private static final String PERSISTENCE_UNIT_NAME = "Feladatok";
           private static EntityManagerFactory factory;
           
           public static void main(String[] args) {
                   factory = Persistence.createEntityManagerFactory(
   PERSISTENCE_UNIT_NAME);
                   EntityManager em = factory.createEntityManager();
                   VevoKezelo vk = new VevoKezelo(em);
                   Collection<Vevo> vList = vk.findAll();
                   for (Vevo v : vList) {
                           System.out.println(v);
                   }
           }
   }
Listázza ki a szolgáltatókat!
   public class Main {
           
           private static final String PERSISTENCE_UNIT_NAME = "Feladatok";
           private static EntityManagerFactory factory;
           
           public static void main(String[] args) {
                   factory = Persistence.createEntityManagerFactory(
   PERSISTENCE_UNIT_NAME);
                   EntityManager em = factory.createEntityManager();
                   SzolgaltatoKezelo szk = new SzolgaltatoKezelo(em);
                   Collection<Szolgaltato> szList = szk.findAll();
                   for (Szolgaltato sz : szList) {
                           System.out.println(sz);
                   }
           }
   }
   

LINQ

Működési környezet

Sorolja fel a LINQ rendszer főbb jellemzőit!

A LINQ célja egy univerzális objektum-halmaz lekérdező API felület biztosítása, mely révén bármilyen objektum forrásból egységes szintaktikával lehet az igényelt objektumokat begyűjteni. A LINQ kifejezések szintaktikája több elemében az SQL szintaktikájára épít,de számos ponton el is tér tőle. A lekérdezésekben az SQL mellett számos xQuery vonást is felfedezhetünk, ami összecseng azzal a törekvéssel, hogy a LINQ-t az XML adatokra is alkalmazható felületet biztosít.

A LINQ rendszer fő jellemzője az egységes lekérdező felület mellett az, hogy a lekérdezés gazdanyelvi szinten valósul meg, tehát a parancs végrehajtása nem a távoli DBMS magjában fut le, hanem az alkalmazásban. Ennek előnye, hogy a lekérdezés közvetlenül nyomkövethető, a hibakezelés a gazdanyelvi környezetbe integrálható. A LINQ API mögött tehát egy a gazdanyelve ágyazott mini DBMS motor működiik, mely az alkalmazás saját adatival dolgozhat. Ez a működési mód természetesen nem alkalmazható elosztottan módosítható adatok esetében, ott továbbra is centralizált DBMS viztisítja a megoldást.

Milyen adatforrásokat támogat a LINQ rendszer?

A LINQ rendszer egy olyan API adatlekérdező felület amely az adatforrások széles körét támogatva halmaz orientált lekérdező kifejezések használatát teszi lehetvé. A LINQ által támogatott adatforrások:

  1. relációs adatbázisok

  2. alkalmazás belső objektum készletei (tömb, lista, halmaz,...)

  3. XML adatforrások

  4. ADO DataSet

Adja meg a LINQ lekérdezés általános alakját!

A LINQ lekérdezés általános alakja az alábbi absztrakt szintaktikára illeszkedik:

   Q = from-clause join-clause*
   (from-clause join-clause* | let-clause | where-clause)*
   (orderby-clause)?
   (select-clause | groupby-clause)
   (query-continuation Q) ?
      

A LINQ lekérdezés tehát az alábbi komponenseket tartalmazhatja:

  1. objektum-forrás kijelölőú rész (from clause, join clause)

  2. szelekiós rész (where clause)

  3. egység kijelölés (let clause)

  4. csoportképzés (groupby clause)

  5. rendezés (oorderby clause)

A lekérdezések egymásba ágyazhatók és egymásután f0zhetők. Az egyes query elemek halmazműveletekkel összefűzhetők

Milyen adatkezelő operátorokat támogat a LINQ rendszer?

A támogatott operátorok körét foglalja össze az alábbi táblázat.

  1. Select : Az eredmény objektum megadását végző operátor, a forrás objektumokból generál kimeneti objektumot.

  2. Where: szelekciós operátor. A megadott kifejezést nem teljesítő objektumok nem kerülnek át az eredménybe.

  3. SelectMany: Az objektumhalmaz elemeit összetettnek tekinti és kibontja egy-egy listába, majd ezen listákat összevonja egy eredő listába.

  4. Sum / Min / Max / Average: a megadott függvényen alapuló aggregációs kifejezések az objektum halmazon

  5. Aggregate: általánosított aggregáció

  6. Join: két objektum kollekció szelekciós joinja

  7. GroupJoin: két objektum kollekció csoport szelekciós join művelete. Ekkor a az alap Jointól eltérően nem objekum párokat képez, hanem objektum csoportok párjait lehet megadni

  8. Take: az objektum kollekció első megadott számú elemét adja vissza

  9. TakeWhile: az objektum kollekció feltételnek megfelelő elemeit adja vissza

  10. Skip: az objektum kollekció első megadott számú elemét hagyja ki az eredményből

  11. SkipWhile: az objektum kollekció feltételnek megfelelő elemeit hagyja ki az eredményből

  12. OfType: az objektum kollekció megadott típusú elemeit adja vissza

  13. Concat : két objektum kollekció egyesítése

  14. OrderBy / ThenBy : objektum kollekció rendezése, az OrderBy az elsődleges rendezési szempontot adja meg, míg a Thenby a másodlagos rendezési kulcsot jelöli ki

  15. Reverse : az objektum kollekcióban az elemek sorendjének megfordítása

  16. GroupBy : Elemek csoportosítása az objektum halmazban

  17. Distinct : Az dupplikálások megszüntetése az objektum halmazban

  18. Union / Intersect / Except: két objektum halmaz közötti halmazműveletek (unió, metszet és különbség)

  19. SequenceEqual: két objektumhalmaz egyezősését vizsgálja

  20. First / FirstOrDefault / Last / LastOrDefault: a halmazból az első vagy utolsó olyan elemet adja vissza,mely teljesítia feltételt

  21. Single: Egy olyan elemet ad vissza,mely teljesítia megadott feltételt. A következő híváskor a soronkövetkező ilyen elemet adja meg.

  22. ElementAt : a kollekció megadott pozíciójú elemét adja vissza

  23. Any / All : kvantorok az objektumhalmazon (any: létezik, all: minden). Logikai kifejezés áll mögötte és logikai érétket ad vissza.

  24. Contains: ellenőrzi, hogy a kollekció tartalmaz-e egy megadott elemet

  25. Count: kollekció elemeinek adarbszámát adja vissza

Mintaparancsok

Egy adott számsorozatból az 5-nél kisebb értékűeket irassuk ki, használjunk deklaratív parancsmódot.

var q =
      from v in new[] { 11, 5, 3, 17, 4, 32}
         where v < 5
      select v;
   q.Dump();

Készítsen egy szelekciós joint terméknév - gyártónév párosok listájára. A terméket egy (gyártó, név, ár) a gyártót (kód, név) adatok jellemeznek. Használjon deklaratív parancsalakot

   void Main()
   {
      Tgyarto[] A = new Tgyarto[2];
      Ttermek[] B = new Ttermek[5];
      A[0] = new Tgyarto(1,"VASGYAR");
      A[1] = new Tgyarto(2,"ITALGYAR");
      B[0] = new Ttermek(1,"KAPA",23);
      B[1] = new Ttermek(1,"ASO",15);
      B[2] = new Ttermek(2,"TEJ",8);
      B[3] = new Ttermek(2,"VODKA",13);
      B[4] = new Ttermek(2,"TRAUBI",6);
   
      var q =
        from a in A
        join b in B on a.kod equals b.gyarto
        select new {anev = a.nev, bnev = b.nev};
   
      foreach (var v in q) {
        Console.WriteLine(v.anev+" "+ v.bnev);
      }
   }
   
   class Tgyarto {
      public int kod;
      public String nev;
   
      public Tgyarto (int a, String b) {
         this.kod = a;
                this.nev = b;
      }
   }
   
   class Ttermek {
      public int gyarto;
      public String nev;
      public int ar;
   
      public Ttermek (int a, String b, int c) {
         this.gyarto = a;
         this.nev = b;
         this.ar = c;
      }
   }

Irassa ki a termékek darabszámát. Használjon funkcionális parancsalakot..

var q = B
      .Count();
         Console.WriteLine(q);

Irassa ki a 10-nél drágább ermékek darabszámát. Használjon funkcionális parancsalakot.

var q = B
      .Where (t => t.ar > 10)
      .Count();
   Console.WriteLine(q);

Irassa ki a 10-nél drágább termékek neveit ABC sorrendben, funkcionális parancsalakban.

var q = B
      .Where (t => t.ar > 10)
      .Select (e => e.nev)
      .OrderBy (e => e);
   Console.WriteLine(q);

Irassi ki az ITALGYAR termékeit, funkcionális alakot használjon. A nevek rendezve jelenjenek meg.

var q = A
      .Where (t => t.nev == "ITALGYAR")
      .Join(B, b => b.kod, a => a.gyarto, (a,b) => new {b.nev})
      .OrderBy(e => e.nev);
   Console.WriteLine(q);

Irassi ki az ITALGYAR termékeinek átlagárát, funkcionális alakot használjon.

var q = A
   .Where (t => t.nev == "ITALGYAR")
   .Join(B, b => b.kod, a => a.gyarto, (a,b) => new {b.nev, b.ar})
   .Average(e => e.ar);
   Console.WriteLine(q);

Listázza ki az átlagárnál drágább termékek neveit, funkcionális kódot alkalmazzon.

var q = B
      .Where (t => t.ar > ( B.Average(e => e.ar) ) )
      .Select (t => t.nev);
   Console.WriteLine(q);

Kérdezze le az italgyári termékek átlagáránál drágább termékek neveit ABC sorrendben, funkcionális parancsalakban.

var q = B
      .Where (t => t.ar > ( A
      .Where (e => e.nev == "ITALGYAR")
      .Join(B, b => b.kod, a => a.gyarto, (a,b) => new {b.nev, b.ar})
      .Average(e => e.ar) ) )
      .Select (t => t.nev)
      .OrderBy (t => t);
   Console.WriteLine(q); 
   

3. fejezet - Animációk

Temék raktár ER modell elkészítése: animáció

Dolgozó számla nyilvántartása: animáció

Rendelés nyilvántartó modell elkészítése: animáció

Raktár nyilvántartás ER modell elkészítése: animáció

Ajándékkosár rendelés ER modell elkészítése: animáció

Vállalat dolgozó-útnyilvántartás hierarchikus modell elkészítése: animáció

Beszállítók nyilvántartás hierarchikus modell elkészítése: animáció

Temék raktár ER modell elkészítése: animáció

Rendelés számlászás hálós modell elkészítése: animáció

Újság tartalom hálós modell elkészítése: animáció

Tanfolyam nyilvántartás relációs modell elkészítése: animáció

MySQL adatbázis kezelő rendszer telepítése, paraméterezése: animáció

MySQL Workbench DBA kezelő felület használata: animáció

MySQL adatbázis kezelő rendszer SQL parancsok kiadása: animáció