A PL/SQL programozási nyelv

Objektum-orientált programozás

Osztályok és objektumok

A PL/SQL támogatja ugyan az objektum elvű programozást, de a rendelkezésünkre álló kevéske eszköz szűkre szabja a lehetőségeinket. A nyelv az objektum típussal lehetőséget ad nekünk arra, hogy objektum típusú változókat hozzunk létre. Ez a típus közel áll az OO tervezésben használt osztály fogalomhoz. (A Java és a C++ osztály típusának egy „butább” megfelelője.)
Fontos, hogy az objektum típus segítségével külön tudjuk választani a specifikációt és az implementációt. Így anélkül módosíthatjuk vagy akár teljes egészében le is cserélhetjük a metódusok implementációját, a specifikációt megtartva, hogy a típust felhasználóknak bármit is tenniük kellene vagy észrevennék a változtatást.

Az objektum típus tehát két részből, a specifikációs és az implementációs részből áll. A specifikációs részben kell felsorolni az attribútumokat és metódusokat. Az attribútumok deklarációjának meg kell előznie a metódusokét.

A PL/SQL belső adattípusai: Az attribútumok típusa bármi lehet a következőket kivéve: Erre a megkötésre azért van szükség, mert az objektumok így megfeleltethetőek egy reláció sorainak az adatbázisban.

Minden attribútumnak azonos a láthatósága. Kívülről is láthatóak és elérhetőek. (A C++-ban ennek a public láthatóság felel meg) Tehát az adatelrejtést (information hiding) nem támogatja a nyelv.

A metódusok lehetnek osztály, illetve objektum szintűek. Előbbiek deklarációját a STATIC, utóbbiakét a MEMBER kulcsszónak kell megelőznie. A metódusok neve nem egyezhet meg sem a típus sem egyetlen attribútum nevével sem. A paraméterek és a függvények visszatérési értékének típusára ugyanazon korlátozások vonatkoznak, mint az attribútumok esetében. Az objektum szintű metódusok rendelkeznek egy implicit paraméterrel, ez a SELF. A SELF az az objektum, amelyhez a metódus tartozik. Ezért ez egy objektum típusú paraméter. Meg lehet adni explicit módon is. Ekkor függvény esetén csak IN módú, eljárás esetén IN OUT módú lehet. OUT módú paraméter soha nem lehet.

Példa: Készítsük el a complex számok típusát!

Create type Komplex as object ( re Real, im Real, memeber function összead(c Komplex) return Komplex, memeber function kivon(c Komplex) return Komplex, memeber function szoroz(x Komplex) return Komplex, memeber function hossz() return Real ); Create type body Komplex as memeber function összead(c Komplex) return Komplex is Begin return(re+c.re,im+c.im); End összead; memeber function kivon(c Komplex) return Komplex is Begin return(re-c.re,im-c.im); End kivon; memeber function szoroz(c Komplex) return Komplex is Begin return(re*c.re-im*c.im,re*c.im+im*c.re); End szoroz; memeber function oszt(c Komplex) return Komplex is Begin return(re+c.re,im+c.im); End oszt; member function hossz() return Real is Begin return(sqrt(re*re+im*im)); End hossz; End;

A Map és Order metódusok

Tulajdonképpen ezek nem is metódusok, hanem az objektum szintű függvényeket speciális tulajdonsággal felruházó eszközök.
Miről is van itt szó tulajdonképpen? Az Oracle automatikusan bizosít számunkra egyenlőségvizsgálatot az azonos típusú objektumok között.
Két objektumot akkor tekint egyenlőnek, ha a megfelelő attribútumaik egyenlők. Igen ám, de mint tudjuk az objektumok akár adatbáziselemek is lehetnek
és szerepelhetnek például egy lekérdezés order by részében. Ehhez az kell, hogy az objektumok halmazán értelmezve legyen egy rendezési reláció.
Ránk hárul a feladat, hogy ezt a relációt (függvényt) elkészítsük. Persze ez nem kötelező, de ha a nyelv lehetőséget ad rá miért ne használnánk ki.
Ezzel vissza is érkeztünk a map és az order kulcsszavak jelentéséhez. Alakítsuk át a fenti példában szereplő hossz() metódus specifikációját a következőképpen:

Map member function hossz() return Real

A PL/SQL mostantól automatikusan fel fogja használni a hossz() függvényt, hogy az x < y típusú logikai kifejezéseket kiértékelje illetve a distinct, group by vagy order by résszel rendelkező SQL lekérdezéseket kezelje.
A map metódus visszatérési értékének típusa csak DATE, NUMBER, VARCHAR2 vagy ANSI SQL típus lehet.
Az order jelentése hasonló. De az order metódus a self paraméteren kívül kap még egy explicit objektum típusú paramétert is.
A függvény a paraméterekben kapott két objektumról dönti el, hogy melyik a nagyobb. Az eredeti Komplex típust most egy másik függvénnyel bővítjük ki:

Order member function hasonlit(c Komplex) return Integer Order member function hasonlit(c Komplex) return Integer is Begin If re < c.re Then return -1; Elsif re > c.re Then return 1; Else return 0; End If; End hasonlit;

Ha a függvény valamelyik paramétere NULL, akkor a visszatérési értéke is NULL;

Az order és map metódusok kizárják egymást és mindegyikből legfeljebb egy lehet.

Konstruktor

Minden Objektum típushoz automatikusan generálódik egy alapértelmezett konstruktor, amelynek visszatérési értéke a típus egy példánya. A konstruktor neve megegyezik az Objektum típus nevével, paraméterlistáját pedig, a típus attribútumai adják a deklarációjuk sorrendjében. Lehetőség van a konstruktor túlterhelésére és felülírására is. Az objektum létrehozásakor explicit módon kell meghívni a konstruktort. Implicit konstruktor hívás a PL/SQL-ben nincs. Objektum típust létrehozni kizárólag SQL*Plus-ból a Create type SQL utasítással lehet. PL/SQL blokkban, csomagban és alprogramban nem megengedett.

Öröklődés

A PL/SQL az egyszerű öröklődést támogatja, azaz egy Objektum típusnak legfeljebb egy szupertípusa lehet.
Az altípus örökli a szülőtől az attribútumokat és metódusokat. Ezeken felül még újabbakat definiálhat. (Mind attribútumot mind metódust.)