Oracle PL/SQL Objekttyper Tutorial med EKSEMPLER
Hvad er objekttype i PL/SQL?
Objektorienteret programmering er isรฆr velegnet til at bygge genanvendelige komponenter og komplekse applikationer. De er organiseret omkring "objekter" snarere end "handlinger", dvs. programmerne er designet til at arbejde og interagere med hele objektet i stedet for den enkelte handling. Dette koncept giver programmรธren mulighed for at udfylde og manipulere detaljerne pรฅ objektentitetsniveau.
Nedenstรฅende billede viser et eksempel pรฅ den objekttype, hvor en bankkonto betragtes som en objektenhed. Objektattributterne inkluderer ting, der har nogle attributvรฆrdier, for eksempel i bankkonto; det er kontonummer, banksaldo osv., mens objektmetoder beskriver ting som at beregne rente, generere kontoudtog osv., som krรฆver en bestemt proces for at blive gennemfรธrt.
I PL/SQL er objektorienteret programmering baseret pรฅ objekttyper.
En objekttype kan reprรฆsentere enhver entitet i den virkelige verden. Vi vil diskutere flere objekttyper i dette kapitel.
Komponenter af objekttyper
PL / SQL objekttype indeholder hovedsageligt to komponenter.
- Attributter
- Medlemmer/metoder
Attributter
Attributter er den kolonne eller det felt, hvori data gemmes. Hver attribut vil blive knyttet til den datatype, der definerer behandlings- og lagringstypen for den pรฅgรฆldende attribut. Attributten kan vรฆre en hvilken som helst gyldig PL/SQL datatype, eller det kan vรฆre af en anden objekttype.
Medlemmer/metoder
Medlemmer eller metoder er underprogrammer, der er defineret i objekttypen. De bruges ikke til at gemme data. De bruges hovedsageligt til at definere proces inde i objekttypen. For eksempler pรฅ validering af data fรธr udfyldning af objekttypen. De er deklareret i objekttypeafsnittet og defineret i objekttypens kropssektion af objekttypen. Kropssektion i objekttype er en valgfri del. Hvis ingen medlemmer er til stede, vil en objekttype ikke indeholde nogen kropsdel.
Opret objekt i Oracle
En objekttype kan ikke oprettes pรฅ underprogramniveau. De kan kun oprettes pรฅ skemaniveau. Nรฅr fรธrst objekttypen er defineret i skemaet, sรฅ kan den samme bruges i underprogrammer. Objekttypen kan oprettes ved hjรฆlp af 'CREATE TYPE'. Typeteksten kan kun oprettes efter oprettelse af dens objekttype.
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:
- Ovenstรฅende syntaks viser oprettelsen af โโ'OBJECT' med attributter og 'OBJECT-BODY' med metoder.
- Metoderne kan ogsรฅ overbelastes i objektets krop.
Erklรฆring Initialisering af objekttype
Ligesom andre komponenter i PL/SQL skal objekttyper ogsรฅ deklareres, fรธr de bruges i programmet.
Nรฅr objekttypen er oprettet, kan den bruges i underprogrammets deklarative sektion til at erklรฆre en variabel af den objekttype.
Nรฅr en variabel er erklรฆret i underprogrammet som objekttype, vil en ny instans af objekttypen blive oprettet under kรธrsel, og denne nyoprettede instans kan henvises til variabelnavnet. Pรฅ denne mรฅde kan en enkelt objekttype gemme flere vรฆrdier under forskellige forekomster.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Syntaks forklaring:
- Ovenstรฅende syntaks viser deklarationen af โโen variabel som en objekttype i den deklarative sektion.
Nรฅr variablen er erklรฆret som en objekttype i et underprogram, vil den vรฆre atomisk nul, dvs. hele objektet i sig selv en null. Det skal initialiseres med vรฆrdier for at bruge dem i programmet. De kan initialiseres ved hjรฆlp af konstruktรธrer.
Konstruktรธrer er den implicitte metode for et objekt, der kan henvises til med samme navn som objekttypen. Nedenstรฅende syntaks viser initialiseringen af โโobjekttypen.
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
Syntaks forklaring:
- Ovenstรฅende syntaks viser initialiseringen af โโobjekttypeforekomsten med en nulvรฆrdi.
- Nu er selve objektet ikke null, da det er blevet initialiseret, men attributterne inde i objektet vil vรฆre null, da vi ikke har tildelt nogen vรฆrdier til disse attributter.
Konstruktรธrer
Konstruktรธrer er den implicitte metode for et objekt, der kan henvises til med samme navn som objekttypen. Nรฅr objektet henvises for fรธrste gang, vil denne konstruktรธr blive kaldt implicit.
Vi kan ogsรฅ initialisere objekterne ved hjรฆlp af disse konstruktรธrer. Konstruktรธren kan defineres eksplicit ved at definere elementet i objekttypelegemet med samme navn som objekttypen.
Eksempel 1: I det fรธlgende eksempel skal vi bruge objekttypemedlemmet til at indsรฆtte posten i emp-tabellen med vรฆrdier ('RRR', 1005, 20000, 1000) og ('PPP', 1006, 20000, 1001). Nรฅr dataene er indsat, vil vi vise det samme ved hjรฆlp af objekttypemedlem. Vi vil ogsรฅ bruge den eksplicitte konstruktรธr til at udfylde manager-id'et som standard med 1001-vรฆrdien for den anden post.
Vi vil udfรธre det i nedenstรฅende trin.
- Step1:
- Opret objekttype
- Objekttypelegeme
- Trin 2: Oprettelse af en anonym blok til at kalde oprettet objekttype gennem implicit konstruktรธr til emp_no 1005.
- Trin 3: Oprettelse af en anonym blok til at kalde oprettet objekttype gennem eksplicit konstruktรธr til emp_no 1006.
Trin 1) Opret objekttype og objekttypelegeme
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: Oprettelse af 'emp_object'-objekttypen med 4 attributter og 3 medlemmer. Den indeholder definitionen af โโkonstruktรธrer med kun 3 parametre. (Faktisk implicit konstruktรธr vil indeholde antallet af parametre svarende til antallet af attributter til stede i objekttypen)
- Kodelinje 10: Oprettelse af skriftteksten.
- Kodelinje 11-21: Definerer den eksplicitte konstruktรธr. Tildeling af parametervรฆrdien til attributterne og tildeling af vรฆrdien for attributten 'manager' med standardvรฆrdien '1001'.
- Kodelinje 22-26: Definerer medlemmet 'insert_records', hvori attributvรฆrdierne indsรฆttes i 'emp'-tabellen.
- Kodelinje 27-34: Definerer medlemmet 'display_records', hvori vรฆrdierne for objekttypeattributterne vises.
Produktion
Type oprettet
Skriv brรธdtekst oprettet
Trin 2) Oprettelse af anonym blok for at kalde oprettet objekttype gennem implicit konstruktรธr til 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: Indsรฆttelse af posterne ved hjรฆlp af den implicitte konstruktรธr. Kald til konstruktรธr indeholder det faktiske antal attributvรฆrdier.
- Kodelinje 38: Erklรฆrer guru_emp_det som objekttype for 'emp_object'.
- Kodelinje 41: Udsagn 'guru_emp_det.display_records' kaldet 'diplay_records'-medlemsfunktionen, og attributvรฆrdierne vises
- Kodelinje 42: Udsagn 'guru_emp_det.insert_records' kaldet 'insert_records'-medlemsfunktionen og attributvรฆrdierne indsรฆttes i tabellen.
Produktion
Medarbejders navn: RRR
Medarbejdernummer: 1005
Lรธn: 20000
Leder: 1000
Trin 3) Oprettelse af anonym blok for at kalde oprettet objekttype gennem eksplicit konstruktรธr til 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; /
Produktion
Employee Name:PPP Employee Number:1006 Salary:20000 Manager:1001
Kodeforklaring:
- Kodelinje 46-53: Indsรฆttelse af posterne ved hjรฆlp af den eksplicitte konstruktรธr.
- Kodelinje 46: Erklรฆrer guru_emp_det som objekttype for 'emp_object'.
- Kodelinje 50: Udsagn 'guru_emp_det.display_records' kaldet 'display_records'-medlemsfunktionen, og attributvรฆrdierne vises
- Kodelinje 51: Udsagn 'guru_emp_det.insert_records' kaldet 'insert_records'-medlemsfunktionen og attributvรฆrdierne indsรฆttes i tabellen.
Arv i objekttype
Nedarvningsegenskaben giver underobjekttypen adgang til alle attributter og medlemmer af superobjekttypen eller den overordnede objekttype.
Underobjekttypen kaldes nedarvet objekttype, og superobjekttypen kaldes overordnet objekttype. Nedenstรฅende syntaks viser, hvordan man opretter overordnet og nedarvet objekttype.
CREATE TYPE <object_type_name_parent> AS OBJECT ( <attribute_l><datatype>, . . )NOT FINAL; /
Syntaks forklaring:
- Ovenstรฅende syntaks viser oprettelsen af โโSUPER type.
CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent> ( <attribute_l><datatype>, . ); /
Syntaks forklaring:
- Ovenstรฅende syntaks viser oprettelse af SUB-type. Den indeholder alle medlemmer og attributter fra den overordnede objekttype.
Eksempel 1: I eksemplet nedenfor vil vi bruge arveegenskaben til at indsรฆtte posten med manager-id som '1002' for fรธlgende post ('RRR', 1007, 20000).
Vi vil udfรธre ovenstรฅende program i de fรธlgende trin
- Trin 1: Opret SUPER type.
- Trin 2: Opret SUB-type og krop.
- Trin 3: Oprettelse af en anonym blok for at kalde SUB-typen.
Trin 1) Opret 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: Oprettelse af 'emp_object'-objekttypen med 4 attributter og 3 medlemmer. Den indeholder definitionen af โโkonstruktรธrer med kun 3 parametre. Det er blevet erklรฆret som 'IKKE ENDELIG', sรฅ det er overordnet.
Trin 2) Opret 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: Oprettelse af sub_emp_object som nedarvet type med yderligere รฉn attribut 'default_manager' og medlemsprocedureerklรฆring.
- Kodelinje 14: Oprettelse af brรธdteksten for den nedarvede objekttype.
- Kodelinje 16-21: Definerer medlemsproceduren, som indsรฆtter posterne i "emp"-tabellen med vรฆrdierne fra 'SUPER'-objekttypen, undtagen administratorvรฆrdi. For managervรฆrdi bruger den 'default_manager' fra 'SUB'-typen.
Trin 3) Oprettelse af anonym blok for at kalde 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: Initialisering af objektet med den implicitte konstruktรธr. Konstruktรธren har 5 parametre (4 attributter fra PARENT-type og 2 attributter fra SUB-type). Den sidste parameter (1002) definerer vรฆrdien for default_manager-attributten
- Kodelinje 28: Kalder medlemmet 'insert_default_mgr' for at indsรฆtte posterne med standardadministrator-id'et, der er sendt i konstruktรธren.
Ligestilling af PL/SQL-objekter
Den objektinstans, der hรธrer til de samme objekter, kan sammenlignes for lighed. Til dette skal vi have den specielle metode i objekttypen kaldet 'ORDER' metode.
Denne 'ORDER'-metode skal vรฆre den funktion, der returnerer numerisk type. Det tager to parametre som input, (fรธrste parameter: id for selvobjektforekomsten, anden parameter: id for en anden objektforekomst).
Id'et for de to objektforekomster sammenlignes, og resultatet returneres i numerisk.
- Positiv vรฆrdi reprรฆsenterer, at SELF-objektforekomsten er stรธrre end en anden forekomst.
- Negativ vรฆrdi reprรฆsenterer, at SELF-objektforekomsten er mindre end en anden forekomst.
- Nul reprรฆsenterer, at SELF-objektforekomsten er lig med en anden forekomst.
- Hvis nogen af โโforekomsterne er null, vil denne funktion 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:
- Ovenstรฅende syntaks viser ORDER-funktionen, der skal inkluderes i typelegemet for lighedskontrol.
- Parameteren for denne funktion skal vรฆre en instans af samme objekttype.
- Ovenstรฅende funktion kan kaldes "obj_instance_1.match(obj_instance_2)", og dette udtryk vil returnere den numeriske vรฆrdi som vist, hvor obj_instance_1 og obj_instance_2 er forekomsten af โโobjekttype_navn.
Eksempel 1: I det fรธlgende eksempel skal vi se, hvordan man sammenligner to objekter. Vi vil oprette to instanser, og vi vil sammenligne attributten 'lรธn' mellem dem. Vi skal udfรธre to trin.
- Trin 1: Oprettelse af objekttype og krop.
- Trin 2: Oprettelse af den anonyme blok, der skal kaldes, sammenligne objektforekomsten.
Trin 1) Oprettelse af objekttype og krop.
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: Oprettelse af objekttypen 'emp_object_equality' med 1 attributter og 1 medlem.
- Kodelinje 6-16: Definerer ORDER-funktionen, som sammenligner 'lรธn'-attributten for SELF-instans og parameterinstanstype. Det returnerer negativt, hvis SELV-lรธnnen er mindre eller positiv, hvis SELV-lรธnnen er stรธrre og 0, hvis lรธnningerne er lige store.
Kodeoutput:
Type oprettet
Trin 2) Oprettelse af den anonyme blok, der skal kaldes, 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; /
Produktion
Salary of second instance is greater
Kodeforklaring:
- Kodelinje 20: Erklรฆrer l_obj_1 af typen emp_object_equality.
- Kodelinje 21: Erklรฆrer l_obj_2 af typen emp_object_equality.
- Kodelinje 23: Initialiserer l_obj_1 med lรธnvรฆrdi som '15000'
- Kodelinje 24: Initialiserer l_obj_1 med lรธnvรฆrdi som '17000'
- Kodelinje 25-33: Udskriv meddelelsen baseret pรฅ returnummeret fra ORDER-funktionen.
Resumรฉ
I dette kapitel har vi set objekttypen og deres egenskaber. Vi har ogsรฅ diskuteret konstruktรธrer, medlemmer, attributter, arv og lighed i PL/SQL-objekter.


















