Oracle PL/SQL objektumtípusok bemutatója PÉLDÁVAL
Mi az objektumtípus a PL/SQL-ben?
Az objektum-orientált programozás különösen alkalmas újrafelhasználható komponensek és összetett alkalmazások építésére. Inkább „tárgyak” köré szerveződnek, mint „műveletek”, azaz a programokat úgy tervezték, hogy az egész objektummal működjenek és kölcsönhatásba lépjenek, nem pedig egyetlen művelettel. Ez a koncepció lehetővé teszi a programozó számára, hogy objektum entitások szintjén töltse fel és kezelje a részleteket.
Az alábbi képen látható egy példa arra az objektumtípusra, amelyben a bankszámla objektum entitásnak minősül. Az objektum attribútumok olyan dolgokat tartalmaznak, amelyek bizonyos attribútumértékeket tartalmaznak, például a Bankszámlában; ez a számlaszám, bankegyenleg stb., míg az objektum metódusok olyan dolgokat írnak le, mint például a kamatláb számítása, bankszámlakivonat generálása stb., amelyek bizonyos folyamatokat igényelnek.
A PL/SQL-ben az objektumorientált programozás objektumtípusokon alapul.
Egy objektumtípus bármely valós entitást képviselhet. Ebben a fejezetben további objektumtípusokról fogunk beszélni.
Az objektumtípusok összetevői
PL / SQL Az objektumtípus főként két komponenst tartalmaz.
- Attribútumok
- Tagok/Módszerek
Attribútumok
Az attribútumok az az oszlop vagy mező, amelyben az adatokat tárolják. Minden attribútum hozzá lesz rendelve ahhoz az adattípushoz, amely meghatározza az adott attribútum feldolgozási és tárolási típusát. Az 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 olyan alprogramok, amelyek az objektumtípusban vannak definiálva. Nem használják semmilyen adat tárolására. Főleg az objektumtípuson belüli folyamatok meghatározására szolgálnak. Példák az adatok érvényesítésére az objektumtípus feltöltése előtt. Ezeket az objektumtípus szakaszban deklarálják, és az objektumtípus objektumtípus törzsrészében határozzák meg. Az objektumtípusban a törzsrész nem kötelező rész. Ha nincsenek jelen tagok, akkor az objektumtípus nem tartalmaz testrészt.
Objektum létrehozása Oracle
Objektumtípus nem hozható létre alprogram szinten, csak séma szinten hozható létre. Ha az objektumtípust a sémában definiáltuk, akkor az alprogramokban is használható. Az objektumtípus a 'CREATE TYPE' segítségével hozható létre. A típustörzs csak az objektumtípus létrehozása után hozható létre.
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 az 'OBJECT' attribútumokkal és az 'OBJECT-BODY' metódusokkal való létrehozását mutatja.
- A metódusok az objektumtörzsben is túlterhelhetők.
Nyilatkozat Objektumtípus inicializálása
A PL/SQL többi összetevőjéhez hasonlóan az objektumtípusokat is deklarálni kell, mielőtt azokat a programban használnák.
Az objektumtípus létrehozása után az alprogram deklaratív szakaszában használható az adott objektumtípus változójának deklarálására.
Amikor az alprogramban bármely változó objektumtípusként van deklarálva, futás közben az objektumtípus új példánya jön létre, és erre az újonnan létrehozott példányra hivatkozni lehet a változó nevére. Ily módon egyetlen objektumtípus több értéket is tárolhat különböző példányok alatt.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Szintaxis magyarázata:
- A fenti szintaxis egy változó objektumtípusként való deklarálását mutatja a deklaratív szakaszban.
Miután a változót objektumtípusként deklaráltuk egy alprogramban, atomi nulla lesz, azaz maga az egész objektum nulla lesz. A programban való használathoz értékekkel inicializálni kell. Konstruktorok segítségével inicializálhatók.
A konstruktorok egy objektum implicit metódusai, amelyekre ugyanazzal a névvel lehet hivatkozni, mint az objektumtípusé. Az alábbi szintaxis az objektumtípus 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 objektum típusú példány inicializálását mutatja null értékkel.
- Most maga az objektum nem nulla, ahogyan inicializáltuk, de az objektumon belüli attribútumok nullák lesznek, mivel nem rendeltünk hozzá értékeket ezekhez az attribútumokhoz.
Kivitelezők
A konstruktorok egy objektum implicit metódusai, amelyekre ugyanazzal a névvel lehet hivatkozni, mint az objektumtípusé. Amikor az objektumra először hivatkoznak, ez a konstruktor implicit módon meghívásra kerül.
Ezekkel a konstruktorokkal inicializálhatjuk is az objektumokat. A konstruktor explicit módon definiálható, ha az objektumtípus törzsében a tagot az objektumtípussal azonos néven definiáljuk.
Példa 1: A következő példában az objektumtípus tagot fogjuk használni, hogy beszúrjuk a rekordot az emp táblába ('RRR', 1005, 20000, 1000) és ('PPP', 1006, 20000, 1001). Az adatok beszúrása után ugyanazt fogjuk megjeleníteni az objektumtípus tag használatával. Az explicit konstruktort is használni fogjuk a menedzser azonosítójának alapértelmezés szerint 1001 értékével a második rekordhoz.
Az alábbi lépésekben fogjuk végrehajtani.
- Step1:
- Objektumtípus létrehozása
- Objektum típusú törzs
- 2. lépés: Anonim blokk létrehozása a létrehozott objektumtípus meghívásához az emp_no 1005 implicit konstruktorán keresztül.
- 3. lépés: Anonim blokk létrehozása a létrehozott objektumtípus meghívásához az emp_no 1006 explicit konstruktorán keresztül.
Step 1) Hozzon létre objektumtípust és objektumtípus törzset
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); /
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.managerial:=1001; RETURN; END: MEMBER PROCEDURE insert_records IS BEGIN INSERT INTO emp VALUES(emp_noemp_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: /
Kód Magyarázat
- Kódsor 1-9: 'emp_object' objektumtípus létrehozása 4 attribútummal és 3 taggal. Csak 3 paraméterrel tartalmazza a konstruktorok definícióját. (A tényleges implicit konstruktor annyi paramétert tartalmaz, ahány attribútum található az objektumtípusban)
- 10. kódsor: A típustörzs létrehozása.
- Kódsor 11-21: Az explicit konstruktor meghatározása. A paraméter értékének hozzárendelése az attribútumokhoz, és a 'manager' attribútum értékének hozzárendelése az alapértelmezett '1001' értékkel.
- Kódsor 22-26: Az 'insert_records' tag meghatározása, amelyben az attribútumok értékei bekerülnek az 'emp' táblába.
- Kódsor 27-34: A 'display_records' tag meghatározása, amelyben az objektumtípus attribútumainak értékei megjelennek.
teljesítmény
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
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;
Kód Magyarázat
- Kódsor 37-45: Rekordok beszúrása az implicit konstruktor segítségével. A konstruktor hívása az attribútumértékek tényleges számát tartalmazza.
- 38. kódsor: A guru_emp_det 'emp_object' objektumtípusként deklarálja.
- 41. kódsor: A 'guru_emp_det.display_records' utasítás, a 'diplay_records' tagfüggvény és az attribútumok értékei jelennek meg
- 42. kódsor: A 'guru_emp_det.insert_records' utasítás, az úgynevezett 'insert_records' tagfüggvény, és az attribútumértékek bekerülnek a táblázatba.
teljesítmény
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
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
Kód magyarázata:
- Kódsor 46-53: Rekordok beszúrása az explicit konstruktor használatával.
- 46. kódsor: A guru_emp_det 'emp_object' objektumtípusként deklarálja.
- 50. kódsor: A 'guru_emp_det.display_records' utasítás, a 'display_records' tagfüggvény és az attribútumértékek megjelennek
- 51. kódsor: A 'guru_emp_det.insert_records' utasítás, az úgynevezett 'insert_records' tagfüggvény, és az attribútumértékek bekerülnek a táblázatba.
Öröklődés objektumtípusban
Az öröklődés tulajdonság lehetővé teszi, hogy az alobjektumtípus hozzáférjen a szuperobjektumtípus vagy a szülőobjektumtípus összes attribútumához és tagjához.
Az alobjektum típust örökölt objektumtípusnak, a szuperobjektum típust pedig szülőobjektumtípusnak nevezzük. Az alábbi szintaxis bemutatja a szülő és az örökölt objektumtípus létrehozásának módját.
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.
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. Tartalmazza a szülőobjektumtípus összes tagját és attribútumait.
Example1: Az alábbi példában az inheritance tulajdonságot fogjuk használni az '1002' kezelőazonosítójú rekord beszúrására a következő rekordhoz ('RRR', 1007, 20000).
A fenti programot a következő lépésekben fogjuk végrehajtani
- 1. lépés: Hozzon létre SUPER típust.
- 2. lépés: Hozzon létre SUB típust és törzset.
- 3. lépés: Névtelen blokk létrehozása a SUB típus hívásához.
Step 1) Hozzon létre SUPER típust vagy szülőtípust.
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; /
Kód magyarázata:
- Kódsor 1-9: 'emp_object' objektumtípus létrehozása 4 attribútummal és 3 taggal. Csak 3 paraméterrel tartalmazza a konstruktorok definícióját. 'NOT FINAL'-ként lett deklarálva, tehát szülőtípus.
Step 2) Hozzon létre SUB típust a SUPER típus alatt.
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; /
Kód magyarázata:
- Kódsor 10-13: A sub_emp_object létrehozása örökölt típusként további egy 'default_manager' attribútummal és tag eljárás deklarációval.
- 14. kódsor: Az örökölt objektumtípus törzsének létrehozása.
- 1. kódsor6-21: A tag eljárás meghatározása, amely beszúrja a rekordokat az „emp” táblába a „SUPER” objektumtípus értékeivel, kivéve a menedzser értéket. A menedzser értékéhez a „SUB” típusból származó „default_manager” értéket használja.
Step 3) Névtelen blokk létrehozása a SUB típus hívásához
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; /
Kód magyarázata:
- 25. kódsor: A 'guru_emp_det' deklarálása 'sub_emp_object' típusként.
- 27. kódsor: Az objektum inicializálása az implicit konstruktorral. A konstruktor 5 paraméterrel rendelkezik (4 attribútum a PARENT típusból és 2 attribútum a SUB típusból). Az utolsó paraméter (1002) határozza meg a default_manager attribútum értékét
- 28. kódsor: Az 'insert_default_mgr' tag meghívása a rekordok beszúrásához a konstruktorban átadott alapértelmezett kezelői azonosítóval.
A PL/SQL objektumok egyenlősége
Az azonos objektumokhoz tartozó objektumpéldány összehasonlítható az egyenlőség szempontjából. Ehhez szükségünk van egy speciális metódusra az 'ORDER' metódus nevű objektumtípusban.
Ennek az „ORDER” metódusnak kell a numerikus típust visszaadó függvénynek lennie. Bemenetként két paramétert vesz fel (első paraméter: a saját objektum példány id, második paraméter: egy másik objektumpéldány id).
A két objektumpéldány azonosítóját összehasonlítja, és az eredményt numerikus formában adja vissza.
- A pozitív érték azt jelenti, hogy a SELF objektumpéldány nagyobb, mint egy másik példány.
- A negatív érték azt jelenti, hogy a SELF objektumpéldány kisebb, mint egy másik példány.
- A nulla azt jelenti, hogy a SELF objektumpéldány egyenlő egy másik példánysal.
- Ha bármelyik példány nulla, akkor ez a függvény null értékkel tér vissza.
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éséhez.
- A függvény paraméterének azonos objektumtípusú példánynak kell lennie.
- A fenti függvény meghívható „obj_példány_1.match(obj_példány_2)” néven, és ez a kifejezés a képen látható számértéket adja vissza, ahol az obj_példány_1 és obj_példány_2 az objektum_típus_neve példánya.
Example1: A következő példában látni fogjuk, hogyan lehet két objektumot összehasonlítani. Létre fogunk hozni két példányt, és össze fogjuk hasonlítani közöttük a „fizetés” attribútumot. Két lépésben fogunk tenni.
- 1. lépés: Az objektum típusának és törzsének létrehozása.
- 2. lépés: A névtelen blokk létrehozása az objektumpéldány hívásához.
Step 1) Az objektum típusának és törzsének létrehozása.
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; /
Kód magyarázata:
- 1-4. kódsor: 'emp_object_equality' objektumtípus létrehozása 1 attribútummal és 1 taggal.
- Kódsor 6-16: Az ORDER függvény meghatározása, amely összehasonlítja a SELF példány 'fizetése' attribútuma és a paraméterpéldány típusa. Negatív eredményt ad, ha az ÖN fizetése kisebb, vagy pozitív, ha az ÖN fizetése nagyobb, és 0, ha a fizetések egyenlőek.
Kód kimenet:
Típus létrehozva
Step 2) A névtelen blokk létrehozása az objektumpéldány összehasonlításához.
DECLARE l_obj_l emp_object_equality; l_obj_2 emp_object_equality; BEGIN l_obj_l:=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_l.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
Kód magyarázata:
- 20. kódsor: Az emp_object_equality típusú l_obj_1 deklarálása.
- 21. kódsor: Az emp_object_equality típusú l_obj_2 deklarálása.
- 23. kódsor: l_obj_1 inicializálása "15000" fizetési értékkel
- 24. kódsor: l_obj_1 inicializálása "17000" fizetési értékkel
- Kódsor 25-33: Nyomtassa ki az üzenetet az ORDER függvény visszatérési száma alapján.
Összegzésként
Ebben a fejezetben az objektumtípusokat és azok tulajdonságait láthattuk. A konstruktorokról, a tagokról, az attribútumokról, az öröklődésről és az egyenlőségről is beszéltünk a PL/SQL objektumokban.