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.

Objektityypit PL/SQL:ssä

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.

  1. Ominaisuudet
  2. 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.

Luo objekti sisään OracleLuo objekti sisään 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;‭
.
.	‬
);
/

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.

Ilmoitus objektityypin alustus

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.

Ilmoitus objektityypin alustus

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

Rakentajat

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

Rakentajat

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

Rakentajat

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

Rakentajat

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.

Objektityypin periytyminen

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

Syntaksiselitys:

  • Yllä oleva syntaksi näyttää SUPER-tyypin luomisen.

Objektityypin periytyminen

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.

Objektityypin periytyminen

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.

Objektityypin periytyminen

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

Objektityypin periytyminen

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.

PL/SQL-objektien tasa-arvo

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.

PL/SQL-objektien tasa-arvo

PL/SQL-objektien tasa-arvo

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.

PL/SQL-objektien tasa-arvo

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.