Oracle PL/SQL-objekttyper: CREATE TYPE med eksempler
⚡ Smart opsummering
Objekttyper i PL/SQL gør objektorienteret programmering mere Oracle, så du kan modellere virkelige enheder med attributter og metoder. De understøtter konstruktører, arv og lighedssammenligning, så en enkelt skemaniveautype kan gemme og behandle strukturerede data.
Hvad er objekttype i PL/SQL?
Objektorienteret programmering er særligt velegnet til at bygge genbrugelige komponenter og komplekse applikationer. Programmer er organiseret omkring "objekter" snarere end "handlinger"; det vil sige, de er designet til at arbejde med og interagere med et helt objekt snarere end en enkelt handling. Denne tilgang giver programmøren mulighed for at udfylde og manipulere detaljer på objekt-entitetsniveau.
Billedet nedenfor viser et eksempel på en objekttype, hvor en bankkonto behandles som en objektenhed. Objektattributterne indeholder værdier – for en bankkonto er disse kontonummer, banksaldo osv. – mens objektmetoderne beskriver handlinger som f.eks. beregning af renten eller generering af en bankudskrift, som hver især kræver en proces for at blive fuldført.
In PL / SQL, objektorienteret programmering er baseret på objekttyper. En objekttype kan repræsentere enhver virkelig enhed. Afsnittene nedenfor udforsker objekttyper, deres komponenter og hvordan man opretter og bruger dem.
Komponenter af objekttyper
En PL/SQL-objekttype indeholder primært to komponenter.
- Attributter
- Medlemmer/metoder
Attributter
Attributter er de kolonner eller felter, hvor data gemmes. Hver attribut er knyttet til den datatype, der definerer behandlings- og lagringstypen for den pågældende attribut. En attribut kan være af et hvilket som helst gyldigt PL/SQL datatype, eller det kan være af en anden objekttype.
Medlemmer/metoder
Medlemmer, eller metoder, er underprogrammer defineret inde i objekttypen. De bruges ikke til at gemme data; i stedet definerer de den behandling, der udføres inde i objekttypen - for eksempel validering af data før udfyldning af objektet. De er deklareret i objekttypespecifikationen og defineret i objekttypens brødtekst. Brødteksten er valgfri: hvis der ikke er nogen medlemmer til stede, har en objekttype ingen brødtekstdel.
Opret objekt i Oracle
En objekttype kan ikke oprettes på underprogramniveau; den kan kun oprettes på skemaniveau. Når objekttypen er defineret i skemaet, kan den bruges i underprogrammer. Objekttypen oprettes ved hjælp af "CREATE TYPE"-sætningen, og typeteksten kan først oprettes, når dens objekttype findes.
Skærmbillederne nedenfor viser CREATE TYPE-syntaksen for objektspecifikationen og CREATE TYPE BODY-syntaksen, der definerer dens metoder.
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 oprettelsen af et OBJECT med attributter og et OBJECT BODY med metoder.
- Metoderne kan også overbelastes i objektets krop.
Erklæring Initialisering af objekttype
Ligesom andre komponenter i PL/SQL skal objekttyper deklareres, før de bruges i et program. Når objekttypen er oprettet, kan den bruges i et underprograms deklarative sektion til at deklarere en variabel af den pågældende objekttype.
Når en variabel deklareres som en objekttype, oprettes der en ny instans af objekttypen under kørsel, og denne nyoprettede instans refereres til med variabelnavnet. På denne måde kan en enkelt objekttype gemme flere værdier under forskellige instanser.
Skærmbilledet nedenfor viser en variabel, der deklareres som en objekttype i en PL/SQL-blok.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Syntaks forklaring:
- Syntaksen ovenfor viser deklarationen af en variabel som en objekttype i den deklarative sektion.
Når variablen er deklareret som en objekttype i et underprogram, er den atomisk null – hele objektet i sig selv er null. Det skal initialiseres med værdier, før det kan bruges i programmet. Objekter initialiseres ved hjælp af konstruktører.
Konstruktører er den implicitte metode for et objekt, der kan refereres til med samme navn som objekttypen. Skærmbilledet nedenfor viser initialiseringen af en objekttypeinstans.
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
Syntaks forklaring:
- Syntaksen ovenfor viser initialiseringen af objekttypeinstansen med en nullværdi.
- Selve objektet er ikke længere null, når det er blevet initialiseret, men attributterne i objektet forbliver null, indtil de får tildelt værdier.
Konstruktører
Konstruktører er den implicitte metode for et objekt, der kan refereres til med samme navn som objekttypen. Når objektet refereres til for første gang, kaldes denne konstruktør implicit.
Du kan også initialisere objekter ved hjælp af disse konstruktører. En konstruktør kan defineres eksplicit ved at definere et medlem i objekttypens brødtekst med samme navn som objekttypen.
Eksempel 1: I det følgende eksempel bruger vi objekttypemedlemmet til at indsætte poster i emp-tabellen med værdierne ('RRR', 1005, 20000, 1000) og ('PPP', 1006, 20000, 1001). Når dataene er indsat, viser vi dem ved hjælp af objekttypemedlemmet. Vi bruger også en eksplicit konstruktør til at udfylde manager-id'et med standardværdien 1001 for den anden post.
Vi udfører det i følgende trin.
- Trin 1: Opret objekttypen og objekttypens brødtekst.
- Trin 2: Opret en anonym blok for at kalde objekttypen via den implicitte konstruktør for emp_no 1005.
- Trin 3: Opret en anonym blok for at kalde objekttypen via den eksplicitte konstruktør for emp_no 1006.
Trin 1) Opret objekttype og objekttypebrødtekst.
Skærmbilledet nedenfor viser emp_object-objekttypespecifikationen, der oprettes med dens 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); /
Skærmbilledet nedenfor viser emp_object-typen, der oprettes med den eksplicitte konstruktør og medlemsprocedurerne.
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: Oprettelse af objekttypen 'emp_object' med 4 attributter og 3 medlemmer. Den indeholder definitionen af en konstruktør med kun 3 parametre. (Den faktiske implicitte konstruktør indeholder antallet af parametre svarende til antallet af attributter i objekttypen.)
- Code linje 10: Oprettelse af typekroppen.
- Code linje 11-21: Definition af den eksplicitte konstruktør. Tildeling af parameterværdier til attributterne og tildeling af standardværdien '1001' til attributten 'manager'.
- Code linje 22-26: Definition af medlemmet 'insert_records', hvor attributværdierne indsættes i tabellen 'emp'.
- Code linje 27-34: Definition af medlemmet 'display_records', som viser værdierne for objekttypeattributterne.
Output:
Type oprettet
Skriv brødtekst oprettet
Trin 2) Opretter en anonym blok til at kalde den oprettede objekttype via den implicitte konstruktør for emp_no 1005.
Skærmbilledet nedenfor viser den anonyme blok, der kalder emp_object gennem den implicitte konstruktør.
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: Indsættelse af poster ved hjælp af den implicitte konstruktør. Kaldet til konstruktøren indeholder det faktiske antal attributværdier.
- Code linje 38: Deklarerer 'guru_emp_det' som objekttypen 'emp_object'.
- Code linje 41: Udtrykket 'guru_emp_det.display_records' kalder medlemmet 'display_records', og attributværdierne vises.
- Code linje 42: Udtrykket 'guru_emp_det.insert_records' kalder medlemmet 'insert_records', og attributværdierne indsættes i tabellen. Blokken committer derefter transaktion.
Output:
Medarbejders navn: RRR
Medarbejdernummer: 1005
Løn: 20000
Leder: 1000
Trin 3) Opretter en anonym blok til at kalde den oprettede objekttype gennem den eksplicitte konstruktør for emp_no 1006.
Skærmbilledet nedenfor viser den anonyme blok, der kalder emp_object gennem den eksplicitte konstruktør 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; /
Produktion
Employee Name:PPP Employee Number:1006 Salary:20000 Manager:1001
Code Forklaring:
- Code linje 46-53: Indsættelse af posten ved hjælp af den eksplicitte konstruktør.
- Code linje 46: Deklarerer 'guru_emp_det' som objekttypen 'emp_object'.
- Code linje 50: Udtrykket 'guru_emp_det.display_records' kalder medlemmet 'display_records', og attributværdierne vises.
- Code linje 51: Udtrykket 'guru_emp_det.insert_records' kalder medlemmet 'insert_records', og attributværdierne indsættes i tabellen. Da kun tre argumenter sendes, sætter den eksplicitte konstruktør manager-id'et til standardværdien 1001.
Arv i objekttype
Arveegenskaben giver en underobjekttype adgang til alle attributter og medlemmer af superobjekttypen eller den overordnede objekttype.
Underobjekttypen kaldes den nedarvede objekttype, og superobjekttypen kaldes den overordnede objekttype. Syntaksen nedenfor viser, hvordan man opretter overordnede og nedarvede objekttyper. Skærmbilledet nedenfor viser overordnede (SUPER) typesyntaks markeret som IKKE ENDELIG.
CREATE TYPE <object_type_name_parent> AS OBJECT ( <attribute_l><datatype>, . . )NOT FINAL; /
Syntaks forklaring:
- Syntaksen ovenfor viser oprettelsen af SUPER-typen. NOT FINAL-klausulen tillader, at typen nedarves.
Skærmbilledet nedenfor viser den nedarvede (SUB) typesyntaks, der er oprettet med nøgleordet UNDER.
CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent> ( <attribute_l><datatype>, . ); /
Syntaks forklaring:
- Syntaksen ovenfor viser oprettelsen af SUB-typen. Den indeholder alle medlemmer og attributter fra den overordnede objekttype.
Eksempel 1: I eksemplet nedenfor bruger vi arveegenskaben til at indsætte en post med manager-id'et '1002' for posten ('RRR', 1007, 20000). Vi udfører programmet i følgende trin.
- Trin 1: Opret SUPER-typen.
- Trin 2: Opret SUB-typen og -brødteksten.
- Trin 3: Opret en anonym blok for at kalde SUB-typen.
Trin 1) Opret SUPER-typen eller overordnet typen.
Skærmbilledet nedenfor viser supertypen emp_object, der oprettes 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: Opretter objekttypen 'emp_object' med 4 attributter og 3 medlemmer. Den indeholder definitionen af en konstruktør med kun 3 parametre. Den er blevet deklareret som 'IKKE ENDELIG', så det er en overordnet type.
Trin 2) Opret SUB-typen under SUPER-typen.
Skærmbilledet nedenfor viser den nedarvede type sub_emp_object og dens brødtekst, der oprettes.
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: Opretter 'sub_emp_object' som den nedarvede type med den ekstra attribut 'default_manager' og en medlemsproceduredeklaration.
- Code linje 14: Opretter kroppen for den nedarvede objekttype.
- Code linje 16-21: Definerer den medlemsprocedure, der indsætter poster i tabellen 'emp' med værdierne fra SUPER-objekttypen, bortset fra manager-værdien. For manager-værdien bruges 'default_manager' fra SUB-typen.
Trin 3) Oprettelse af anonym blok til at kalde SUB-typen.
Skærmbilledet nedenfor viser den anonyme blok, der kalder SUB-typen og indsætter standardmanager-id'et.
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 implicitte konstruktør. Konstruktøren har 5 parametre (4 attributter fra PARENT-typen og 1 attribut fra SUB-typen). Den sidste parameter (1002) definerer værdien for default_manager-attributten.
- Code linje 28: Kald af medlemmet 'insert_default_mgr' for at indsætte posten med standardmanager-id'et, der er angivet i konstruktøren.
Ligestilling af PL/SQL-objekter
Objektinstanser, der tilhører den samme objekttype, kan sammenlignes for lighed. For at gøre dette skal objekttypen bruge en særlig metode kaldet ORDER-metoden.
Denne ORDER-metode skal være en funktion, der returnerer en numerisk type. Den tager to parametre som input (første parameter: id'et for self-objekt-instansen; anden parameter: id'et for en anden objektinstans).
Id'erne for de to objektinstanser sammenlignes, og resultatet returneres som et tal.
- En positiv værdi angiver, at SELF-objektinstansen er større end den anden instans.
- En negativ værdi angiver, at SELF-objektinstansen er mindre end den anden instans.
- Nul angiver, at SELF-objektinstansen er lig med den anden instans.
- Hvis en af instanserne er null, returnerer funktionen null.
Skærmbilledet nedenfor viser syntaksen for ORDER-medlemsfunktionen, der skal inkluderes i typeteksten for lighedskontrollen.
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-funktionen, der skal inkluderes i typeteksten for at kunne udføre lighedstjekket.
- Parameteren for denne funktion skal være en instans af samme objekttype.
- Funktionen kan kaldes "obj_instance_1.match(obj_instance_2)", og dette udtryk returnerer den viste numeriske værdi, hvor obj_instance_1 og obj_instance_2 er forekomster af objekttypen.
Eksempel 1: I det følgende eksempel sammenligner vi to objekter. Vi opretter to instanser og sammenligner attributten 'salary' mellem dem. Vi gør dette i to trin.
- Trin 1: Opret objekttypen og -brødteksten.
- Trin 2: Opret den anonyme blok for at sammenligne objektinstanserne.
Trin 1) Oprettelse af objekttypen og -kroppen.
Skærmbillederne nedenfor viser emp_object_equality-specifikationen og dens brødtekst, som definerer ORDER-funktionen, der sammenligner salary-attributten.
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: Opretter objekttypen 'emp_object_equality' med 1 attribut og 1 medlem.
- Code linje 6-16: Definition af ORDER-funktionen, der sammenligner attributten 'salary' for SELF-instansen og parameterinstansen. Den returnerer en negativ værdi, hvis SELF-lønnen er mindre, en positiv værdi, hvis SELF-lønnen er større, og 0, hvis lønningerne er ens.
Code Output:
Type oprettet
Trin 2) Oprettelse af den anonyme blok for at sammenligne objektinstanserne.
Skærmbilledet nedenfor viser den anonyme blok, der sammenligner to emp_object_equality-instanser efter løn.
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; /
Produktion
Salary of second instance is greater
Code Forklaring:
- Code linje 20: Deklarerer 'l_obj_1' af typen 'emp_object_equality'.
- Code linje 21: Deklarerer 'l_obj_2' af typen 'emp_object_equality'.
- Code linje 23: Initialiserer 'l_obj_1' med lønværdien '15000'.
- Code linje 24: Initialiserer 'l_obj_2' med lønværdien '17000'.
- Code linje 25-33: Udskriver beskeden baseret på det tal, der returneres af ORDER-funktionen.



















