Oracle PL/SQL objektitüübid: CREATE TYPE koos näidetega
⚡ Nutikas kokkuvõte
PL/SQL-i objektitüübid toovad objektorienteeritud programmeerimise Oracle, mis võimaldab teil modelleerida reaalse maailma üksusi atribuutide ja meetodite abil. Need toetavad konstruktoreid, pärimist ja võrdsuse võrdlust, seega saab üks skeemitaseme tüüp salvestada ja töödelda struktureeritud andmeid.
Mis on objekti tüüp PL/SQL-is?
Objektorienteeritud programmeerimine sobib eriti hästi korduvkasutatavate komponentide ja keerukate rakenduste loomiseks. Programmid on korraldatud pigem "objektide" kui "toimingute" ümber; see tähendab, et need on loodud töötama ja suhtlema terve objektiga, mitte ühe toiminguga. See lähenemisviis võimaldab programmeerijal täita ja manipuleerida detaile objekti-üksuse tasandil.
Allolev pilt kujutab näidet objektitüübist, kus pangakontot käsitletakse objektiüksusena. Objekti atribuudid hoiavad väärtusi – pangakonto puhul on need kontonumber, pangajääk jne –, samas kui objektimeetodid kirjeldavad toiminguid, näiteks intressimäära arvutamist või pangaväljavõtte genereerimist, millest igaüks nõuab protsessi läbimist.
In PL / SQLObjektorienteeritud programmeerimine põhineb objektitüüpidel. Objektitüüp võib esindada mis tahes reaalse maailma üksust. Allpool olevad jaotised uurivad objektitüüpe, nende komponente ning seda, kuidas neid luua ja kasutada.
Objektitüüpide komponendid
PL/SQL objektitüüp sisaldab peamiselt kahte komponenti.
- Näitajad
- Liikmed/meetodid
Näitajad
Atribuudid on veerud või väljad, kuhu andmeid salvestatakse. Iga atribuut on seotud andmetüübiga, mis määrab selle atribuudi töötlemis- 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 ehk meetodid on alamprogrammid on määratletud objektitüübi sees. Neid ei kasutata andmete salvestamiseks; selle asemel defineerivad nad objektitüübi sees teostatavat töötlemist – näiteks andmete valideerimist enne objekti täitmist. Need deklareeritakse objektitüübi spetsifikatsioonis ja defineeritakse objektitüübi kehas. Keha on valikuline: kui liikmeid pole, siis objektitüübil kehaosa puudub.
Loo objekt sisse Oracle
Objektitüüpi ei saa luua alamprogrammi tasandil; seda saab luua ainult skeemi tasandil. Kui objektitüüp on skeemis defineeritud, saab seda alamprogrammides kasutada. Objektitüüp luuakse käsuga „CREATE TYPE” ja tüübi põhiosa saab luua alles pärast seda, kui selle objektitüüp on olemas.
Allolevad ekraanipildid näitavad objektispetsifikatsiooni CREATE TYPE süntaksit ja CREATE TYPE BODY süntaksit, mis määratleb selle meetodid.
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 objekti OBJECT loomist atribuutidega ja objekti BOJECT BODY loomist meetoditega.
- Meetodid võivad olla ka objekti kehas ülekoormatud.
Deklaratsiooni objektitüübi initsialiseerimine
Nagu teisedki PL/SQL-i komponendid, tuleb objektitüübid enne programmis kasutamist deklareerida. Kui objektitüüp on loodud, saab seda alamprogrammi deklaratiivses osas kasutada selle objektitüübi muutuja deklareerimiseks.
Alati, kui muutuja deklareeritakse objektitüübina, luuakse käitusajal objektitüübi uus eksemplar ja sellele äsja loodud eksemplarile viidatakse muutuja nimega. Sel viisil saab üks objektitüüp salvestada mitu väärtust erinevate eksemplaride all.
Allolev ekraanipilt näitab muutujat, mis deklareeritakse objektitüübina objekti sees. PL/SQL plokk.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Süntaksi selgitus:
- Ülaltoodud süntaks näitab a deklareerimist muutuja objektitüübina deklaratiivses osas.
Kui muutuja on alamprogrammis objektitüübina deklareeritud, on see aatomiliselt null – kogu objekt ise on null. Enne programmis kasutamist tuleb see väärtustega initsialiseerida. Objektid initsialiseeritakse konstruktorite abil.
Konstruktorid on objekti kaudne meetod, millele saab viidata sama nimega mis objektitüüp. Allolev ekraanipilt näitab objektitüübi eksemplari initsialiseerimist.
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
Süntaksi selgitus:
- Ülaltoodud süntaks näitab objektitüübi eksemplari initsialiseerimist nullväärtusega.
- Objekt ise ei ole pärast initsialiseerimist enam null, kuid objekti sees olevad atribuudid jäävad nulliks, kuni neile väärtused määratakse.
Konstruktorid
Konstruktorid on objekti kaudne meetod, millele saab viidata sama nimega, mis objektitüüp. Alati, kui objektile esimest korda viidatakse, kutsutakse seda konstruktorit kaudselt välja.
Samuti saate objekte nende konstruktorite abil initsialiseerida. Konstruktori saab defineerida selgesõnaliselt, defineerides objektitüübi kehas liikme, millel on sama nimi kui objektitüübil.
Näide 1: Järgmises näites kasutame objektitüübi liiget, et lisada emp-tabelisse kirjeid väärtustega ('RRR', 1005, 20000, 1000) ja ('PPP', 1006, 20000, 1001). Kui andmed on sisestatud, kuvame need objektitüübi liikme abil. Samuti kasutame selgesõnalist konstruktorit, et täita halduri ID teise kirje vaikeväärtusega 1001.
Me teostame selle järgmistes etappides.
- 1. samm: looge objektitüüp ja objektitüübi põhitekst.
- 2. samm: looge anonüümne plokk, et kutsuda objektitüüpi emp_no 1005 jaoks implitsiitse konstruktori kaudu.
- 3. samm: looge anonüümne plokk, et kutsuda objektitüüpi emp_no 1006 jaoks selgesõnalise konstruktori kaudu.
1. samm) Looge objektitüüp ja objektitüübi sisu.
Allolev ekraanipilt näitab emp_object objektitüübi spetsifikatsiooni loomist koos selle atribuutide ja liikmetega.
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); /
Allolev ekraanipilt näitab emp_object tüübi keha loomist selgesõnalise konstruktori ja liikmesprotseduuridega.
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 Selgitus
- Code rida 1-9: 'emp_object' objektitüübi loomine 4 atribuudi ja 3 liikmega. See sisaldab konstruktori definitsiooni ainult 3 parameetriga. (Tegelik kaudne konstruktor sisaldab parameetrite arvu, mis võrdub objektitüübis esinevate atribuutide arvuga.)
- Code rida 10: Tüübikeha loomine.
- Code rida 11-21: Eksplitsiitse konstruktori defineerimine. Parameetrite väärtuste määramine atribuutidele ja atribuudile 'manager' vaikeväärtuse '1001' määramine.
- Code rida 22-26: Liikme 'insert_records' defineerimine, mille abil atribuudi väärtused lisatakse tabelisse 'emp'.
- Code rida 27-34: Liikme 'display_records' defineerimine, mis kuvab objektitüübi atribuutide väärtusi.
Väljund:
Tüüp loodud
Tüüp keha loodud
Step 2) Anonüümse ploki loomine loodud objektitüübi kutsumiseks emp_no 1005 jaoks implitsiitse konstruktori kaudu.
Allolev ekraanipilt näitab anonüümset plokki, mis kutsub emp_object funktsiooni läbi implitsiitse konstruktori.
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 Selgitus
- Code rida 37-45: Kirjete sisestamine implitsiitse konstruktori abil. Konstruktori kutsumine sisaldab atribuudiväärtuste tegelikku arvu.
- Code rida 38: Deklareerib 'guru_emp_det' objektitüübina 'emp_object'.
- Code rida 41: Lause 'guru_emp_det.display_records' kutsub esile liikme 'display_records' ja atribuudi väärtused kuvatakse.
- Code rida 42: Lause 'guru_emp_det.insert_records' kutsub esile elemendi 'insert_records' ja atribuudi väärtused lisatakse tabelisse. Seejärel kinnitab plokk tehing.
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 emp_no 1006 jaoks selgesõnalise konstruktori kaudu.
Allolev ekraanipilt näitab anonüümset plokki, mis kutsub emp_object funktsiooni välja selgesõnalise konstruktori kaudu kolme argumendiga.
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
Code Selgitus:
- Code rida 46-53: Kirje sisestamine selgesõnalise konstruktori abil.
- Code rida 46: Deklareerib 'guru_emp_det' objektitüübina 'emp_object'.
- Code rida 50: Lause 'guru_emp_det.display_records' kutsub esile liikme 'display_records' ja atribuudi väärtused kuvatakse.
- Code rida 51: Lause 'guru_emp_det.insert_records' kutsub esile liikme 'insert_records' ja atribuudi väärtused lisatakse tabelisse. Kuna edastatakse ainult kolm argumenti, määrab selgesõnaline konstruktor halduri ID vaikeväärtuseks 1001.
Pärand objektitüübis
Pärimisomadus võimaldab alamobjektitüübil juurde pääseda kõigile ülemobjektitüübi ehk vanemobjektitüübi atribuutidele ja liikmetele.
Alamobjekti tüüpi nimetatakse päritud objektitüübiks ja superobjekti tüüpi nimetatakse vanemobjekti tüübiks. Allolev süntaks näitab, kuidas luua vanem- ja päritud objektitüüpe. Allolev ekraanipilt näitab vanemtüübi (SUPER) süntaksit, mis on märgitud kui NOT FINAL.
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. NOT FINAL klausel võimaldab tüübi pärimist.
Allolev ekraanipilt näitab UNDER märksõnaga loodud päritud (SUB) tüübi süntaksit.
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 ülemobjektitüübi liikmeid ja atribuute.
Näide 1: Allolevas näites kasutame pärandi omadust, et lisada kirje ('RRR', 1007, 20000) jaoks halduri ID-ga '1002' kirje. Programmi käivitatakse järgmiste sammudega.
- 1. samm: looge SUPER-tüüp.
- 2. samm: looge SUB-tüüp ja sisu.
- 3. samm: looge SUB-tüübi kutsumiseks anonüümne plokk.
1. samm) Looge SUPER-tüüp või Parent-tüüp.
Allolev ekraanipilt näitab emp_object supertüübi loomist NOT FINAL klausliga.
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 Selgitus:
- Code rida 1-9: Luuakse objektitüüp 'emp_object' nelja atribuudi ja kolme liikmega. See sisaldab konstruktori definitsiooni ainult kolme parameetriga. See on deklareeritud kui 'NOT FINAL', seega on tegemist vanemtüübiga.
2. samm) Looge SUB tüüp SUPER tüübi alla.
Allolev ekraanipilt näitab päritud tüüpi sub_emp_object ja selle lootavat sisu.
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 Selgitus:
- Code rida 10-13: 'Sub_emp_object' loomine päritud tüübina koos ühe täiendava atribuudiga 'default_manager' ja liikmeprotseduuri deklaratsiooniga.
- Code rida 14: Päritud objektitüübi sisu loomine.
- Code rida 16-21: Liikmesprotseduuri defineerimine, mis lisab kirjed tabelisse 'emp' SUPER objektitüübi väärtustega, välja arvatud halduri väärtus. Halduri väärtuse jaoks kasutatakse SUB tüübi väärtust 'default_manager'.
3. samm) Anonüümse ploki loomine SUB-tüübi kutsumiseks.
Allolev ekraanipilt näitab anonüümset plokki, mis kutsub esile SUB tüübi ja lisab vaikimisi halduri ID.
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 Selgitus:
- Code rida 25: 'guru_emp_det' deklareerimine tüübina 'sub_emp_object'.
- Code rida 27: Objekti initsialiseerimine implitsiitse konstruktoriga. Konstruktoril on 5 parameetrit (4 PARENT tüübi atribuuti ja 1 SUB tüübi atribuut). Viimane parameeter (1002) määrab default_manager atribuudi väärtuse.
- Code rida 28: Liikme 'insert_default_mgr' kutsumine konstruktoris edastatud vaikehalduri ID-ga kirje lisamiseks.
PL/SQL-objektide võrdsus
Samasse objektitüüpi kuuluvate objektide eksemplare saab võrrelda võrdsuse kontrollimiseks. Selleks vajab objektitüüp spetsiaalset meetodit nimega ORDER-meetod.
See ORDER-meetod 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-sid võrreldakse ja tulemus tagastatakse numbrina.
- Positiivne väärtus näitab, et SELF-objekti eksemplar on teisest eksemplarist suurem.
- Negatiivne väärtus näitab, et SELF-objekti eksemplar on teisest eksemplarist väiksem.
- Null näitab, et SELF-objekti eksemplar on teise eksemplariga võrdne.
- Kui kumbki eksemplar on null, tagastab funktsioon nulli.
Allolev ekraanipilt näitab ORDER liikmefunktsiooni süntaksit, mis tuleb võrduskontrolli jaoks tüübikehasse lisada.
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 ORDER-funktsiooni, mis tuleb võrduskontrolli jaoks tüübikehasse lisada.
- Selle funktsiooni parameeter peaks olema sama objektitüübi eksemplar.
- Funktsiooni saab nimetada kujule „obj_instance_1.match(obj_instance_2)“ ja see avaldis tagastab näidatud arvväärtuse, kus obj_instance_1 ja obj_instance_2 on objektitüübi eksemplarid.
Näide 1: Järgmises näites võrdleme kahte objekti. Loome kaks eksemplari ja võrdleme nende vahel atribuuti 'salary'. Teeme seda kahes etapis.
- 1. samm: looge objektitüüp ja sisu.
- 2. samm: looge objekti eksemplaride võrdlemiseks anonüümne plokk.
1. samm) Objekti tüübi ja keha loomine.
Allolevad ekraanipildid näitavad spetsifikatsiooni emp_object_equality ja selle sisu, mis defineerib ORDER-funktsiooni, mis võrdleb palga atribuuti.
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 Selgitus:
- Code rida 1-4: Objektitüübi 'emp_object_equality' loomine ühe atribuudi ja ühe liikmega.
- Code rida 6-16: Defineeritakse ORDER-funktsioon, mis võrdleb SELF-eksemplari ja parameetrieksemplari 'salary' atribuuti. See tagastab negatiivse väärtuse, kui SELF-i palk on väiksem, positiivse väärtuse, kui SELF-i palk on suurem, ja 0, kui palgad on võrdsed.
Code Väljund:
Tüüp loodud
2. samm) Anonüümse ploki loomine objekti eksemplaride võrdlemiseks.
Allolev ekraanipilt näitab anonüümset plokki, mis võrdleb kahte emp_object_equality eksemplari palga järgi.
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; /
Väljund
Salary of second instance is greater
Code Selgitus:
- Code rida 20: Deklareeritakse 'l_obj_1' tüübiga 'emp_object_equality'.
- Code rida 21: Deklareeritakse 'l_obj_2' tüübiga 'emp_object_equality'.
- Code rida 23: 'l_obj_1' initsialiseeritakse palgaväärtusega '15000'.
- Code rida 24: 'l_obj_2' initsialiseeritakse palgaväärtusega '17000'.
- Code rida 25-33: Sõnumi printimine ORDER-funktsiooni tagastatud numbri põhjal.



















