Oracle PL/SQL objektitüüpide õpetus NÄIDETEGA

Mis on objekti tüüp PL/SQL-is?

Objektorienteeritud programmeerimine sobib eriti korduvkasutatavate komponentide ja keerukate rakenduste ehitamiseks. Need on organiseeritud pigem "objektide" kui "toimingute" ümber, st programmid on loodud töötama ja suhtlema kogu objektiga, mitte ühe toiminguga. See kontseptsioon võimaldab programmeerijal sisestada ja töödelda üksikasju objekti olemite tasemel.

Alloleval pildil on näide objektitüübist, milles pangakontot käsitletakse objektiüksusena. Objekti atribuudid hõlmavad asju, millel on teatud atribuutide väärtused, näiteks pangakontol; see on konto number, pangasaldo jne, samas kui objektmeetodid kirjeldavad selliseid asju nagu intressimäära arvutamine, pangaväljavõtte genereerimine jne, mis nõuavad teatud protsessi lõpuleviimist.

Objektitüübid PL/SQL-is

PL/SQL-is põhineb objektorienteeritud programmeerimine objektitüüpidel.

Objektitüüp võib esindada mis tahes reaalset olemit. Selles peatükis käsitleme rohkem objektitüüpe.

Objektitüüpide komponendid

PL / SQL objektitüüp sisaldab peamiselt kahte komponenti.

  1. Näitajad
  2. Liikmed/meetodid

Näitajad

Atribuudid on veerg või väli, kuhu andmed salvestatakse. Iga atribuut vastendatakse andmetüübiga, mis määrab selle atribuudi töötlemise ja salvestustüübi. Atribuut võib olla mis tahes kehtiv PL/SQL andmetüüp, või see võib olla teist tüüpi objekti.

Liikmed/meetodid

Liikmed või meetodid on alamprogrammid, mis on määratletud objektitüübis. Neid ei kasutata andmete salvestamiseks. Neid kasutatakse peamiselt protsessi määratlemiseks objektitüübi sees. Näited andmete valideerimiseks enne objektitüübi sisestamist. Need deklareeritakse objektitüübi jaotises ja määratletakse objektitüübi objektitüübi kehaosas. Objektitüübi kehaosa on valikuline osa. Kui ühtegi liiget pole, ei sisalda objektitüüp kehaosa.

Loo objekt sisse Oracle

Objektitüüpi ei saa luua alamprogrammi tasemel, neid saab luua ainult skeemi tasemel. Kui objekti tüüp on skeemis määratletud, saab seda kasutada ka alamprogrammides. Objekti tüübi saab luua käsuga 'CREATE TYPE'. Tüübi keha saab luua alles pärast selle objektitüübi loomist.

Loo objekt sisse OracleLoo objekt sisse 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;‭
.
.	‬
);
/

Süntaksi selgitus:

  • Ülaltoodud süntaks näitab atribuutidega OBJEKTI ja meetoditega OBJECT-BODY loomist.
  • Meetodid võivad olla ka objekti kehas ülekoormatud.

Deklaratsiooni objektitüübi initsialiseerimine

Nagu teisedki PL/SQL-i komponendid, tuleb ka objektitüübid enne nende programmis kasutamist deklareerida.

Kui objektitüüp on loodud, saab seda kasutada alamprogrammi deklaratiivses osas, et deklareerida selle objektitüübi muutuja.

Kui alamprogrammis deklareeritakse mis tahes muutuja objektitüübina, luuakse käitamise ajal objektitüübi uus eksemplar ja sellele vastloodud eksemplarile saab viidata muutuja nimele. Sel viisil saab üks objektitüüp salvestada erinevatele eksemplaridele mitu väärtust.

Deklaratsiooni objektitüübi initsialiseerimine

DECLARE
<variable_name> <object_type_name>;
BEGIN
.
.
END;
/

Süntaksi selgitus:

  • Ülaltoodud süntaks näitab muutuja deklareerimist objektitüübina deklaratiivses osas.

