Oracle PL/SQL objektumtípusok: CREATE TYPE példákkal
⚡ Okos összefoglaló
A PL/SQL objektumtípusai objektumorientált programozást tesznek lehetővé. Oracle, lehetővé téve a valós világbeli entitások modellezését attribútumok és metódusok segítségével. Támogatják a konstruktorokat, az öröklődést és az egyenlőség-összehasonlítást, így egyetlen séma szintű típus képes strukturált adatok tárolására és feldolgozására.
Mi az objektumtípus a PL/SQL-ben?
Az objektumorientált programozás különösen alkalmas újrafelhasználható komponensek és összetett alkalmazások fejlesztésére. A programok „objektumok”, nem pedig „műveletek” köré szerveződnek; vagyis úgy vannak kialakítva, hogy egy egész objektummal működjenek és interakcióba lépjenek, ne pedig egyetlen művelettel. Ez a megközelítés lehetővé teszi a programozó számára, hogy objektum-entitás szinten töltse ki és manipulálja a részleteket.
Az alábbi kép egy olyan objektumtípust mutat be, amelyben egy bankszámlát objektumentitásként kezelünk. Az objektumattribútumok értékeket tartalmaznak – bankszámla esetén ezek a számlaszám, a banki egyenleg stb. –, míg az objektummetódusok olyan műveleteket írnak le, mint a kamatláb kiszámítása vagy a bankszámlakivonat generálása, amelyek mindegyikéhez egy folyamat végrehajtása szükséges.
In PL / SQLAz objektumorientált programozás objektumtípusokon alapul. Egy objektumtípus bármilyen valós entitást reprezentálhat. Az alábbi szakaszok az objektumtípusokat, azok összetevőit, valamint létrehozásuk és használatuk módját tárgyalják.
Az objektumtípusok összetevői
Egy PL/SQL objektumtípus főként két komponensből áll.
- Attribútumok
- Tagok/Módszerek
Attribútumok
Az attribútumok azok az oszlopok vagy mezők, amelyekben az adatok tárolódnak. Minden attribútum ahhoz az adattípushoz van leképezve, amely meghatározza az adott attribútum feldolgozási és tárolási típusát. Egy attribútum bármilyen érvényes lehet. PL/SQL adattípus, vagy lehet más objektumtípus is.
Tagok/Módszerek
A tagok, vagy metódusok, alprogramok az objektumtípuson belül vannak definiálva. Nem adatok tárolására szolgálnak, ehelyett az objektumtípuson belül végrehajtott feldolgozást definiálják – például az adatok érvényesítését az objektum feltöltése előtt. Az objektumtípus-specifikációban deklarálják őket, és az objektumtípus törzsében definiálják őket. A törzs opcionális: ha nincsenek tagok, akkor az objektumtípusnak nincs törzse.
Objektum létrehozása Oracle
Objektumtípus nem hozható létre alprogram szinten; csak séma szinten hozható létre. Miután az objektumtípus definiálva van a sémában, használható alprogramokban. Az objektumtípus a „CREATE TYPE” utasítással hozható létre, és a típus törzse csak azután hozható létre, hogy az objektumtípusa létezik.
Az alábbi képernyőképek az objektumspecifikáció CREATE TYPE szintaxisát és a metódusait definiáló CREATE TYPE BODY szintaxist mutatják.
CREATE TYPE<object_type_name> AS OBJECT ( <attribute_l><datatype>, . . ); / CREATE TYPE BODY<object_type_name> AS OBJECT ( MEMBER[PROCEDURE|FUNCTION]<member_name> IS <declarative section> BEGIN <execution part> END; . . ); /
Szintaxis magyarázata:
- A fenti szintaxis egy OBJECT objektum létrehozását mutatja be attribútumokkal és egy OBJECT BODY objektum létrehozását metódusokkal.
- A metódusok az objektumtörzsben is túlterhelhetők.
Nyilatkozat Objektumtípus inicializálása
A PL/SQL más komponenseihez hasonlóan az objektumtípusokat is deklarálni kell, mielőtt egy programban használnánk őket. Miután az objektumtípus létrejött, felhasználható egy alprogram deklaratív szakaszában az adott objektumtípusú változó deklarálására.
Amikor egy változót objektumtípusként deklarálunk, futásidőben az objektumtípus egy új példánya jön létre, és erre az újonnan létrehozott példányra a változó nevével hivatkozunk. Ily módon egyetlen objektumtípus több értéket is tárolhat különböző példányok alatt.
Az alábbi képernyőkép egy változó objektumtípusként való deklarálását mutatja egy PL/SQL blokk.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Szintaxis magyarázata:
- A fenti szintaxis egy deklarációját mutatja be. változó objektumtípusként a deklaratív szakaszban.
Miután a változót objektumtípusként deklaráljuk egy alprogramban, az atomilag null – maga a teljes objektum null. Értékekkel kell inicializálni, mielőtt a programban használható lenne. Az objektumokat konstruktorok segítségével inicializáljuk.
A konstruktorok egy objektum implicit metódusai, amelyekre ugyanazzal a névvel lehet hivatkozni, mint az objektumtípusra. Az alábbi képernyőkép egy objektumtípus-példány inicializálását mutatja.
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
Szintaxis magyarázata:
- A fenti szintaxis az objektumtípus-példány null értékkel történő inicializálását mutatja.
- Maga az objektum már nem null értékű az inicializálás után, de az objektumon belüli attribútumok nullok maradnak, amíg értékeket nem rendelünk hozzájuk.
Kivitelezők
A konstruktorok egy objektum implicit metódusai, amelyekre ugyanazzal a névvel lehet hivatkozni, mint az objektumtípusra. Amikor az objektumra először hivatkozunk, ez a konstruktor implicit módon meghívódik.
Objektumokat is inicializálhatsz ezekkel a konstruktorokkal. Egy konstruktor explicit módon definiálható egy tag definiálásával az objektumtípus törzsében, amelynek neve megegyezik az objektumtípus nevével.
Példa 1: A következő példában az objektumtípusú tagot használjuk rekordok beszúrására az emp táblába a következő értékekkel: ('RRR', 1005, 20000, 1000) és ('PPP', 1006, 20000, 1001). Miután az adatokat beszúrtuk, az objektumtípusú tag segítségével jelenítjük meg azokat. Egy explicit konstruktort is használunk a kezelőazonosító feltöltéséhez az alapértelmezett 1001 értékkel a második rekordhoz.
A következő lépésekben hajtjuk végre.
- 1. lépés: Hozza létre az Objektumtípust és az Objektumtípus törzsét.
- 2. lépés: Hozz létre egy anonim blokkot az objektumtípus meghívásához az emp_no 1005 implicit konstruktorán keresztül.
- 3. lépés: Hozz létre egy anonim blokkot az objektumtípus meghívásához az emp_no 1006 explicit konstruktorán keresztül.
1. lépés) Hozz létre objektumtípust és objektumtípus törzset.
Az alábbi képernyőkép az emp_object objektumtípus-specifikáció létrehozását mutatja be az attribútumaival és tagjaival együtt.
CREATE TYPE emp_object AS OBJECT( emp_no NUMBER, emp_name VARCHAR2(50), salary NUMBER, manager NUMBER, CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER, p_emp_name VARCHAR2, p_salary NUMBER) RETURN SELF AS RESULT), MEMBER PROCEDURE insert_records, MEMBER PROCEDURE display_records); /
Az alábbi képernyőkép az emp_object típusú törzs létrehozását mutatja az explicit konstruktorral és a tageljárásokkal.
CREATE OR REPLACE TYPE BODY emp_object AS CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2, p_salary NUMBER) RETURN SELF AS RESULT IS BEGIN Dbms_output.put_line('Constructor fired..'); SELF.emp_no:=p_emp_no; SELF.emp_name:=p_emp_name; SELF.salary:=p_salary; SELF.manager:=1001; RETURN; END; MEMBER PROCEDURE insert_records IS BEGIN INSERT INTO emp VALUES(emp_no,emp_name,salary,manager); END; MEMBER PROCEDURE display_records IS BEGIN Dbms_output.put_line('Employee Name:'||emp_name); Dbms_output.put_line('Employee Number:'||emp_no); Dbms_output.put_line('Salary:'||salary); Dbms_output.put_line('Manager:'||manager); END; END; /
Code Magyarázat
- Code 1-9. sor: Az „emp_object” objektumtípus létrehozása 4 attribútummal és 3 taggal. Ez egy konstruktor definícióját tartalmazza, amely mindössze 3 paraméterrel rendelkezik. (A tényleges implicit konstruktor annyi paramétert tartalmaz, ahány attribútum van az objektumtípusban.)
- Code 10. sor: A típustörzs létrehozása.
- Code 11-21. sor: Az explicit konstruktor definiálása. Paraméterértékek hozzárendelése az attribútumokhoz és a 'manager' attribútum alapértelmezett '1001' értékének hozzárendelése.
- Code 22-26. sor: Az „insert_records” tag definiálása, amelyben az attribútumértékek beszúrásra kerülnek az „emp” táblába.
- Code 27-34. sor: A 'display_records' tag definiálása, amely az objektumtípus attribútumok értékeit jeleníti meg.
output:
Típus létrehozva
Típus törzs létrehozva
Step 2) Névtelen blokk létrehozása a létrehozott objektumtípus meghívásához az emp_no 1005 implicit konstruktorán keresztül.
Az alábbi képernyőkép az anonim blokkot mutatja, amely az emp_object függvényt az implicit konstruktoron keresztül hívja meg.
DECLARE guru_emp_det emp_object; BEGIN guru_emp_det:=emp_object(1005,'RRR',20000,1000); guru_emp_det.display_records; guru_emp_det.insert_records; COMMIT; END;
Code Magyarázat
- Code 37-45. sor: Rekordok beszúrása implicit konstruktorral. A konstruktor hívása tartalmazza az attribútumértékek tényleges számát.
- Code 38. sor: A 'guru_emp_det' objektumot 'emp_object' objektumtípusként deklarálja.
- Code 41. sor: A „guru_emp_det.display_records” utasítás meghívja a „display_records” tagot, és megjeleníti az attribútumértékeket.
- Code 42. sor: A „guru_emp_det.insert_records” utasítás meghívja az „insert_records” tagot, és az attribútumértékek beszúródnak a táblázatba. A blokk ezután véglegesíti a tranzakció.
output:
Alkalmazott neve: RRR
Alkalmazotti létszám: 1005
Fizetés: 20000 XNUMX
Menedzser: 1000
Step 3) Névtelen blokk létrehozása a létrehozott objektumtípus meghívásához az emp_no 1006 explicit konstruktorán keresztül.
Az alábbi képernyőkép egy anonim blokkot mutat, amely az emp_object függvényt hívja meg explicit konstruktoron keresztül, három argumentummal.
DECLARE guru_emp_det emp_object; BEGIN guru_emp_det:=emp_object(1006,'PPP',20000); guru_emp_det.display_records; guru_emp_det.insert_records; COMMIT; END; /
teljesítmény
Employee Name:PPP Employee Number:1006 Salary:20000 Manager:1001
Code Magyarázat:
- Code 46-53. sor: A rekord beszúrása explicit konstruktor használatával.
- Code 46. sor: A 'guru_emp_det' objektumot 'emp_object' objektumtípusként deklarálja.
- Code 50. sor: A „guru_emp_det.display_records” utasítás meghívja a „display_records” tagot, és megjeleníti az attribútumértékeket.
- Code 51. sor: A „guru_emp_det.insert_records” utasítás meghívja az „insert_records” tagot, és az attribútumértékek beszúródnak a táblázatba. Mivel csak három argumentumot adunk át, az explicit konstruktor a kezelő azonosítóját az alapértelmezett 1001-es értékre állítja be.
Öröklődés objektumtípusban
Az öröklés tulajdonság lehetővé teszi egy alobjektumtípus számára, hogy hozzáférjen a szuperobjektumtípus vagy a szülő objektumtípus összes attribútumához és tagjához.
Az alobjektumtípust örökölt objektumtípusnak, a szuperobjektumtípust pedig szülő objektumtípusnak nevezzük. Az alábbi szintaxis bemutatja, hogyan hozhatunk létre szülő és örökölt objektumtípusokat. Az alábbi képernyőkép a szülő (SUPER) típus szintaxisát mutatja be, amelyet NEM VÉGLEGES jelöléssel láttunk el.
CREATE TYPE <object_type_name_parent> AS OBJECT ( <attribute_l><datatype>, . . )NOT FINAL; /
Szintaxis magyarázata:
- A fenti szintaxis a SUPER típus létrehozását mutatja. A NOT FINAL záradék lehetővé teszi a típus öröklését.
Az alábbi képernyőkép az UNDER kulcsszóval létrehozott örökölt (SUB) típus szintaxist mutatja.
CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent> ( <attribute_l><datatype>, . ); /
Szintaxis magyarázata:
- A fenti szintaxis a SUB típus létrehozását mutatja be. Ez tartalmazza a szülő objektumtípus összes tagját és attribútumát.
Példa 1: Az alábbi példában az öröklés tulajdonságot használjuk egy '1002' kezelőazonosítójú rekord beszúrásához a következő rekordhoz: ('RRR', 1007, 20000). A programot a következő lépésekben hajtjuk végre.
- 1. lépés: Hozza létre a SUPER típust.
- 2. lépés: Hozza létre a SUB típust és törzset.
- 3. lépés: Hozz létre egy névtelen blokkot a SUB típus meghívásához.
1. lépés) Hozz létre SUPER vagy Parent típust.
Az alábbi képernyőképen az emp_object szupertípus létrehozása látható a NOT FINAL záradékkal.
CREATE TYPE emp_object AS OBJECT( emp_no NUMBER, emp_name VARCHAR2(50), salary NUMBER, manager NUMBER, CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2(50), p_salary NUMBER)RETURN SELF AS RESULT), MEMBER PROCEDURE insert_records, MEMBER PROCEDURE display_records)NOT FINAL; /
Code Magyarázat:
- Code 1-9. sor: Az „emp_object” objektumtípus létrehozása 4 attribútummal és 3 taggal. Egy konstruktor definícióját tartalmazza, mindössze 3 paraméterrel. „NOT FINAL”-ként deklarálták, tehát szülő típus.
2. lépés) Hozz létre SUB típust a SUPER típus alatt.
Az alábbi képernyőkép a sub_emp_object örökölt típusát és annak létrehozását mutatja.
CREATE OR REPLACE TYPE sub_emp_object UNDER emp_object (default_manager NUMBER,MEMBER PROCEDURE insert_default_mgr); / CREATE OR REPLACE TYPE BODY sub_emp_object AS MEMBER PROCEDURE insert_default_mgr IS BEGIN INSERT INTO emp VALUES(emp_no,emp_name,salary,manager); END; END; /
Code Magyarázat:
- Code 10-13. sor: A 'sub_emp_object' létrehozása örökölt típusként egy további 'default_manager' attribútummal és egy tageljárás deklarációjával.
- Code 14. sor: Az örökölt objektumtípus törzsének létrehozása.
- Code 16-21. sor: A tageljárás definiálása, amely a SUPER objektumtípus értékeivel – a manager érték kivételével – beszúrja az 'emp' táblába a rekordokat. A manager értékéhez a SUB típus 'default_manager' értékét használja.
3. lépés) Névtelen blokk létrehozása a SUB típus meghívásához.
Az alábbi képernyőképen látható az anonim blokk, amely meghívja a SUB típust, és beszúrja az alapértelmezett kezelőazonosítót.
DECLARE guru_emp_det sub_emp_object; BEGIN guru_emp_det:= sub_emp_object(1007,'RRR',20000,1000,1002); guru_emp_det.insert_default_mgr; COMMIT; END; /
Code Magyarázat:
- Code 25. sor: A 'guru_emp_det' deklarálása 'sub_emp_object' típusként.
- Code 27. sor: Az objektum inicializálása az implicit konstruktorral. A konstruktor 5 paraméterrel rendelkezik (4 attribútum a PARENT típusból és 1 attribútum a SUB típusból). Az utolsó paraméter (1002) határozza meg a default_manager attribútum értékét.
- Code 28. sor: Az „insert_default_mgr” tag meghívása a konstruktorban átadott alapértelmezett kezelőazonosítóval rendelkező rekord beszúrásához.
A PL/SQL objektumok egyenlősége
Az azonos objektumtípusba tartozó objektumpéldányok összehasonlíthatók egyenlőség szempontjából. Ehhez az objektumtípushoz egy speciális metódusra, az ORDER metódusra van szükség.
Ennek az ORDER metódusnak egy numerikus típust visszaadó függvénynek kell lennie. Két paramétert fogad bemenetként (első paraméter: a saját objektumpéldány azonosítója; második paraméter: egy másik objektumpéldány azonosítója).
A két objektumpéldány azonosítóját összehasonlítjuk, és az eredményt számként adjuk vissza.
- A pozitív érték azt jelzi, hogy a SELF objektumpéldány nagyobb értékű, mint a másik példány.
- A negatív érték azt jelzi, hogy a SELF objektumpéldány kisebb, mint a másik példány.
- A nulla azt jelzi, hogy a SELF objektumpéldány egyenlő a másik példánnyal.
- Ha bármelyik példány null, a függvény null értéket ad vissza.
Az alábbi képernyőkép az ORDER tagfüggvény szintaxisát mutatja, amelyet a típustörzsben kell szerepeltetni az egyenlőség-ellenőrzéshez.
CREATE TYPE BODY<object_type_name_ 1>AS OBJECT ( ORDER MEMBER FUNCTION match(<parameter> object_type_name_ 1) RETURN INTEGER IS BEGIN IF <attribute_name>parameter <attribute_name>THEN RETURN -1; --any negative number will do ELSIF id>c.id THEN RETURN 1; --any positive number will do ELSE RETURN 0; END IF; END; . . ); /
Szintaxis magyarázata:
- A fenti szintaxis az ORDER függvényt mutatja, amelyet a típustörzsben kell szerepeltetni az egyenlőség-ellenőrzéshez.
- A függvény paraméterének azonos objektumtípusú példánynak kell lennie.
- A függvényt „obj_instance_1.match(obj_instance_2)” néven hívhatjuk meg, és ez a kifejezés a megadott numerikus értéket adja vissza, ahol az obj_instance_1 és obj_instance_2 az objektumtípus példányai.
Példa 1: A következő példában két objektumot hasonlítunk össze. Létrehozunk két példányt, és összehasonlítjuk közöttük a 'salary' attribútumot. Ezt két lépésben tesszük.
- 1. lépés: Hozza létre az objektumtípust és a törzset.
- 2. lépés: Hozz létre egy anonim blokkot az objektumpéldányok összehasonlításához.
1. lépés) Az objektumtípus és a törzs létrehozása.
Az alábbi képernyőképek az emp_object_equality specifikációt és annak törzsét mutatják, amely a salary attribútumot összehasonlító ORDER függvényt definiálja.
CREATE TYPE emp_object_equality AS OBJECT( salary NUMBER, ORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGER); /
CREATE TYPE BODY emp_object_equality AS ORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGER IS BEGIN IF salary<c.salary THEN RETURN -1; ELSIF salary>c.salary THEN RETURN 1; ELSE RETURN 0; END IF; END; END; /
Code Magyarázat:
- Code 1-4. sor: Az 'emp_object_equality' objektumtípus létrehozása 1 attribútummal és 1 taggal.
- Code 6-16. sor: Az ORDER függvény definiálása, amely összehasonlítja a SELF példány és a paraméterpéldány 'salary' attribútumát. Negatív értéket ad vissza, ha a SELF fizetés kisebb, pozitív értéket, ha a SELF fizetés nagyobb, és 0-t, ha a fizetések egyenlőek.
Code output:
Típus létrehozva
2. lépés) Névtelen blokk létrehozása az objektumpéldányok összehasonlításához.
Az alábbi képernyőkép egy anonim blokkot mutat, amely két emp_object_equality példányt hasonlít össze fizetés szerint.
DECLARE l_obj_1 emp_object_equality; l_obj_2 emp_object_equality; BEGIN l_obj_1:=emp_object_equality(15000); l_obj_2:=emp_object_equality(17000); IF l_obj_1.equals(l_obj_2)>0 THEN Dbms_output.put_line('Salary of first instance is greater'); ELSIF l_obj_1.equals(l_obj_2)<0 THEN Dbms_output.put_line('Salary of second instance is greater'); ELSE Dbms_output.put_line('Salaries are equal'); END IF; END; /
teljesítmény
Salary of second instance is greater
Code Magyarázat:
- Code 20. sor: Az 'emp_obj_equality' típusú 'l_obj_1' deklarálása.
- Code 21. sor: Az 'emp_obj_equality' típusú 'l_obj_2' deklarálása.
- Code 23. sor: Az 'l_obj_1' inicializálása '15000' fizetési értékkel.
- Code 24. sor: Az 'l_obj_2' inicializálása '17000' fizetési értékkel.
- Code 25-33. sor: Az üzenet kinyomtatása az ORDER függvény által visszaadott szám alapján.



















