Oracle Opplæring i PL/SQL-objekttyper med EKSEMPLER
Hva er objekttype i PL/SQL?
Objektorientert programmering er spesielt egnet for å bygge gjenbrukbare komponenter og komplekse applikasjoner. De er organisert rundt "objekter" i stedet for "handlinger", dvs. programmene er designet for å fungere og samhandle med hele objektet i stedet for enkelthandlingen. Dette konseptet lar programmereren fylle ut og manipulere detaljene på objektenhetsnivå.
Bildet nedenfor viser et eksempel på objekttypen der en bankkonto regnes som en objektenhet. Objektattributtene inkluderer ting som har noen attributtverdier, for eksempel i bankkonto; det er kontonummer, banksaldo osv. mens objektmetoder beskriver ting som å beregne rente, generere kontoutskrift osv. som krever at en viss prosess er fullført.
I PL/SQL er objektorientert programmering basert på objekttyper.
En objekttype kan representere en hvilken som helst enhet i den virkelige verden. Vi skal diskutere flere objekttyper i dette kapittelet.
Komponenter av objekttyper
PL / SQL objekttype inneholder hovedsakelig to komponenter.
- attributter
- Medlemmer/metoder
attributter
Attributter er kolonnen eller feltet der data lagres. Hvert attributt vil bli tilordnet til datatypen som definerer behandlings- og lagringstypen for det attributtet. Attributtet kan være gyldig PL/SQL datatype, eller det kan være av en annen objekttype.
Medlemmer/metoder
Medlemmer eller Metoder er underprogrammer som er definert i objekttypen. De brukes ikke til å lagre data. De brukes hovedsakelig til å definere prosess inne i objekttypen. For eksempler på å validere data før du fyller ut objekttypen. De er deklarert i objekttypedelen og definert i objekttypekroppsdelen av objekttypen. Brøddel i objekttype er en valgfri del. Hvis ingen medlemmer er til stede, vil en objekttype ikke inneholde noen kroppsdel.
Lag objekt i Oracle
En objekttype kan ikke opprettes på underprogramnivå, de kan bare opprettes på skjemanivå. Når objekttypen er definert i skjemaet, kan den samme brukes i underprogrammer. Objekttypen kan opprettes ved å bruke 'CREATE TYPE'. Typeteksten kan bare opprettes etter å ha opprettet objekttypen.
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; . . ); /
Syntaks forklaring:
- Syntaksen ovenfor viser opprettelsen av 'OBJECT' med attributter og 'OBJECT-BODY' med metoder.
- Metodene kan også overbelastes i objektkroppen.
Erklæringsinitialisering av objekttype
Som andre komponenter i PL/SQL, er det også nødvendig å deklarere objekttyper før de brukes i programmet.
Når objekttypen er opprettet, kan den brukes i underprogramdeklarasjonsdelen for å erklære en variabel av den objekttypen.
Hver gang en variabel er deklarert i underprogrammet som objekttype, vil en ny forekomst av objekttypen bli opprettet under kjøring, og denne nyopprettede forekomsten kan refereres til variabelnavnet. På denne måten kan en enkelt objekttype lagre flere verdier under forskjellige forekomster.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Syntaks forklaring:
- Syntaksen ovenfor viser deklarasjonen av en variabel som en objekttype i den deklarative delen.
Når variabelen er erklært som en objekttype i et underprogram, vil den være atomisk null, dvs. hele objektet i seg selv en null. Det må initialiseres med verdier for å bruke dem i programmet. De kan initialiseres ved hjelp av konstruktører.
Konstruktører er den implisitte metoden til et objekt som kan refereres til med samme navn som objekttypen. Syntaksen nedenfor viser initialiseringen av objekttypen.
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
Syntaks forklaring:
- Syntaksen ovenfor viser initialiseringen av objekttypeforekomsten med en nullverdi.
- Nå er ikke selve objektet null ettersom det har blitt initialisert, men attributtene inne i objektet vil være null da vi ikke har tildelt noen verdier til disse attributtene.
Konstruktører
Konstruktører er den implisitte metoden til et objekt som kan refereres til med samme navn som objekttypen. Når objektet blir referert for første gang, vil denne konstruktøren bli kalt implisitt.
Vi kan også initialisere objektene ved å bruke denne konstruktøren. Konstruktøren kan defineres eksplisitt ved å definere medlemmet i objekttypekroppen med samme navn som objekttypen.
Eksempel 1: I det følgende eksempelet skal vi bruke objekttypemedlemmet til å sette inn posten i emp-tabellen med verdier ('RRR', 1005, 20000, 1000) og ('PPP', 1006, 20000, 1001). Når dataene er satt inn, skal vi vise det samme ved å bruke objekttypemedlem. Vi kommer også til å bruke den eksplisitte konstruktøren til å fylle ut manager-IDen som standard med 1001-verdien for den andre posten.
Vi skal utføre det i trinnene nedenfor.
- Step1:
- Opprett objekttype
- Objekttype kropp
- Trinn 2: Opprette en anonym blokk for å kalle opprettet objekttype gjennom implisitt konstruktør for emp_no 1005.
- Trinn 3: Opprette en anonym blokk for å kalle opprettet objekttype gjennom eksplisitt konstruktør for emp_no 1006.
Trinn 1) Opprett objekttype og objekttypebrødtekst
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: /
Kode Forklaring
- Kodelinje 1-9: Opprette 'emp_object'-objekttypen med 4 attributter og 3 medlemmer. Den inneholder definisjonen av konstruktører med bare 3 parametere. (Faktisk implisitt konstruktør vil inneholde antall parametere lik antall attributter som er tilstede i objekttypen)
- Kodelinje 10: Oppretter tekstteksten.
- Kodelinje 11-21: Definerer den eksplisitte konstruktøren. Tilordne parameterverdien til attributtene og tilordne verdien for attributtet 'manager' med standardverdien '1001'.
- Kodelinje 22-26: Definerer medlemmet 'insert_records' der attributtverdiene settes inn i 'emp'-tabellen.
- Kodelinje 27-34: Definerer medlemmet 'display_records' som viser verdiene til objekttypeattributtene.
Produksjon
Type opprettet
Skriv brødtekst opprettet
Trinn 2) Opprette anonym blokk for å kalle opprettet objekttype gjennom implisitt konstruktør for 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;
Kode Forklaring
- Kodelinje 37-45: Setter inn postene ved å bruke den implisitte konstruktøren. Call to constructor inneholder det faktiske antallet attributtverdier.
- Kodelinje 38: Erklærer guru_emp_det som objekttype for 'emp_object'.
- Kodelinje 41: Utsagn 'guru_emp_det.display_records' kalt 'diplay_records'-medlemsfunksjonen og attributtverdiene vises
- Kodelinje 42: Utsagn 'guru_emp_det.insert_records' kalt 'insert_records'-medlemsfunksjonen og attributtverdiene settes inn i tabellen.
Produksjon
Ansatt navn: RRR
Ansattnummer: 1005
Lønn: 20000
Leder: 1000
Trinn 3) Opprette anonym blokk for å kalle opprettet objekttype gjennom eksplisitt konstruktør for 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; /
Produksjon
Employee Name:PPP Employee Number:1006 Salary:20000 Manager:1001
Kodeforklaring:
- Kodelinje 46-53: Setter inn postene ved å bruke den eksplisitte konstruktøren.
- Kodelinje 46: Erklærer guru_emp_det som objekttype for 'emp_object'.
- Kodelinje 50: Utsagn 'guru_emp_det.display_records' kalt 'display_records'-medlemsfunksjonen og attributtverdiene vises
- Kodelinje 51: Utsagn 'guru_emp_det.insert_records' kalt 'insert_records'-medlemsfunksjonen og attributtverdiene settes inn i tabellen.
Arv i objekttype
Arveegenskap lar subobjekttypen få tilgang til alle attributtene og medlemmene av superobjekttypen eller overordnet objekttype.
Underobjekttypen kalles arvet objekttype, og superobjekttypen kalles overordnet objekttype. Syntaksen nedenfor viser hvordan du oppretter overordnet og arvet objekttype.
CREATE TYPE <object_type_name_parent> AS OBJECT ( <attribute_l><datatype>, . . )NOT FINAL; /
Syntaks forklaring:
- Syntaksen ovenfor viser opprettelsen av SUPER-typen.
CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent> ( <attribute_l><datatype>, . ); /
Syntaks forklaring:
- Syntaksen ovenfor viser oppretting av SUB-type. Den inneholder alle medlemmene og attributtene fra den overordnede objekttypen.
Example1: I eksemplet nedenfor skal vi bruke arveegenskapen til å sette inn posten med manager-ID som '1002' for følgende post ('RRR', 1007, 20000).
Vi skal utføre programmet ovenfor i følgende trinn
- Trinn 1: Lag SUPER-type.
- Trinn 2: Lag SUB-type og kropp.
- Trinn 3: Opprette en anonym blokk for å ringe SUB-typen.
Trinn 1) Opprett SUPER type eller overordnet type.
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; /
Kodeforklaring:
- Kodelinje 1-9: Opprette 'emp_object'-objekttypen med 4 attributter og 3 medlemmer. Den inneholder definisjonen av konstruktører med bare 3 parametere. Den har blitt erklært som 'IKKE FINAL', så den er overordnet.
Trinn 2) Opprett SUB-type under SUPER-type.
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; /
Kodeforklaring:
- Kodelinje 10-13: Opprette sub_emp_object som arvet type med ytterligere ett attributt 'default_manager' og medlemsprosedyreerklæring.
- Kodelinje 14: Oppretter brødteksten for den arvede objekttypen.
- Kodelinje 16-21: Definerer medlemsprosedyren som setter inn postene i "emp"-tabellen med verdiene fra 'SUPER'-objekttypen, bortsett fra managerverdien. For managerverdi bruker den 'default_manager' fra 'SUB'-typen.
Trinn 3) Oppretter anonym blokk for å ringe SUB-typen
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; /
Kodeforklaring:
- Kodelinje 25: Erklærer 'guru_emp_det' som 'sub_emp_object'-type.
- Kodelinje 27: Initialiserer objektet med den implisitte konstruktøren. Konstruktøren har 5 parametere (4 attributter fra PARENT-type og 2 attributter fra SUB-type). Den siste parameteren (1002) definerer verdien for default_manager-attributtet
- Kodelinje 28: Kaller medlemmet 'insert_default_mgr' for å sette inn postene med standard manager-ID sendt i konstruktøren.
Likhet mellom PL/SQL-objekter
Objektforekomsten som tilhører de samme objektene kan sammenlignes for likhet. For dette må vi ha den spesielle metoden i objekttypen kalt 'ORDER'-metoden.
Denne 'ORDER'-metoden skal være funksjonen som returnerer numerisk type. Den tar to parametere som input, (første parameter: id for selvobjektforekomsten, andre parameter: ID for en annen objektforekomst).
ID-en til de to objektforekomstene sammenlignes, og resultatet returneres i numerisk.
- Positiv verdi representerer at SELF-objektforekomsten er større enn en annen forekomst.
- Negativ verdi representerer at SELF-objektforekomsten er mindre enn en annen forekomst.
- Null representerer at SELF-objektforekomsten er lik en annen forekomst.
- Hvis noen av forekomstene er null, vil denne funksjonen returnere null.
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; . . ); /
Syntaks forklaring:
- Syntaksen ovenfor viser ORDER-funksjonen som må inkluderes i typelegemet for likhetssjekk.
- Parameteren for denne funksjonen skal være en forekomst av samme objekttype.
- Funksjonen ovenfor kan kalles "obj_instance_1.match(obj_instance_2)", og dette uttrykket vil returnere den numeriske verdien som vist, der obj_instance_1 og obj_instance_2 er forekomsten av objekttypenavn.
example1: I det følgende eksempelet skal vi se hvordan vi sammenligner to objekter. Vi skal opprette to forekomster, og vi skal sammenligne attributtet "lønn" mellom dem. Vi skal gjøre to trinn.
- Trinn 1: Opprette objekttypen og kroppen.
- Trinn 2: Opprett den anonyme blokken for å ringe sammenlign objektforekomsten.
Trinn 1) Opprette objekttype og kropp.
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; /
Kodeforklaring:
- Kodelinje 1-4: Opprette 'emp_object_equality'-objekttypen med 1 attributter og 1 medlem.
- Kodelinje 6-16: Definerer ORDER-funksjonen som sammenligner 'lønn'-attributtet til SELF-forekomst og parameterforekomsttype. Den returnerer negativt hvis SELV-lønnen er mindre eller positiv hvis SELV-lønnen er større og 0 hvis lønningene er like.
Kodeutgang:
Type opprettet
Trinn 2) Opprette den anonyme blokken som skal kalles, sammenligne objektforekomsten.
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; /
Produksjon
Salary of second instance is greater
Kodeforklaring:
- Kodelinje 20: Erklærer l_obj_1 av typen emp_object_equality.
- Kodelinje 21: Erklærer l_obj_2 av typen emp_object_equality.
- Kodelinje 23: Initialiserer l_obj_1 med lønnsverdi som '15000'
- Kodelinje 24: Initialiserer l_obj_1 med lønnsverdi som '17000'
- Kodelinje 25-33: Skriv ut meldingen basert på returnummeret fra ORDER-funksjonen.
Oppsummering
I dette kapittelet har vi sett objekttypen og deres egenskaper. Vi har også diskutert om konstruktører, medlemmer, attributter, arv og likhet i PL/SQL-objekter.