Kui muutuja on alamprogrammis objektitüübina deklareeritud, on see aatomiliselt null, st kogu objekt ise null. See tuleb lähtestada väärtustega, et neid programmis kasutada. Neid saab lähtestada konstruktorite abil.

Konstruktorid on objekti kaudne meetod, millele saab viidata objektitüübiga sama nimega. Allolev süntaks näitab objektitüübi lähtestamist.

Deklaratsiooni objektitüübi initsialiseerimine

DECLARE
<variable_name> <object_type_name>; 
BEGIN
<variable_name>:=<object_type_name>();
END;
/

Süntaksi selgitus:

  • Ülaltoodud süntaks näitab objektitüübi eksemplari lähtestamist nullväärtusega.
  • Nüüd ei ole objekt ise null, kuna see on lähtestatud, kuid objekti sees olevad atribuudid on nullid, kuna me pole neile atribuutidele väärtusi määranud.

Konstruktorid

Konstruktorid on objekti kaudne meetod, millele saab viidata objektitüübiga sama nimega. Kui objektile viidatakse esimest korda, kutsutakse seda konstruktorit kaudselt.

Nende konstruktori abil saame objekte ka lähtestada. Konstruktorit saab selgesõnaliselt määratleda, defineerides objektitüübi kehas oleva liikme objektitüübi sama nimega.

Näiteks 1: Järgmises näites kavatseme kasutada objektitüübi liiget, et sisestada kirje emp-tabelisse väärtustega ('RRR', 1005, 20000, 1000) ja ('PPP', 1006, 20000, 1001). Kui andmed on sisestatud, kuvame sama objektitüübi liikme abil. Samuti kasutame selgesõnalist konstruktorit, et sisestada teise kirje halduri ID vaikimisi väärtusega 1001.

Teostame selle allolevate sammudega.

  • Step1:
  • Loo objekti tüüp
  • Objekti tüüpi keha
  • 2. samm: anonüümse ploki loomine loodud objektitüübi kutsumiseks emp_no 1005 kaudse konstruktori kaudu.
  • 3. samm: anonüümse ploki loomine loodud objektitüübi kutsumiseks emp_no 1006 eksplitsiitse konstruktori kaudu.

Step 1) Looge objekti tüüp ja objekti tüübi keha

Konstruktorid

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

Konstruktorid

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:
/

Koodi selgitus

  • Koodirida 1-9: 4 atribuudi ja 3 liikmega objektitüübi 'emp_object' loomine. See sisaldab ainult 3 parameetriga konstruktorite määratlust. (Tegelik kaudne konstruktor sisaldab parameetrite arvu, mis on võrdne objektitüübis olevate atribuutide arvuga)
  • Koodirida 10: tüübikeha loomine.
  • Koodirida 11-21: selgesõnalise konstruktori defineerimine. Atribuutidele parameetri väärtuse määramine ja atribuudi 'manager' väärtuse määramine vaikeväärtusega '1001'.
  • Koodirida 22-26: liikme 'insert_records' määratlemine, mille atribuutide väärtused lisatakse tabelisse 'emp'.
  • Koodirida 27-34: liikme 'display_records' määratlemine, milles kuvatakse objektitüübi atribuutide väärtused.

Väljund

Tüüp loodud

Tüüp keha loodud

Step 2) Anonüümse ploki loomine loodud objektitüübi kutsumiseks emp_no 1005 kaudse konstruktori kaudu

Konstruktorid

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;

Koodi selgitus

  • Koodirida 37-45: kirjete sisestamine kaudse konstruktori abil. Väljakutse konstruktorile sisaldab tegelikku atribuutide väärtuste arvu.
  • Koodirida 38: deklareerib guru_emp_det objektitüübiks 'emp_object'.
  • Koodirida 41: Kuvatakse lause 'guru_emp_det.display_records', mida nimetatakse liikmefunktsiooniks 'diplay_records' ja atribuutide väärtused
  • Koodirida 42: Lause „guru_emp_det.insert_records”, mida nimetatakse liikmefunktsiooniks „insert_records”, ja atribuutide väärtused lisatakse tabelisse.

