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.