Oracle PL/SQL-objekttyper: CREATE TYPE med eksempler
โก Smart oppsummering
Objekttyper i PL/SQL gjรธr objektorientert programmering mulig Oracle, slik at du kan modellere virkelige enheter med attributter og metoder. De stรธtter konstruktรธrer, arv og likhetssammenligning, slik at en enkelt skjemanivรฅtype kan lagre og behandle strukturerte data.

Hva er objekttype i PL/SQL?
Objektorientert programmering er spesielt egnet for รฅ bygge gjenbrukbare komponenter og komplekse applikasjoner. Programmer er organisert rundt ยซobjekterยป snarere enn ยซhandlingerยป; det vil si at de er designet for รฅ fungere med og samhandle med et helt objekt snarere enn รฉn enkelt handling. Denne tilnรฆrmingen lar programmereren fylle ut og manipulere detaljer pรฅ objekt-enhetsnivรฅ.
Bildet nedenfor viser et eksempel pรฅ en objekttype der en bankkonto behandles som en objektenhet. Objektattributtene inneholder verdier โ for en bankkonto er dette kontonummer, banksaldo og sรฅ videre โ mens objektmetodene beskriver handlinger som รฅ beregne renten eller generere en kontoutskrift, som hver krever at en prosess fullfรธres.
In PL / SQL, objektorientert programmering er basert pรฅ objekttyper. En objekttype kan representere enhver virkelig enhet. Avsnittene nedenfor utforsker objekttyper, komponentene deres og hvordan du oppretter og bruker dem.
Komponenter av objekttyper
En PL/SQL-objekttype inneholder hovedsakelig to komponenter.
- attributter
- Medlemmer/metoder
attributter
Attributter er kolonnene eller feltene der data lagres. Hvert attributt er tilordnet datatypen som definerer behandlings- og lagringstypen for det attributtet. Et attributt kan vรฆre av et hvilket som helst gyldig PL/SQL datatype, eller det kan vรฆre av en annen objekttype.
Medlemmer/metoder
Medlemmer, eller metoder, er underprogrammer definert inne i objekttypen. De brukes ikke til รฅ lagre data; i stedet definerer de behandlingen som utfรธres inne i objekttypen โ for eksempel validering av data fรธr objektet fylles ut. De er deklarert i objekttypespesifikasjonen og definert i objekttypeteksten. Teksten er valgfri: hvis ingen medlemmer er tilstede, har en objekttype ingen tekstdel.
Lag objekt i Oracle
En objekttype kan ikke opprettes pรฅ delprogramnivรฅ; den kan bare opprettes pรฅ skjemanivรฅ. Nรฅr objekttypen er definert i skjemaet, kan den brukes i delprogrammer. Objekttypen opprettes ved hjelp av ยซCREATE TYPEยป-setningen, og typeinnholdet kan bare opprettes etter at objekttypen finnes.
Skjermbildene nedenfor viser CREATE TYPE-syntaksen for objektspesifikasjonen og CREATE TYPE BODY-syntaksen som definerer metodene.
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 et OBJECT med attributter og en OBJECT BODY med metoder.
- Metodene kan ogsรฅ overbelastes i objektkroppen.
Erklรฆringsinitialisering av objekttype
Som andre komponenter i PL/SQL, mรฅ objekttyper deklareres fรธr de brukes i et program. Nรฅr objekttypen er opprettet, kan den brukes i et delprograms deklarative seksjon for รฅ deklarere en variabel av den objekttypen.
Nรฅr en variabel deklareres som en objekttype, opprettes en ny instans av objekttypen under kjรธretid, og denne nyopprettede instansen refereres til med variabelnavnet. Pรฅ denne mรฅten kan en enkelt objekttype lagre flere verdier under forskjellige instanser.
Skjermbildet nedenfor viser en variabel som deklareres som en objekttype inni en PL/SQL-blokk.
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 deklarert som en objekttype i et underprogram, er den atomisk null โ hele objektet i seg selv er null. Den mรฅ initialiseres med verdier fรธr den kan brukes i programmet. Objekter initialiseres ved hjelp av konstruktรธrer.
Konstruktรธrer er den implisitte metoden til et objekt som kan refereres til med samme navn som objekttypen. Skjermbildet nedenfor viser initialiseringen av en objekttypeinstans.
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
Syntaks forklaring:
- Syntaksen ovenfor viser initialiseringen av objekttypeforekomsten med en nullverdi.
- Selve objektet er ikke lenger null nรฅr det er initialisert, men attributtene i objektet forblir null inntil verdier tilordnes dem.
Konstruktรธrer
Konstruktรธrer er den implisitte metoden til et objekt som kan refereres til med samme navn som objekttypen. Nรฅr objektet refereres til for fรธrste gang, kalles denne konstruktรธren implisitt.
Du kan ogsรฅ initialisere objekter ved hjelp av disse konstruktรธrene. En konstruktรธr kan defineres eksplisitt ved รฅ definere et medlem i objekttypens brรธdtekst med samme navn som objekttypen.
Eksempel 1: I det fรธlgende eksemplet bruker vi objekttypemedlemmet til รฅ sette inn poster i emp-tabellen med verdiene ('RRR', 1005, 20000, 1000) og ('PPP', 1006, 20000, 1001). Nรฅr dataene er satt inn, viser vi dem ved hjelp av objekttypemedlemmet. Vi bruker ogsรฅ en eksplisitt konstruktรธr til รฅ fylle ut manager-ID-en med standardverdien 1001 for den andre posten.
Vi utfรธrer det i fรธlgende trinn.
- Trinn 1: Opprett objekttypen og objekttypens brรธdtekst.
- Trinn 2: Opprett en anonym blokk for รฅ kalle objekttypen gjennom den implisitte konstruktรธren for emp_no 1005.
- Trinn 3: Opprett en anonym blokk for รฅ kalle objekttypen gjennom den eksplisitte konstruktรธren for emp_no 1006.
Trinn 1) Opprett objekttype og objekttypekropp.
Skjermbildet nedenfor viser objekttypespesifikasjonen emp_object som opprettes med attributter og medlemmer.
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); /
Skjermbildet nedenfor viser emp_object-typen som opprettes med den eksplisitte konstruktรธren og medlemsprosedyrene.
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 Forklaring
- Code linje 1โ9: Oppretter objekttypen 'emp_object' med 4 attributter og 3 medlemmer. Den inneholder definisjonen av en konstruktรธr med bare 3 parametere. (Den faktiske implisitte konstruktรธren inneholder antall parametere som tilsvarer antall attributter som finnes i objekttypen.)
- Code linje 10: Oppretter typekroppen.
- Code linje 11โ21: Definere den eksplisitte konstruktรธren. Tilordne parameterverdiene til attributtene og gi attributtet 'manager' standardverdien '1001'.
- Code linje 22โ26: Definerer medlemmet 'insert_records', der attributtverdiene settes inn i 'emp'-tabellen.
- Code linje 27โ34: Definerer medlemmet 'display_records', som viser verdiene til objekttypeattributtene.
Utgang:
Type opprettet
Skriv brรธdtekst opprettet
Trinn 2) Oppretter en anonym blokk for รฅ kalle den opprettede objekttypen gjennom den implisitte konstruktรธren for emp_no 1005.
Skjermbildet nedenfor viser den anonyme blokken som kaller emp_object gjennom den implisitte konstruktรธren.
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 Forklaring
- Code linje 37โ45: Setter inn postene ved hjelp av den implisitte konstruktรธren. Kallet til konstruktรธren inneholder det faktiske antallet attributtverdier.
- Code linje 38: Deklarerer 'guru_emp_det' som objekttypen 'emp_object'.
- Code linje 41: Uttrykket 'guru_emp_det.display_records' kaller medlemmet 'display_records', og attributtverdiene vises.
- Code linje 42: Uttrykket 'guru_emp_det.insert_records' kaller medlemmet 'insert_records', og attributtverdiene settes inn i tabellen. Blokken lagrer deretter Transaksjonen.
Utgang:
Ansatt navn: RRR
Ansattnummer: 1005
Lรธnn: 20000
Leder: 1000
Trinn 3) Oppretter en anonym blokk for รฅ kalle den opprettede objekttypen gjennom den eksplisitte konstruktรธren for emp_no 1006.
Skjermbildet nedenfor viser den anonyme blokken som kaller emp_object gjennom den eksplisitte konstruktรธren med tre argumenter.
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
Code Forklaring:
- Code linje 46โ53: Sette inn posten ved hjelp av den eksplisitte konstruktรธren.
- Code linje 46: Deklarerer 'guru_emp_det' som objekttypen 'emp_object'.
- Code linje 50: Uttrykket 'guru_emp_det.display_records' kaller medlemmet 'display_records', og attributtverdiene vises.
- Code linje 51: Uttrykket 'guru_emp_det.insert_records' kaller medlemmet 'insert_records', og attributtverdiene settes inn i tabellen. Fordi bare tre argumenter sendes, setter den eksplisitte konstruktรธren manager-ID-en til standardverdien 1001.
Arv i objekttype
Arveegenskapen gir en underobjekttype tilgang til alle attributtene og medlemmene av superobjekttypen, eller den overordnede objekttypen.
Underobjekttypen kalles den arvede objekttypen, og superobjekttypen kalles den overordnede objekttypen. Syntaksen nedenfor viser hvordan du oppretter overordnede og arvede objekttyper. Skjermbildet nedenfor viser overordnet (SUPER) syntaks merket som IKKE ENDELIG.
CREATE TYPE <object_type_name_parent> AS OBJECT ( <attribute_l><datatype>, . . )NOT FINAL; /
Syntaks forklaring:
- Syntaksen ovenfor viser opprettelsen av SUPER-typen. NOT FINAL-klausulen tillater at typen arves.
Skjermbildet nedenfor viser den arvede (SUB) typesyntaksen som er opprettet med UNDER-nรธkkelordet.
CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent> ( <attribute_l><datatype>, . ); /
Syntaks forklaring:
- Syntaksen ovenfor viser opprettelsen av SUB-typen. Den inneholder alle medlemmene og attributtene fra den overordnede objekttypen.
Eksempel 1: I eksemplet nedenfor bruker vi arv-egenskapen til รฅ sette inn en post med leder-ID-en '1002' for posten ('RRR', 1007, 20000). Vi kjรธrer programmet i fรธlgende trinn.
- Trinn 1: Opprett SUPER-typen.
- Trinn 2: Opprett SUB-typen og brรธdteksten.
- Trinn 3: Opprett en anonym blokk for รฅ kalle SUB-typen.
Trinn 1) Opprett SUPER-typen eller overordnet type.
Skjermbildet nedenfor viser supertypen emp_object som opprettes med NOT FINAL-klausulen.
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 Forklaring:
- Code linje 1โ9: Oppretter objekttypen 'emp_object' med 4 attributter og 3 medlemmer. Den inneholder definisjonen av en konstruktรธr med bare 3 parametere. Den er deklarert som 'IKKE ENDELIG', sรฅ den er en overordnet type.
Trinn 2) Opprett SUB-typen under SUPER-typen.
Skjermbildet nedenfor viser den arvede typen sub_emp_object og dens brรธdtekst som opprettes.
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 Forklaring:
- Code linje 10โ13: Oppretter 'sub_emp_object' som den arvede typen med ett ekstra attributt 'default_manager' og en medlemsprosedyredeklarasjon.
- Code linje 14: Oppretter kroppen for den arvede objekttypen.
- Code linje 16โ21: Definerer medlemsprosedyren som setter inn poster i 'emp'-tabellen med verdiene fra SUPER-objekttypen, bortsett fra manager-verdien. For manager-verdien brukes 'default_manager' fra SUB-typen.
Trinn 3) Oppretter anonym blokk for รฅ kalle SUB-typen.
Skjermbildet nedenfor viser den anonyme blokken som kaller SUB-typen og setter inn standard leder-ID-en.
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 Forklaring:
- Code linje 25: Deklarerer 'guru_emp_det' som typen 'sub_emp_object'.
- Code linje 27: Initialiserer objektet med den implisitte konstruktรธren. Konstruktรธren har 5 parametere (4 attributter fra PARENT-typen og 1 attributt fra SUB-typen). Den siste parameteren (1002) definerer verdien for default_manager-attributtet.
- Code linje 28: Kall pรฅ medlemmet ยซinsert_default_mgrยป for รฅ sette inn posten med standard leder-ID-en som er sendt i konstruktรธren.
Likhet mellom PL/SQL-objekter
Objektforekomster som tilhรธrer samme objekttype kan sammenlignes for likhet. For รฅ gjรธre dette trenger objekttypen en spesiell metode kalt ORDER-metoden.
Denne ORDER-metoden skal vรฆre en funksjon som returnerer en numerisk type. Den tar to parametere som input (fรธrste parameter: ID-en til selvobjektinstansen; andre parameter: ID-en til en annen objektinstans).
ID-ene til de to objektforekomstene sammenlignes, og resultatet returneres som et tall.
- En positiv verdi indikerer at SELF-objektforekomsten er stรธrre enn den andre forekomsten.
- En negativ verdi indikerer at SELF-objektforekomsten er mindre enn den andre forekomsten.
- Null indikerer at SELF-objektforekomsten er lik den andre forekomsten.
- Hvis en av forekomstene er null, returnerer funksjonen null.
Skjermbildet nedenfor viser syntaksen for ORDER-medlemsfunksjonen som mรฅ inkluderes i typeinnholdet for likhetssjekken.
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 typeteksten for likhetssjekken.
- Parameteren for denne funksjonen skal vรฆre en forekomst av samme objekttype.
- Funksjonen kan kalles ยซobj_instance_1.match(obj_instance_2)ยป, og dette uttrykket returnerer den numeriske verdien som vises, der obj_instance_1 og obj_instance_2 er forekomster av objekttypen.
Eksempel 1: I det fรธlgende eksemplet sammenligner vi to objekter. Vi oppretter to instanser og sammenligner attributtet ยซsalaryยป mellom dem. Vi gjรธr dette i to trinn.
- Trinn 1: Opprett objekttypen og brรธdteksten.
- Trinn 2: Opprett den anonyme blokken for รฅ sammenligne objektforekomstene.
Trinn 1) Opprette objekttypen og -kroppen.
Skjermbildene nedenfor viser emp_object_equality-spesifikasjonen og dens brรธdtekst, som definerer ORDER-funksjonen som sammenligner salary-attributtet.
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 Forklaring:
- Code linje 1โ4: Oppretter objekttypen 'emp_object_equality' med 1 attributt og 1 medlem.
- Code linje 6โ16: Definerer ORDER-funksjonen som sammenligner attributtet 'salary' til SELF-instansen og parameterinstansen. Den returnerer en negativ verdi hvis SELF-lรธnnen er mindre, en positiv verdi hvis SELF-lรธnnen er stรธrre, og 0 hvis lรธnningene er like.
Code Utgang:
Type opprettet
Trinn 2) Opprette den anonyme blokken for รฅ sammenligne objektforekomstene.
Skjermbildet nedenfor viser den anonyme blokken som sammenligner to emp_object_equality-forekomster etter lรธnn.
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; /
Produksjon
Salary of second instance is greater
Code Forklaring:
- Code linje 20: Deklarerer 'l_obj_1' av typen 'emp_object_equality'.
- Code linje 21: Deklarerer 'l_obj_2' av typen 'emp_object_equality'.
- Code linje 23: Initialiserer 'l_obj_1' med lรธnnsverdien '15000'.
- Code linje 24: Initialiserer 'l_obj_2' med lรธnnsverdien '17000'.
- Code linje 25โ33: Skriver ut meldingen basert pรฅ tallet som returneres av ORDER-funksjonen.


















