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.

Objektumtípusok PL/SQL-ben

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.

  1. Attribútumok
  2. 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.

Objektum létrehozása OracleObjektum létrehozása Oracle

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.

Nyilatkozat Objektumtípus inicializálása

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.

Nyilatkozat Objektumtípus inicializálása

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

Kivitelezők

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

Kivitelezők

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

Kivitelezők

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

Kivitelezők

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.

Öröklődés objektumtípusban

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.

Öröklődés objektumtípusban

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.

Öröklődés objektumtípusban

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.

Öröklődés objektumtípusban

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

Öröklődés objektumtípusban

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.

A PL/SQL objektumok egyenlősége

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.

A PL/SQL objektumok egyenlősége

A PL/SQL objektumok egyenlősége

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.

A PL/SQL objektumok egyenlősége

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.