Väljund

Töötaja nimi: RRR

Töötajate arv: 1005

Palk: 20000 XNUMX

Juht: 1000

Step 3) Anonüümse ploki loomine loodud objektitüübi kutsumiseks eksplitsiitse konstruktori abil emp_no 1006 jaoks

Konstruktorid

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

Väljund

Employee Name:PPP 
Employee Number:1006 
Salary:20000 
Manager:1001

Koodi selgitus:

  • Koodirida 46-53: kirjete sisestamine selgesõnalise konstruktori abil.
  • Koodirida 46: deklareerib guru_emp_det objektitüübiks 'emp_object'.
  • Koodirida 50: Kuvatakse avaldus „guru_emp_det.display_records”, mida nimetatakse liikmefunktsiooniks „display_records” ja atribuutide väärtused
  • Koodirida 51: Lause „guru_emp_det.insert_records”, mida nimetatakse liikmefunktsiooniks „insert_records”, ja atribuutide väärtused lisatakse tabelisse.

Pärand objektitüübis

Pärimisatribuut võimaldab alamobjektitüübil pääseda juurde kõikidele superobjektitüübi või ülemobjektitüübi atribuudile ja liikmetele.

Alamobjekti tüüpi nimetatakse pärilikuks objektitüübiks ja superobjekti tüüpi nimetatakse ülemobjektitüübiks. Allolev süntaks näitab, kuidas luua ülem- ja päritud objektitüüpi.

Pärand objektitüübis

CREATE TYPE <object_type_name_parent> AS OBJECT
(
<attribute_l><datatype>,
.
.
)NOT FINAL;
/

Süntaksi selgitus:

  • Ülaltoodud süntaks näitab SUPER-tüübi loomist.

Pärand objektitüübis

CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent>
(
<attribute_l><datatype>,
.
);
/

Süntaksi selgitus:

  • Ülaltoodud süntaks näitab SUB-tüübi loomist. See sisaldab kõiki põhiobjektitüübi liikmeid ja atribuute.

Näide1: Allolevas näites kavatseme kasutada pärimisatribuuti, et sisestada järgmise kirje ("RRR", 1002, 1007) halduri ID-ga kirje "20000".

Käivitame ülaltoodud programmi järgmiste sammudega

  • 1. samm: looge SUPER-tüüp.
  • 2. samm: looge SUB tüüp ja keha.
  • 3. samm: anonüümse ploki loomine SUB-tüübi kutsumiseks.

Step 1) Looge SUPER-tüüp või vanematüüp.

Pärand objektitüübis

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

Koodi selgitus:

  • Koodirida 1-9: 4 atribuudi ja 3 liikmega objektitüübi 'emp_object' loomine. See sisaldab ainult 3 parameetriga konstruktorite määratlust. See on deklareeritud kui 'NOT FINAL', seega on see ematüüp.

Step 2) Loo SUPER-tüübi all SUB-tüüp.

Pärand objektitüübis

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

Koodi selgitus:

  • Koodirida 10-13: Sub_emp_object loomine päritud tüübina koos täiendava ühe atribuudiga 'default_manager' ja liikme protseduuri deklaratsiooniga.
  • Koodirida 14: päritud objektitüübi keha loomine.
  • Koodirida 16-21: Liikmeprotseduuri määratlemine, mis lisab kirjed tabelisse "emp" objektitüübi "SUPER" väärtustega, välja arvatud halduri väärtus. Halduri väärtuse jaoks kasutab see tüübi „SUB” parameetrit „default_manager”.

Step 3) Anonüümse ploki loomine SUB-tüübi kutsumiseks

Pärand objektitüübis

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

