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.
A példában a hallgató egy nem példányosítható típus. Vegyük át újra definciót most soronként elemezve:
A fejléc kijelöli az azonosító nevet és a típus jellegét (interfész) INTERFACE hallgató {
Egy saját rekordtípus definiálása, mely két tagból áll STRUCT cím { STRING kollégium STRING szoba };
A név attribútum szöveges típusú ATTRIBUTE STRING név;
Az elérés attribútum cím rekordszerkezetű ATTRIBUTE cím elérés;
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;
Kivétel kezelő rutinok definiálása EXCEPTION kurzus_tele(); EXCEPTION nem_lézető_kurzus ();
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);
A következő típus egy osztályt jelöl ki CLASS oktató {
A tanszék attribútum szöveges típusú ATTRIBUTE STRING tanszék;
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);
A tanít kapcsolat kurzusok halmazát jelöli ki. RELATIONSHIP SET<kurzus> tanit;
A doktorandusz típus is osztályként értelmezett. Létezik ősosztály az oktataó osztály.
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ó
A doktorandusz osztály példányait, objektumait a doktoranduszok elnevezésű extent fogja össze (EXTENT doktoranduszok)
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;
Egy saját egyedi atribútum az egész típusú óraszám ATTRIBUTE SHORT oraszam;
Itt definiáljuk az interfészben előírt kapcsolatokat RELATIONSHIP SET <szak> tanulja INVERSE szak:hallgatja;
és metódusokat is. BOOLEAN regisztrál ( IN SHORT kurzus, IN SHORT szak) RAISE (kurzus_tele, nem_lézető_kurzus);
STRUCT nap_t {INTEGER nap, FLOAT homerseklet};
ATTRIBUTE LIST < nap_t > napok;
CLASS diak {
ATTRIBUTE STRING nev;
ATTRIBUTE STRING szulhely;
ATTRIBUTE DATE szukdatum,
ATTRIBUTE STRING osztály;
ATTRIBUTE FLOAT átlag;
}
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;
}
CLASS eredmeny
(EXTENT eredmenyek) {
STRUCT jegy_t {STRING targy, INTEGER ertek, DATE datum};
ATTRIBUTE LIST jegy_t jegyek,
RELATIONSHIP diak diak;
}
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;
}
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
}SELECT k.cím FROM könyvek AS k WHERE k.év = 2004
EXISTS x IN könyvek :x.év = 2003
FOR ALL x IN könyv : x.ev > 2000
AVG( SELECT x.ár FROM könyvek AS x)
AVG (SELECT x.ár FROM könyvek AS x WHERE x.év < 2002)
SELECT k.cím, k.év FROM könyvek AS k WHERE k.ár > AVG( SELECT x.ár FROM könyvek AS x)
SELECT * FROM könyvek AS k GROUP BY éve: k.év
SELECT k.cím FROM könyvek AS k ORDER BY k.ár ASC
SELECT k.*, s.* FROM kiadók AS k, szerz#k AS s WHERE k.ország = s.ország
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.
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:
kiadók halmaza (ezt tartalmazza az adatbázis, ebből lehet kiindulni)
magyarországi kiadók halmaza (származtattott)
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.
k = kiadók halmaza (ezt tartalmazza az adatbázis, ebből lehet kiindulni)
h = magyarországi kiadók halmaza (származtattott)
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.
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.
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’
CREATE OR REPLACE TYPE t_lakcim AS OBJECT ( irsz NUMBER(4), varos CHAR(20), utca CHAR(20), hazszam NUMBER(3) );
CREATE TABLE dolgozok (
kod NUMBER(3) PRIMARY KEY,
nev CHAR(20) NOT NULL,
szulev NUMBER(4) CHECK (szulev > 1900),
lakcim t_lakcim
); INSERT INTO DOLGOZOK
VALUES (1,'ANNA',1995,
T_LAKCIM(3527,'MISKOLC','NAGY UT',12));SELECT d.nev, d.lakcim.varos FROM dolgozok d ORDER BY 2;
SELECT count(d.nev), d.lakcim.varos FROM dolgozok d GROUP BY d.lakcim.varos;
CREATE OR REPLACE TYPE t_ember AS OBJECT ( nev CHAR(20), sz_ev NUMBER(4), igazolvany_sz CHAR(10), cim T_LAKCIM );
CREATE TABLE emberek OF t_ember
INSERT INTO emberek
VALUES (T_EMBER('GABI',1994,'IG1',
T_LAKCIM(2333,'Dorog','Petofi',23)))SELECT REF(e), e.nev FROM emberek e
UPDATE emberek SET cim = t_lakcim(3111,'Ozd','Patak' ,45) WHERE igazolvany_sz = 'IG1'
CREATE OR REPLACE TYPE t_ember AS OBJECT ( nev CHAR(20), sz_ev NUMBER(4), igazolvany_sz CHAR(10), cim T_LAKCIM ) NOT FINAL
CREATE OR REPLACE TYPE t_ugyfel UNDER t_ember ( ukod NUMBER(4), belepes_datum DATE, u_tipus CHAR(3) )
INSERT INTO ugyfelek
VALUES (t_ugyfel('Zoltan',1987,'IG2',
t_lakcim(4555,'Szolnok','Hatar',45),1,SYSDATE,'LAK'))SELECT u.cim.varos, COUNT(*) FROM ugyfelek u GROUP BY u.cim.varos
CREATE TYPE t_ugyfelek AS TABLE OF t_ugyfel;
CREATE TABLE ugyek ( kod NUMBER(2) PRIMARY KEY, leiras CHAR(20), resztvevok t_ugyfelek ) NESTED TABLE resztvevok STORE AS s_tabla
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'))
)SELECT u.nev, u.cim.varos FROM TABLE (SELECT p.resztvevok FROM ugyek p WHERE p.leiras LIKE 'Macskavita%') u
DELETE FROM TABLE ( SELECT p.resztvevok FROM ugyek p WHERE p.kod = 1) u WHERE u.ukod = 1
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'))CREATE TABLE panaszok ( kod NUMBER(3) PRIMARY KEY, leiras CHAR(20), ugyfel REF t_ugyfel )
INSERT INTO panaszok VALUES (1,'csendháborítás', (SELECT REF(u) FROM ugyfelek u WHERE nev LIKE 'Zoltan%'))
SELECT p.leiras, p.ugyfel.nev FROM panaszok p
SELECT u.leiras, r.nev FROM ugyek u, TABLE ( SELECT resztvevok FROM ugyek v WHERE v.kod = u.kod) r
CREATE OR REPLACE TYPE t_ugyfelek_ref AS TABLE OF REF t_ugyfel
CREATE TABLE panaszok (
kod NUMBER(3) PRIMARY KEY,
leiras CHAR(20),
ugyfelek t_ugyfelek_ref)
NESTED TABLE ugyfelek STORE AS seged2INSERT 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')) )
INSERT INTO panaszok VALUES (3,'labdazas',t_ugyfelek_ref())
INSERT INTO TABLE(SELECT ugyfelek FROM panaszok WHERE kod = 3) VALUES ((SELECT REF(u) FROM ugyfelek u WHERE u.nev LIKE 'dani%' ))
SELECT a.leiras, (SELECT count(*) FROM TABLE (select ugyfelek FROM panaszok WHERE kod = a.kod)) FROM panaszok a
SELECT p.leiras, DEREF(COLUMN_VALUE).nev FROM panaszok p, TABLE(p.ugyfelek) r
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
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;
CREATE TABLE emberek2 OF t_ember2;
INSERT INTO EMBEREK2
VALUES
(t_ember2('Zoli',1987,'IG3',t_lakcim(5565,'Baja','Otto',23)))SELECT E.NEV, E.ELETKOR(), E.LAKCIM() FROM EMBEREK2 E
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 );