2.3. OO modellezés

2.3.1. UML osztály diagram feladatok

2.3.1.1. 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

2.3.1.2. 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

2.3.1.3. 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

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

2.38. ábra - UML diagram

UML diagram

2.3.1.5. É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.

2.3.1.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

2.39. ábra - UML diagram

UML diagram

2.3.2. ODL modellezés

2.3.2.1. É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);

2.3.2.2. 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;

2.3.2.3. 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;
   }

2.3.2.4. 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;
   }

2.3.2.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.

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

2.3.2.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.

   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;
   }

2.3.2.7. 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
   }

2.3.3. OQL műveletek

2.3.3.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)

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

2.3.3.2.       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

2.3.3.3. 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

2.3.3.4. 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)

2.3.3.5. 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)

2.3.3.6. 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)

2.3.3.7. 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

2.3.3.8. 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

2.3.3.9. 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

2.3.3.10. 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.

2.3.3.11. 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.

2.3.3.12. 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.

2.3.3.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

   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’

2.3.3.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

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

2.3.4. Oracle adatbázis ORDBMS műveletek

2.3.4.1. 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)
   );

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

   DROP TYPE t_lakcim FORCE;

2.3.4.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.

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

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

    INSERT INTO DOLGOZOK
     VALUES (1,'ANNA',1995,
      T_LAKCIM(3527,'MISKOLC','NAGY UT',12));

2.3.4.5. 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;

2.3.4.6. 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;

2.3.4.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.

   CREATE OR REPLACE TYPE t_ember AS OBJECT (
      nev CHAR(20),
      sz_ev NUMBER(4),
      igazolvany_sz CHAR(10),
      cim T_LAKCIM
   );

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

   CREATE TABLE emberek OF t_ember

2.3.4.9. 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)))

2.3.4.10. 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

2.3.4.11. 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'

2.3.4.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.

   CREATE OR REPLACE TYPE t_ember AS OBJECT (
      nev CHAR(20),
      sz_ev NUMBER(4),
      igazolvany_sz CHAR(10),
      cim T_LAKCIM
   ) NOT FINAL

2.3.4.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

    CREATE OR REPLACE TYPE t_ugyfel UNDER t_ember (
      ukod NUMBER(4),
      belepes_datum DATE,
      u_tipus CHAR(3)
   )

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

    CREATE TABLE ugyfelek OF t_ugyfel

2.3.4.15. 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'))

2.3.4.16. 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

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

   CREATE TYPE t_ugyfelek AS TABLE OF t_ugyfel;

2.3.4.18. 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

2.3.4.19. 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'))
   )

2.3.4.20. 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

2.3.4.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)

   DELETE FROM TABLE (
      SELECT p.resztvevok 
      FROM ugyek p 
      WHERE p.kod = 1) 
   u WHERE u.ukod = 1

2.3.4.22. 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'))

2.3.4.23. 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
   )

2.3.4.24. 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%'))

2.3.4.25. 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

2.3.4.26. 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

2.3.4.27. 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

2.3.4.28. 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

2.3.4.29. 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'))
   )

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

   INSERT INTO panaszok 
   VALUES (3,'labdazas',t_ugyfelek_ref())

2.3.4.31. 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%' ))

2.3.4.32. 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

2.3.4.33. 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

2.3.4.34. 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

2.3.4.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.

   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;

2.3.4.36. 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)))

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

   SELECT E.NEV, E.ELETKOR(), E.LAKCIM() 
   FROM EMBEREK2 E

2.3.4.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.

    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
   );