Koodi selgitus:

  • Koodirida 25: 'guru_emp_det' deklareerimine tüübiks 'sub_emp_object'.
  • Koodirida 27: objekti initsialiseerimine kaudse konstruktoriga. Konstruktoril on 5 parameetrit (4 atribuuti tüübist PARENT ja 2 atribuuti tüübist SUB). Viimane parameeter (1002) määrab atribuudi default_manager väärtuse
  • Koodirida 28: liikme 'insert_default_mgr' kutsumine, et sisestada konstruktoris edastatud vaikehalduri ID-ga kirjed.

PL/SQL-objektide võrdsus

Samade objektide hulka kuuluvat objekti eksemplari saab võrrelda võrdsuse mõttes. Selleks peab meil objektitüübis olema spetsiaalne meetod nimega 'ORDER' meetod.

See meetod „ORDER” peaks olema funktsioon, mis tagastab numbrilise tüübi. See võtab sisendiks kaks parameetrit (esimene parameeter: iseobjekti eksemplari id, teine ​​parameeter: teise objekti eksemplari id).

Kahe objekti eksemplari ID-d võrreldakse ja tulemus tagastatakse numbriliselt.

  • Positiivne väärtus näitab, et SELF objekti eksemplar on suurem kui teine.
  • Negatiivne väärtus näitab, et SELF objekti eksemplar on väiksem kui teine ​​eksemplar.
  • Null tähistab seda, et SELF objekti eksemplar on võrdne teise eksemplariga.
  • Kui mõni eksemplar on null, tagastab see funktsioon nulli.

PL/SQL-objektide võrdsus

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

Süntaksi selgitus:

  • Ülaltoodud süntaks näitab funktsiooni ORDER, mis tuleb võrdsuse kontrollimiseks lisada tüübi kehasse.
  • Selle funktsiooni parameeter peaks olema sama objektitüübi eksemplar.
  • Ülaltoodud funktsiooni saab kutsuda kui "obj_instants_1.match(obj_instance_2)" ja see avaldis tagastab arvväärtuse, nagu näidatud, kus obj_instance_1 ja obj_instance_2 on objekti_tüübi_nimi eksemplar.

Näide1: Järgmises näites näeme, kuidas võrrelda kahte objekti. Loome kaks eksemplari ja võrdleme nende vahel atribuuti 'palk'. Teeme seda kahes etapis.

  • 1. samm: looge objekti tüüp ja keha.
  • 2. samm: anonüümse ploki loomine, et võrrelda objekti eksemplari.

Step 1) Objekti tüübi ja keha loomine.

PL/SQL-objektide võrdsus

PL/SQL-objektide võrdsus

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

Koodi selgitus:

  • Koodirida 1–4: 1 atribuudi ja 1 liikmega objektitüübi 'emp_object_equality' loomine.
  • Koodirida 6-16: funktsiooni ORDER määratlemine, mis võrdleb SELF eksemplari atribuuti "palk" ja parameetri eksemplari tüüpi. Tagastab negatiivne, kui ISE palk on väiksem, või positiivne, kui ISE palk on suurem, ja 0, kui palgad on võrdsed.

Koodi väljund:

Tüüp loodud

Step 2) Anonüümse ploki loomine, et võrrelda objekti eksemplari.

PL/SQL-objektide võrdsus

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

Väljund

Salary of second instance is greater

Koodi selgitus:

  • Koodirida 20: emp_object_equality tüüpi l_obj_1 deklareerimine.
  • Koodirida 21: emp_object_equality tüüpi l_obj_2 deklareerimine.
  • Koodirida 23: l_obj_1 lähtestamine palga väärtusega '15000'
  • Koodirida 24: l_obj_1 lähtestamine palga väärtusega '17000'
  • Koodirida 25-33: Printige sõnum funktsiooni ORDER tagastamisnumbri alusel.

kokkuvõte

Selles peatükis oleme näinud objektitüüpe ja nende omadusi. Oleme arutanud ka PL/SQL-objektide konstruktoreid, liikmeid, atribuute, pärimist ja võrdsust.