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.
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.
- Näitajad
- 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.
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.
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.
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
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: /
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
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
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.
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.
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.
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.
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
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.
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.
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.
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.