Oracle PL/SQL-objektityypit: CREATE TYPE esimerkkeineen
⚡ Älykäs yhteenveto
PL/SQL:n objektityypit tuovat olio-ohjelmoinnin Oracle, joiden avulla voit mallintaa reaalimaailman entiteettejä attribuuttien ja metodien avulla. Ne tukevat konstruktoreita, periytymistä ja yhtäläisyysvertailua, joten yksi skeematason tyyppi voi tallentaa ja käsitellä strukturoitua dataa.
Mikä on objektityyppi PL/SQL:ssä?
Olio-ohjelmointi sopii erityisesti uudelleenkäytettävien komponenttien ja monimutkaisten sovellusten rakentamiseen. Ohjelmat on järjestetty "objektien" eikä "toimintojen" ympärille; toisin sanoen ne on suunniteltu toimimaan ja olemaan vuorovaikutuksessa koko objektin kanssa yksittäisen toiminnon sijaan. Tämä lähestymistapa antaa ohjelmoijan täyttää ja käsitellä tietoja objekti-yksikkötasolla.
Alla oleva kuva esittää esimerkkiä objektityypistä, jossa pankkitiliä käsitellään objektiyksikkönä. Objektin attribuutit sisältävät arvoja – pankkitilin tapauksessa näitä ovat tilinumero, pankkisaldo ja niin edelleen – kun taas objektin metodit kuvaavat toimintoja, kuten koron laskemista tai tiliotteen luomista, joista jokainen vaatii prosessin suorittamisen.
In PL / SQLOlio-ohjelmointi perustuu oliotyyppeihin. Oliotyyppi voi edustaa mitä tahansa reaalimaailman oliota. Seuraavissa osioissa tarkastellaan oliotyyppejä, niiden komponentteja sekä niiden luomista ja käyttöä.
Objektityyppien komponentit
PL/SQL-objektityyppi sisältää pääasiassa kaksi komponenttia.
- Ominaisuudet
- Jäsenet/menetelmät
Ominaisuudet
Määritteet ovat sarakkeita tai kenttiä, joihin tiedot tallennetaan. Jokainen määrite on yhdistetty tietotyyppiin, joka määrittää kyseisen määritteen käsittely- ja tallennustyypin. Määrite voi olla mikä tahansa kelvollinen PL/SQL-tietotyyppi, tai se voi olla jotain muuta objektityyppiä.
Jäsenet/menetelmät
Jäsenet eli metodit ovat aliohjelmia määritelty objektityypin sisällä. Niitä ei käytetä datan tallentamiseen; sen sijaan ne määrittelevät objektityypin sisällä suoritettavan prosessoinnin – esimerkiksi datan validoinnin ennen objektin täyttämistä. Ne esitellään objektityypin määrityksessä ja määritellään objektityypin rungossa. Runko on valinnainen: jos jäseniä ei ole, objektityypillä ei ole runko-osaa.
Luo objekti sisään Oracle
Objektityyppiä ei voida luoda aliohjelmatasolla; se voidaan luoda vain skeematasolla. Kun objektityyppi on määritelty skeemassa, sitä voidaan käyttää aliohjelmissa. Objektityyppi luodaan käyttämällä "CREATE TYPE" -lauseketta, ja tyypin runko voidaan luoda vasta, kun sen objektityyppi on olemassa.
Alla olevat kuvakaappaukset näyttävät objektimäärityksen CREATE TYPE -syntaksin ja sen metodit määrittelevän CREATE TYPE BODY -syntaksin.
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; . . ); /
Syntaksiselitys:
- Yllä oleva syntaksi näyttää OBJECT-objektin luomisen attribuuteilla ja OBJECT BODY -objektin luomisen metodeilla.
- Menetelmät voivat myös ylikuormittua objektirungossa.
Ilmoitus objektityypin alustus
Kuten muutkin PL/SQL-komponentit, objektityypit on määriteltävä ennen kuin niitä voidaan käyttää ohjelmassa. Kun objektityyppi on luotu, sitä voidaan käyttää aliohjelman deklaratiivisessa osassa kyseisen objektityypin muuttujan määrittämiseen.
Aina kun muuttuja deklaroidaan objektityypiksi, suorituksen aikana luodaan uusi objektityypin instanssi, ja tähän uuteen instanssiin viitataan muuttujan nimellä. Tällä tavoin yksi objektityyppi voi tallentaa useita arvoja eri instansseihin.
Alla olevassa kuvakaappauksessa näkyy muuttujan deklarointi objektityyppinä objektin sisällä. PL/SQL-lohko.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Syntaksiselitys:
- Yllä oleva syntaksi näyttää a:n deklaroinnin muuttuja objektityyppinä deklaratiivisessa osiossa.
Kun muuttuja on ilmoitettu oliotyypiksi aliohjelmassa, se on atomaarisesti null – koko olio itsessään on null. Se on alustettava arvoilla ennen kuin sitä voidaan käyttää ohjelmassa. Oliot alustetaan konstruktorien avulla.
Konstruktorit ovat objektin implisiittisiä metodeja, joihin voidaan viitata samalla nimellä kuin objektityyppiin. Alla oleva kuvakaappaus näyttää objektityyppi-instanssin alustuksen.
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
Syntaksiselitys:
- Yllä oleva syntaksi näyttää objektityypin instanssin alustuksen null-arvolla.
- Itse objekti ei ole enää null alustuksen jälkeen, mutta objektin sisällä olevat attribuutit pysyvät nullina, kunnes niille annetaan arvot.
Rakentajat
Konstruktorit ovat objektin implisiittisiä metodeja, joihin voidaan viitata samalla nimellä kuin objektityyppiin. Aina kun objektiin viitataan ensimmäistä kertaa, tätä konstruktoria kutsutaan implisiittisesti.
Voit myös alustaa objekteja näiden konstruktorien avulla. Konstruktori voidaan määritellä eksplisiittisesti määrittelemällä objektityypin rungossa jäsen, jolla on sama nimi kuin objektityypillä.
Esimerkki 1: Seuraavassa esimerkissä käytämme objektityyppistä jäsentä lisätäksemme emp-taulukkoon tietueita arvoilla ('RRR', 1005, 20000, 1000) ja ('PPP', 1006, 20000, 1001). Kun tiedot on lisätty, näytämme ne objektityyppisen jäsenen avulla. Käytämme myös eksplisiittistä konstruktoria täyttääksemme manageri-tunnuksen oletusarvolla 1001 toiselle tietueelle.
Toteutamme sen seuraavissa vaiheissa.
- Vaihe 1: Luo objektityyppi ja objektityypin runko.
- Vaihe 2: Luo anonyymi lohko kutsuaksesi objektityyppiä implisiittisen konstruktorin kautta emp_no 1005:lle.
- Vaihe 3: Luo anonyymi lohko kutsuaksesi objektityyppiä emp_no 1006:n eksplisiittisen konstruktorin kautta.
Vaihe 1) Luo objektityyppi ja objektityypin runko.
Alla olevassa kuvakaappauksessa näkyy emp_object-objektityypin määrityksen luonti attribuuteineen ja jäsenineen.
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); /
Alla olevassa kuvakaappauksessa näkyy emp_object-tyypin rungon luonti eksplisiittisellä konstruktorilla ja jäsenproseduureilla.
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 Selitys
- Code rivi 1–9: Luodaan 'emp_object'-objektityyppi, jossa on neljä attribuuttia ja kolme jäsentä. Se sisältää määritelmän konstruktorista, jossa on vain kolme parametria. (Varsinainen implisiittinen konstruktori sisältää yhtä monta parametria kuin objektityypissä on attribuutteja.)
- Code rivi 10: Tyyppirungon luominen.
- Code rivi 11–21: Eksplisiittisen konstruktorin määrittely. Parametriarvojen määritys attribuuteille ja oletusarvon '1001' määritys attribuutille 'manager'.
- Code rivi 22–26: Jäsenen 'insert_records' määrittely, jonka avulla attribuutin arvot lisätään 'emp'-taulukkoon.
- Code rivi 27–34: Jäsenen 'display_records' määrittely, joka näyttää objektityypin attribuuttien arvot.
lähtö:
Tyyppi luotu
Tyyppi runko luotu
Vaihe 2) Luodaan anonyymi lohko kutsumaan luotua objektityyppiä implisiittisen konstruktorin kautta emp_no 1005:lle.
Alla olevassa kuvakaappauksessa näkyy anonyymi lohko, joka kutsuu emp_object-funktiota implisiittisen konstruktorin kautta.
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 Selitys
- Code rivi 37–45: Tietueiden lisääminen implisiittistä konstruktoria käyttäen. Konstruktorin kutsu sisältää attribuuttiarvojen todellisen lukumäärän.
- Code rivi 38: Määrittelee 'guru_emp_det':n objektityypiksi 'emp_object'.
- Code rivi 41: Lause 'guru_emp_det.display_records' kutsuu 'display_records'-jäsentä ja attribuutin arvot näytetään.
- Code rivi 42: Lause 'guru_emp_det.insert_records' kutsuu 'insert_records'-jäsentä ja attribuutin arvot lisätään taulukkoon. Lohko tekee sitten commitin kauppa.
lähtö:
Työntekijän nimi: RRR
Työntekijämäärä: 1005
Palkka: 20000
Johtaja: 1000
Vaihe 3) Luodaan anonyymi lohko kutsumaan luotua objektityyppiä eksplisiittisen konstruktorin kautta emp_no 1006:lle.
Alla olevassa kuvakaappauksessa näkyy anonyymi lohko, joka kutsuu emp_object-funktiota eksplisiittisen konstruktorin kautta kolmella argumentilla.
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; /
ulostulo
Employee Name:PPP Employee Number:1006 Salary:20000 Manager:1001
Code Selitys:
- Code rivi 46–53: Tietueen lisääminen eksplisiittistä konstruktoria käyttäen.
- Code rivi 46: Määrittelee 'guru_emp_det':n objektityypiksi 'emp_object'.
- Code rivi 50: Lause 'guru_emp_det.display_records' kutsuu 'display_records'-jäsentä ja attribuutin arvot näytetään.
- Code rivi 51: Lause 'guru_emp_det.insert_records' kutsuu 'insert_records'-jäsentä ja attribuutin arvot lisätään tauluun. Koska argumentteja annetaan vain kolme, eksplisiittinen konstruktori asettaa managerin tunnukseksi oletusarvon 1001.
Objektityypin periytyminen
Perintäominaisuus sallii aliobjektityypin käyttää kaikkia pääobjektityypin tai pääobjektityypin attribuutteja ja jäseniä.
Aliobjektityyppiä kutsutaan periytyneeksi objektityypiksi ja superobjektityyppiä pääobjektityypiksi. Alla oleva syntaksi näyttää, kuinka pää- ja perityt objektityypit luodaan. Alla oleva kuvakaappaus näyttää päätyypin (SUPER) syntaksin, joka on merkitty NOT FINAL -merkinnällä.
CREATE TYPE <object_type_name_parent> AS OBJECT ( <attribute_l><datatype>, . . )NOT FINAL; /
Syntaksiselitys:
- Yllä oleva syntaksi näyttää SUPER-tyypin luomisen. NOT FINAL -lause mahdollistaa tyypin periytymisen.
Alla olevassa kuvakaappauksessa näkyy UNDER-avainsanalla luotu peritty (SUB) -tyypin syntaksi.
CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent> ( <attribute_l><datatype>, . ); /
Syntaksiselitys:
- Yllä oleva syntaksi näyttää SUB-tyypin luomisen. Se sisältää kaikki pääobjektityypin jäsenet ja attribuutit.
Esimerkki 1: Alla olevassa esimerkissä käytämme periytymisominaisuutta lisätäksemme tietueen, jonka hallinnoijan tunnus on '1002', tietueelle ('RRR', 1007, 20000). Suoritamme ohjelman seuraavissa vaiheissa.
- Vaihe 1: Luo SUPER-tyyppi.
- Vaihe 2: Luo SUB-tyyppi ja runko.
- Vaihe 3: Luo anonyymi lohko SUB-tyypin kutsumiseksi.
Vaihe 1) Luo SUPER-tyyppi tai Parent-tyyppi.
Alla olevassa kuvakaappauksessa näkyy emp_object-supertyypin luonti NOT FINAL -lausekkeella.
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 Selitys:
- Code rivi 1–9: Luodaan 'emp_object'-objektityyppi, jossa on neljä attribuuttia ja kolme jäsentä. Se sisältää määritelmän konstruktorista, jossa on vain kolme parametria. Se on deklaroitu muodossa 'NOT FINAL', joten se on päätyyppi.
Vaihe 2) Luo SUB-tyyppi SUPER-tyypin alle.
Alla olevassa kuvakaappauksessa näkyy peritty sub_emp_object-tyyppi ja sen luotava runko.
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 Selitys:
- Code rivi 10–13: Luodaan peritty tyyppi 'sub_emp_object' yhdellä lisäattribuutilla 'default_manager' ja jäsenproseduurin määrittelyllä.
- Code rivi 14: Perityn objektityypin rungon luominen.
- Code rivi 16–21: Määritellään jäsenproseduuri, joka lisää tietueita 'emp'-taulukkoon SUPER-objektityypin arvoilla, lukuun ottamatta manager-arvoa. Manager-arvolle se käyttää SUB-tyypin 'default_manager'-arvoa.
Vaihe 3) Luodaan anonyymi lohko SUB-tyypin kutsumiseksi.
Alla olevassa kuvakaappauksessa näkyy anonyymi lohko, joka kutsuu SUB-tyyppiä ja lisää oletusarvoisen manageri-tunnuksen.
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 Selitys:
- Code rivi 25: Määritellään 'guru_emp_det' tyypiksi 'sub_emp_object'.
- Code rivi 27: Objektin alustaminen implisiittisellä konstruktorilla. Konstruktorilla on 5 parametria (4 PARENT-tyypin attribuuttia ja 1 SUB-tyypin attribuutti). Viimeinen parametri (1002) määrittää default_manager-attribuutin arvon.
- Code rivi 28: Kutsutaan jäsentä 'insert_default_mgr' lisäämään tietue, jonka konstruktorissa on annettu oletusarvoinen hallinnoijan tunnus.
PL/SQL-objektien tasa-arvo
Samaan objektityyppiin kuuluvia objekti-instansseja voidaan verrata yhtäläisyyden varmistamiseksi. Tätä varten objektityypille tarvitaan erityinen ORDER-metodi.
Tämän ORDER-metodin tulisi olla funktio, joka palauttaa numeerisen tyypin. Se ottaa syötteeksi kaksi parametria (ensimmäinen parametri: itseobjekti-instanssin tunniste; toinen parametri: toisen objekti-instanssin tunniste).
Kahden objekti-instanssin tunnisteita verrataan ja tulos palautetaan numerona.
- Positiivinen arvo osoittaa, että SELF-objekti-instanssi on suurempi kuin toinen instanssi.
- Negatiivinen arvo osoittaa, että SELF-objekti-instanssi on pienempi kuin toinen instanssi.
- Nolla osoittaa, että SELF-objekti-instanssi on yhtä suuri kuin toinen instanssi.
- Jos jompikumpi instanssi on null, funktio palauttaa null-arvon.
Alla olevassa kuvakaappauksessa näkyy ORDER-jäsenfunktion syntaksi, joka on sisällytettävä tyyppirunkoon yhtäsuuruustarkistusta varten.
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; . . ); /
Syntaksiselitys:
- Yllä oleva syntaksi näyttää ORDER-funktion, joka on sisällytettävä tyyppirunkoon yhtäsuuruustarkistusta varten.
- Tämän funktion parametrin tulee olla saman objektityypin esiintymä.
- Funktiota voidaan kutsua muodossa ”obj_instance_1.match(obj_instance_2)”, ja tämä lauseke palauttaa näytetyn numeerisen arvon, jossa obj_instance_1 ja obj_instance_2 ovat objektityypin instansseja.
Esimerkki 1: Seuraavassa esimerkissä vertaamme kahta oliota. Luomme kaksi instanssia ja vertaamme niiden 'salary'-attribuuttia. Teemme tämän kahdessa vaiheessa.
- Vaihe 1: Luo objektityyppi ja runko.
- Vaihe 2: Luo anonyymi lohko objekti-instanssien vertailemiseksi.
Vaihe 1) Objektityypin ja rungon luominen.
Alla olevat kuvakaappaukset näyttävät emp_object_equality-määrityksen ja sen rungon, joka määrittelee ORDER-funktion, joka vertailee salary-attribuuttia.
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 Selitys:
- Code rivi 1–4: Luodaan 'emp_object_equality'-objektityyppi yhdellä attribuutilla ja yhdellä jäsenellä.
- Code rivi 6–16: Määritellään ORDER-funktio, joka vertaa SELF-instanssin ja parametri-instanssin 'salary'-attribuuttia. Se palauttaa negatiivisen arvon, jos SELF-palkka on pienempi, positiivisen arvon, jos SELF-palkka on suurempi, ja 0, jos palkat ovat yhtä suuret.
Code lähtö:
Tyyppi luotu
Vaihe 2) Anonyymin lohkon luominen objekti-instanssien vertailemiseksi.
Alla olevassa kuvakaappauksessa näkyy anonyymi lohko, joka vertaa kahta emp_object_equality-instanssia palkan mukaan.
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; /
ulostulo
Salary of second instance is greater
Code Selitys:
- Code rivi 20: Määritellään 'l_obj_1', jonka tyyppi on 'emp_object_equality'.
- Code rivi 21: Määritellään 'l_obj_2', jonka tyyppi on 'emp_object_equality'.
- Code rivi 23: Alustataan 'l_obj_1' palkka-arvolla '15000'.
- Code rivi 24: Alustataan 'l_obj_2' palkka-arvolla '17000'.
- Code rivi 25–33: Viestin tulostaminen ORDER-funktion palauttaman luvun perusteella.



















