Oracle PL/SQL-objektityyppien opetusohjelma ESIMERKKEJÄ
Mikä on objektityyppi PL/SQL:ssä?
Olio-ohjelmointi soveltuu erityisesti uudelleenkäytettävien komponenttien ja monimutkaisten sovellusten rakentamiseen. Ne on järjestetty "objektien" eikä "toimintojen" ympärille, eli ohjelmat on suunniteltu toimimaan ja olemaan vuorovaikutuksessa koko kohteen kanssa yksittäisen toiminnon sijaan. Tämän konseptin avulla ohjelmoija voi täyttää ja käsitellä yksityiskohtia objektien entiteettien tasolla.
Alla olevassa kuvassa on esimerkki objektityypistä, jossa pankkitiliä pidetään objektikokonaisuudena. Objektiattribuutit sisältävät asioita, joilla on joitain attribuuttiarvoja, esimerkiksi pankkitilillä; se on tilinumero, pankkisaldo jne., kun taas objektimenetelmät kuvaavat asioita, kuten koron laskeminen, tiliotteen luominen jne., jotka edellyttävät tietyn prosessin suorittamista.
PL/SQL:ssä olio-ohjelmointi perustuu oliotyyppeihin.
Objektityyppi voi edustaa mitä tahansa reaalimaailman kokonaisuutta. Aiomme käsitellä muita objektityyppejä tässä luvussa.
Objektityyppien komponentit
PL / SQL objektityyppi sisältää pääasiassa kaksi komponenttia.
- Ominaisuudet
- Jäsenet/menetelmät
Ominaisuudet
Attribuutit ovat sarake tai kenttä, johon tiedot tallennetaan. Jokainen attribuutti yhdistetään tietotyyppiin, joka määrittää kyseisen määritteen käsittely- ja tallennustyypin. Attribuutti voi olla mikä tahansa kelvollinen PL/SQL-tietotyyppi, tai se voi olla jotain muuta objektityyppiä.
Jäsenet/menetelmät
Jäsenet tai menetelmät ovat aliohjelmia, jotka on määritelty objektityypissä. Niitä ei käytetä minkään tiedon tallentamiseen. Niitä käytetään pääasiassa määrittämään prosessi objektityypin sisällä. Esimerkkejä tietojen vahvistamisesta ennen objektityypin täyttämistä. Ne ilmoitetaan objektityyppi-osiossa ja määritellään objektityypin objektityypin runko-osassa. Objektityypin runko-osa on valinnainen osa. Jos jäseniä ei ole, objektityyppi ei sisällä kehon osaa.
Luo objekti sisään Oracle
Objektityyppiä ei voi luoda aliohjelmatasolla, ne voidaan luoda vain skeematasolla. Kun objektityyppi on määritetty skeemassa, sitä voidaan käyttää aliohjelmissa. Objektityyppi voidaan luoda käyttämällä 'CREATE TYPE' -komentoa. Tyyppirunko voidaan luoda vasta sen objektityypin luomisen jälkeen.
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:n luomisen attribuutteilla ja OBJECT-BODY:n luomisen menetelmillä.
- Menetelmät voivat myös ylikuormittua objektirungossa.
Ilmoitus objektityypin alustus
Kuten muutkin PL/SQL:n komponentit, myös objektityypit on ilmoitettava ennen niiden käyttöä ohjelmassa.
Kun objektityyppi on luotu, sitä voidaan käyttää aliohjelman deklaratiivisessa osassa ilmoittamaan kyseisen objektityypin muuttuja.
Aina kun jokin muuttuja on ilmoitettu aliohjelmassa objektityypiksi, ajon aikana luodaan objektityypin uusi ilmentymä, ja tähän äskettäin luotuun ilmentymään voidaan viitata muuttujan nimeen. Tällä tavalla yksi objektityyppi voi tallentaa useita arvoja eri instanssiin.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Syntaksiselitys:
- Yllä oleva syntaksi näyttää muuttujan ilmoituksen objektityyppinä deklaratiivisessa osassa.
Kun muuttuja on ilmoitettu objektityypiksi aliohjelmassa, se on atomisesti nolla eli koko objekti itsessään on nolla. Se on alustettava arvoilla, jotta niitä voidaan käyttää ohjelmassa. Ne voidaan alustaa konstruktorien avulla.
Konstruktorit ovat objektin implisiittinen menetelmä, johon voidaan viitata samalla nimellä kuin objektityypin. Alla oleva syntaksi näyttää objektityypin alustuksen.
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
Syntaksiselitys:
- Yllä oleva syntaksi näyttää objektityypin ilmentymän alustamisen nolla-arvolla.
- Nyt itse objekti ei ole tyhjä, koska se on alustettu, mutta objektin sisällä olevat attribuutit ovat nolla, koska emme ole antaneet arvoja näille attribuuteille.
Rakentajat
Konstruktorit ovat objektin implisiittinen menetelmä, johon voidaan viitata samalla nimellä kuin objektityypin. Aina kun objektiin viitataan ensimmäistä kertaa, tätä konstruktoria kutsutaan implisiittisesti.
Voimme myös alustaa objektit käyttämällä näitä konstruktoria. Konstruktori voidaan määritellä eksplisiittisesti määrittämällä objektityypin bodyssa oleva jäsen samalla nimellä kuin objektityyppi.
Esimerkki 1: Seuraavassa esimerkissä aiomme lisätä tietueen emp-taulukkoon arvoilla ('RRR', 1005, 20000, 1000) ja ('PPP', 1006, 20000, 1001) objektityypin jäsenellä. Kun tiedot on lisätty, näytämme saman käyttämällä objektityypin jäsentä. Aiomme myös käyttää eksplisiittistä konstruktoria täyttämään johtajan tunnuksen oletusarvoisesti arvolla 1001 toiselle tietueelle.
Aiomme suorittaa sen alla olevilla vaiheilla.
- Step1:
- Luo objektityyppi
- Objektityyppinen runko
- Vaihe 2: Anonyymin lohkon luominen luodun objektityypin kutsumiseksi implisiittisen konstruktorin avulla emp_no 1005:lle.
- Vaihe 3: Anonyymin lohkon luominen luodun objektityypin kutsumiseksi eksplisiittisellä konstruktorilla emp_no 1006:lle.
Vaihe 1) Luo objektityyppi ja objektityypin runko
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: /
Koodin selitys
- Koodirivi 1-9: Luodaan 'emp_object' -objektityyppi, jossa on 4 attribuuttia ja 3 jäsentä. Se sisältää rakentajien määritelmän, jossa on vain 3 parametria. (Todellinen implisiittinen konstruktori sisältää määrän parametreja, jotka vastaavat objektityypissä olevien attribuuttien määrää)
- Koodirivi 10: Luodaan tyyppirunko.
- Koodirivi 11-21: Eksplisiittisen konstruktorin määrittäminen. Parametrin arvon määrittäminen attribuuteille ja arvon määrittäminen attribuutille 'manager' oletusarvolla '1001'.
- Koodirivi 22-26: Määrittelee jäsen 'insert_records', jossa attribuuttien arvot lisätään 'emp'-taulukkoon.
- Koodirivi 27-34: Määrittelee jäsen "display_records", jossa näytetään objektityypin attribuuttien arvot.
ulostulo
Tyyppi luotu
Tyyppi runko luotu
Vaihe 2) Anonyymin lohkon luominen luodun objektityypin kutsumiseksi implisiittisen konstruktorin avulla emp_no 1005
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;
Koodin selitys
- Koodirivi 37-45: Tietueiden lisääminen käyttämällä implisiittistä konstruktoria. Kutsu konstruktoriin sisältää todellisen attribuuttiarvojen määrän.
- Koodirivi 38: Ilmoittaa guru_emp_det objektityypiksi 'emp_object'.
- Koodirivi 41: Lause "guru_emp_det.display_records", jota kutsutaan "diplay_records" -jäsenfunktioksi, ja attribuuttien arvot näytetään
- Koodirivi 42: Lause "guru_emp_det.insert_records", jota kutsutaan "insert_records" -jäsenfunktioksi, ja attribuuttien arvot lisätään taulukkoon.
ulostulo
Työntekijän nimi: RRR
Työntekijämäärä: 1005
Palkka: 20000
Johtaja: 1000
Vaihe 3) Anonyymin lohkon luominen luodun objektityypin kutsumiseksi eksplisiittisellä konstruktorilla emp_no 1006
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
Koodin selitys:
- Koodirivi 46-53: Tietueiden lisääminen eksplisiittisellä rakentajalla.
- Koodirivi 46: Ilmoittaa guru_emp_det objektityypiksi 'emp_object'.
- Koodirivi 50: Lause "guru_emp_det.display_records", jota kutsutaan "display_records" -jäsenfunktioksi, ja attribuuttien arvot näytetään
- Koodirivi 51: Lause "guru_emp_det.insert_records", jota kutsutaan "insert_records" -jäsenfunktioksi, ja attribuuttien arvot lisätään taulukkoon.
Objektityypin periytyminen
Periytysominaisuus sallii aliobjektityypin käyttää kaikkia superobjektityypin tai pääobjektityypin attribuutteja ja jäseniä.
Aliobjektityyppiä kutsutaan perityksi objektityypiksi ja superobjektityyppiä emoobjektityypiksi. Alla oleva syntaksi näyttää, kuinka luodaan ylätason ja peritty objektityyppi.
CREATE TYPE <object_type_name_parent> AS OBJECT ( <attribute_l><datatype>, . . )NOT FINAL; /
Syntaksiselitys:
- Yllä oleva syntaksi näyttää SUPER-tyypin luomisen.
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 jäsenet ja attribuutit pääobjektityypistä.
Esimerkki1: Alla olevassa esimerkissä aiomme käyttää inheritance-ominaisuutta lisätäksesi tietueen, jonka manageri-tunnus on '1002' seuraavalle tietueelle ('RRR', 1007, 20000).
Aiomme suorittaa yllä olevan ohjelman seuraavissa vaiheissa
- Vaihe 1: Luo SUPER-tyyppi.
- Vaihe 2: Luo SUB-tyyppi ja runko.
- Vaihe 3: Anonyymin lohkon luominen SUB-tyypin kutsumiseksi.
Vaihe 1) Luo SUPER-tyyppi tai vanhempi tyyppi.
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; /
Koodin selitys:
- Koodirivi 1-9: Luodaan 'emp_object' -objektityyppi, jossa on 4 attribuuttia ja 3 jäsentä. Se sisältää rakentajien määritelmän, jossa on vain 3 parametria. Se on ilmoitettu 'NOT FINAL'iksi, joten se on päätyyppi.
Vaihe 2) Luo SUB-tyyppi kohtaan SUPER-tyyppi.
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; /
Koodin selitys:
- Koodirivi 10-13: Sub_emp_objectin luominen periytyväksi tyypiksi, jossa on yksi lisäattribuutti 'default_manager' ja jäsenmenettelyn ilmoitus.
- Koodirivi 14: Luodaan rungon peritylle objektityypille.
- Koodirivi 16-21: Jäsenproseduurin määrittäminen, joka lisää tietueita "emp"-taulukkoon SUPER-objektityypin arvoilla, paitsi johtajan arvolla. Hallinnoijan arvona se käyttää tyypin SUB-tyyppiä olevaa 'default_manager'.
Vaihe 3) Luodaan anonyymi lohko SUB-tyypin kutsumiseksi
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; /
Koodin selitys:
- Koodirivi 25: Määritetään 'guru_emp_det' 'sub_emp_object' -tyypiksi.
- Koodirivi 27: Objektin alustaminen implisiittisellä konstruktorilla. Konstruktorissa on 5 parametria (4 attribuuttia PARENT-tyypistä ja 2 attribuuttia SUB-tyypistä). Viimeinen parametri (1002) määrittää oletushallinta-attribuutin arvon
- Koodirivi 28: Kutsuminen jäsenelle "insert_default_mgr" lisäämään tietueet, joiden oletushallintatunnus on konstruktorissa välitetty.
PL/SQL-objektien tasa-arvo
Samoihin objekteihin kuuluvaa objektiinstanssia voidaan verrata tasa-arvoon. Tätä varten meillä on oltava kohdetyypissä erityinen menetelmä nimeltä 'ORDER'-metodi.
Tämän ORDER-menetelmän tulee olla funktio, joka palauttaa numeerisen tyypin. Se ottaa syötteenä kaksi parametria (ensimmäinen parametri: itseobjektin ilmentymän id, toinen parametri: toisen objektiinstanssin id).
Kahden objektiinstanssin id:tä verrataan ja tulos palautetaan numeerisena.
- Positiivinen arvo tarkoittaa, että SELF-objektin ilmentymä on suurempi kuin toinen ilmentymä.
- Negatiivinen arvo tarkoittaa, että SELF-objektin ilmentymä on pienempi kuin toinen ilmentymä.
- Nolla tarkoittaa, että SELF-objektin ilmentymä on sama kuin toinen ilmentymä.
- Jos jokin esiintymistä on tyhjä, tämä funktio palauttaa tyhjän.
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 tasa-arvon tarkistamista varten.
- Tämän funktion parametrin tulee olla saman objektityypin esiintymä.
- Yllä olevaa funktiota voidaan kutsua nimellä "obj_esiintymä_1.match(obj_esiintymä_2)", ja tämä lauseke palauttaa numeerisen arvon kuvan mukaisesti, jossa obj_esiintymä_1 ja obj_esiintymä_2 ovat objektin_tyypin_nimi esiintymä.
Example1: Seuraavassa esimerkissä aiomme nähdä kuinka vertailla kahta objektia. Aiomme luoda kaksi esiintymää ja vertailla attribuuttia "palkka" niiden välillä. Aiomme tehdä kahdessa vaiheessa.
- Vaihe 1: Luo objektityyppi ja runko.
- Vaihe 2: Anonyymin lohkon luominen vertailemaan objektiinstanssia.
Vaihe 1) Objektityypin ja rungon luominen.
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; /
Koodin selitys:
- Koodirivit 1-4: Luodaan objektityyppiä 'emp_object_equality', jossa on 1 attribuutti ja 1 jäsen.
- Koodirivi 6-16: Määrittää ORDER-funktion, joka vertaa SELF-ilmentymän palkka-attribuuttia ja parametri-ilmentymän tyyppiä. Se palauttaa negatiivisen, jos ITSENÄINEN palkka on pienempi tai positiivinen, jos ITSENÄINEN palkka on suurempi ja 0, jos palkat ovat samat.
Koodilähtö:
Tyyppi luotu
Vaihe 2) Anonyymin lohkon luominen vertaa objektiinstanssia.
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; /
ulostulo
Salary of second instance is greater
Koodin selitys:
- Koodirivi 20: emp_object_equality-tyypin l_obj_1:n ilmoittaminen.
- Koodirivi 21: emp_object_equality-tyypin l_obj_2:n ilmoittaminen.
- Koodirivi 23: Alustetaan l_obj_1 palkan arvolla "15000"
- Koodirivi 24: Alustetaan l_obj_1 palkan arvolla "17000"
- Koodirivi 25-33: Tulosta viesti TILAA-toiminnon palautusnumeron perusteella.
Yhteenveto
Tässä luvussa olemme nähneet objektityypin ja niiden ominaisuudet. Olemme myös keskustelleet rakentajista, jäsenistä, attribuuteista, perinnöstä ja tasa-arvosta PL/SQL-objekteissa.