Oracle PL/SQL-objekttyper: CREATE TYPE med exempel
โก Smart sammanfattning
Objekttyper i PL/SQL gรถr objektorienterad programmering mรถjlig Oracle, vilket lรฅter dig modellera verkliga entiteter med attribut och metoder. De stรถder konstruktorer, arv och likhetsjรคmfรถrelse, sรฅ en enda schemanivรฅtyp kan lagra och bearbeta strukturerad data.

Vad รคr objekttyp i PL/SQL?
Objektorienterad programmering รคr sรคrskilt lรคmpad fรถr att bygga รฅteranvรคndbara komponenter och komplexa applikationer. Program รคr organiserade kring "objekt" snarare รคn "รฅtgรคrder"; det vill sรคga de รคr utformade fรถr att arbeta med och interagera med ett helt objekt snarare รคn en enda รฅtgรคrd. Denna metod lรฅter programmeraren fylla i och manipulera detaljer pรฅ objekt-entitetsnivรฅ.
Bilden nedan visar ett exempel pรฅ en objekttyp dรคr ett bankkonto behandlas som en objektenhet. Objektattributen innehรฅller vรคrden โ fรถr ett bankkonto รคr dessa kontonummer, banksaldo och sรฅ vidare โ medan objektmetoderna beskriver รฅtgรคrder som att berรคkna rรคntan eller generera ett bankutdrag, vilka var och en krรคver att en process slutfรถrs.
In PL / SQL, objektorienterad programmering รคr baserad pรฅ objekttyper. En objekttyp kan representera vilken verklig enhet som helst. Avsnitten nedan utforskar objekttyper, deras komponenter och hur man skapar och anvรคnder dem.
Komponenter av objekttyper
En PL/SQL-objekttyp innehรฅller huvudsakligen tvรฅ komponenter.
- attribut
- Medlemmar/Metoder
attribut
Attribut รคr de kolumner eller fรคlt dรคr data lagras. Varje attribut mappas till den datatyp som definierar bearbetnings- och lagringstypen fรถr det attributet. Ett attribut kan vara av vilket giltigt PL/SQL-datatyp, eller det kan vara av en annan objekttyp.
Medlemmar/Metoder
Medlemmarna, eller metoderna, รคr underprogram definierade inuti objekttypen. De anvรคnds inte fรถr att lagra data; istรคllet definierar de den bearbetning som utfรถrs inuti objekttypen โ till exempel validering av data innan objektet fylls i. De deklareras i objekttypspecifikationen och definieras i objekttypens brรถdtext. Brรถdtexten รคr valfri: om inga medlemmar finns har en objekttyp ingen brรถdtextdel.
Skapa objekt i Oracle
En objekttyp kan inte skapas pรฅ delprogramnivรฅ; den kan bara skapas pรฅ schemanivรฅ. Nรคr objekttypen har definierats i schemat kan den anvรคndas i delprogram. Objekttypen skapas med hjรคlp av kommandot "CREATE TYPE", och typtexten kan bara skapas efter att dess objekttyp finns.
Skรคrmbilderna nedan visar CREATE TYPE-syntaxen fรถr objektspecifikationen och CREATE TYPE BODY-syntaxen som definierar dess 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; . . ); /
Syntaxfรถrklaring:
- Syntaxen ovan visar skapandet av ett OBJECT med attribut och en OBJECT BODY med metoder.
- Metoderna kan ocksรฅ รถverbelastas i objektkroppen.
Deklarationsinitiering av objekttyp
Liksom andra komponenter i PL/SQL mรฅste objekttyper deklareras innan de anvรคnds i ett program. Nรคr objekttypen har skapats kan den anvรคndas i ett delprograms deklarativa sektion fรถr att deklarera en variabel av den objekttypen.
Nรคr en variabel deklareras som en objekttyp skapas en ny instans av objekttypen vid kรถrning, och denna nyskapade instans refereras till med variabelnamnet. Pรฅ sรฅ sรคtt kan en enda objekttyp lagra flera vรคrden under olika instanser.
Skรคrmdumpen nedan visar en variabel som deklareras som en objekttyp inuti en PL/SQL-block.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Syntaxfรถrklaring:
- Syntaxen ovan visar deklarationen av en variabel som en objekttyp i den deklarativa sektionen.
Nรคr variabeln har deklarerats som en objekttyp i ett delprogram รคr den atomiskt null โ hela objektet i sig รคr null. Den mรฅste initieras med vรคrden innan den kan anvรคndas i programmet. Objekt initieras med hjรคlp av konstruktorer.
Konstruktorer รคr den implicita metoden fรถr ett objekt som kan refereras till med samma namn som objekttypen. Skรคrmdumpen nedan visar initialiseringen av en objekttypinstans.
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
Syntaxfรถrklaring:
- Syntaxen ovan visar initialiseringen av objekttypinstansen med ett nullvรคrde.
- Sjรคlva objektet รคr inte lรคngre null nรคr det har initialiserats, men attributen inuti objektet fรถrblir null tills vรคrden tilldelas dem.
konstruktรถrer
Konstruktorer รคr den implicita metoden fรถr ett objekt som kan refereras till med samma namn som objekttypen. Nรคrhelst objektet refereras till fรถr fรถrsta gรฅngen anropas denna konstruktor implicit.
Du kan ocksรฅ initiera objekt med hjรคlp av dessa konstruktorer. En konstruktor kan definieras explicit genom att definiera en medlem i objekttypens brรถdtext med samma namn som objekttypen.
Exempel 1: I fรถljande exempel anvรคnder vi objekttypmedlemmen fรถr att infoga poster i emp-tabellen med vรคrdena ('RRR', 1005, 20000, 1000) och ('PPP', 1006, 20000, 1001). Nรคr data har infogats visar vi dem med hjรคlp av objekttypmedlemmen. Vi anvรคnder ocksรฅ en explicit konstruktor fรถr att fylla i manager-ID:t med standardvรคrdet 1001 fรถr den andra posten.
Vi utfรถr det i fรถljande steg.
- Steg 1: Skapa objekttypen och objekttypens brรถdtext.
- Steg 2: Skapa ett anonymt block fรถr att anropa objekttypen via den implicita konstruktorn fรถr emp_no 1005.
- Steg 3: Skapa ett anonymt block fรถr att anropa objekttypen via den explicita konstruktorn fรถr emp_no 1006.
Steg 1) Skapa objekttyp och objekttypstext.
Skรคrmdumpen nedan visar objekttypsspecifikationen emp_object som skapas med dess attribut och medlemmar.
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รคrmdumpen nedan visar hur emp_object-typen av kroppen skapas med den explicita konstruktorn och medlemsprocedurerna.
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 Fรถrklaring
- Code rad 1-9: Skapar objekttypen 'emp_object' med 4 attribut och 3 medlemmar. Den innehรฅller definitionen av en konstruktor med endast 3 parametrar. (Den faktiska implicita konstruktorn innehรฅller antalet parametrar som motsvarar antalet attribut som finns i objekttypen.)
- Code rad 10: Skapar typkroppen.
- Code rad 11-21: Definiera den explicita konstruktorn. Tilldela parametervรคrdena till attributen och ge attributet 'manager' standardvรคrdet '1001'.
- Code rad 22-26: Definierar medlemmen 'insert_records', dรคr attributvรคrdena infogas i tabellen 'emp'.
- Code rad 27-34: Definierar medlemmen 'display_records', som visar vรคrdena fรถr objekttypattributen.
Produktion:
Typ skapad
Skriv texten skapad
Steg 2) Skapar ett anonymt block fรถr att anropa den skapade objekttypen genom den implicita konstruktorn fรถr emp_no 1005.
Skรคrmdumpen nedan visar det anonyma blocket som anropar emp_object genom den implicita konstruktorn.
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 Fรถrklaring
- Code rad 37-45: Infogar posterna med hjรคlp av den implicita konstruktorn. Anropet till konstruktorn innehรฅller det faktiska antalet attributvรคrden.
- Code rad 38: Deklarerar 'guru_emp_det' som objekttypen 'emp_object'.
- Code rad 41: Satsen 'guru_emp_det.display_records' anropar medlemmen 'display_records' och attributvรคrdena visas.
- Code rad 42: Satsen 'guru_emp_det.insert_records' anropar medlemmen 'insert_records' och attributvรคrdena infogas i tabellen. Blocket bekrรคftar sedan transaktion.
Produktion:
Anstรคllds namn: RRR
Antal anstรคllda: 1005
Lรถn: 20000 XNUMX
Chef: 1000
Steg 3) Skapar ett anonymt block fรถr att anropa den skapade objekttypen genom den explicita konstruktorn fรถr emp_no 1006.
Skรคrmdumpen nedan visar det anonyma blocket som anropar emp_object genom den explicita konstruktorn med tre argument.
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 Fรถrklaring:
- Code rad 46-53: Infoga posten med hjรคlp av den explicita konstruktorn.
- Code rad 46: Deklarerar 'guru_emp_det' som objekttypen 'emp_object'.
- Code rad 50: Satsen 'guru_emp_det.display_records' anropar medlemmen 'display_records' och attributvรคrdena visas.
- Code rad 51: Satsen 'guru_emp_det.insert_records' anropar medlemmen 'insert_records' och attributvรคrdena infogas i tabellen. Eftersom endast tre argument skickas, sรคtter den explicita konstruktorn manager-ID:t till standardvรคrdet 1001.
Arv i objekttyp
Arvsegenskapen tillรฅter en underobjekttyp att komma รฅt alla attribut och medlemmar i superobjekttypen, eller รถverordnad objekttyp.
Underobjekttypen kallas รคrvd objekttyp och superobjekttypen kallas fรถrรคlderobjekttyp. Syntaxen nedan visar hur man skapar fรถrรคlder- och รคrvda objekttyper. Skรคrmdumpen nedan visar fรถrรคldertypens syntax (SUPER) markerad som INTE SLUTGILTIG.
CREATE TYPE <object_type_name_parent> AS OBJECT ( <attribute_l><datatype>, . . )NOT FINAL; /
Syntaxfรถrklaring:
- Syntaxen ovan visar hur SUPER-typen skapas. NOT FINAL-klausulen gรถr att typen kan รคrvas.
Skรคrmdumpen nedan visar den รคrvda (SUB) typsyntaxen som skapats med nyckelordet UNDER.
CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent> ( <attribute_l><datatype>, . ); /
Syntaxfรถrklaring:
- Syntaxen ovan visar hur SUB-typen skapas. Den innehรฅller alla medlemmar och attribut frรฅn den รถverordnade objekttypen.
Exempel 1: I exemplet nedan anvรคnder vi arvsegenskapen fรถr att infoga en post med hanterar-ID:t '1002' fรถr posten ('RRR', 1007, 20000). Vi kรถr programmet i fรถljande steg.
- Steg 1: Skapa SUPER-typen.
- Steg 2: Skapa SUB-typen och brรถdtexten.
- Steg 3: Skapa ett anonymt block fรถr att anropa SUB-typen.
Steg 1) Skapa SUPER-typ eller fรถrรคldertyp.
Skรคrmdumpen nedan visar supertypen emp_object som skapas 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 Fรถrklaring:
- Code rad 1-9: Skapar objekttypen 'emp_object' med 4 attribut och 3 medlemmar. Den innehรฅller definitionen av en konstruktor med endast 3 parametrar. Den har deklarerats som 'NOT FINAL', sรฅ det รคr en fรถrรคldertyp.
Steg 2) Skapa SUB-typen under SUPER-typen.
Skรคrmdumpen nedan visar den รคrvda typen sub_emp_object och dess brรถdtext som skapas.
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 Fรถrklaring:
- Code rad 10-13: Skapar 'sub_emp_object' som den รคrvda typen med ytterligare attributet 'default_manager' och en medlemsproceduredeklaration.
- Code rad 14: Skapar brรถdtexten fรถr den รคrvda objekttypen.
- Code rad 16-21: Definierar medlemsproceduren som infogar poster i tabellen 'emp' med vรคrdena frรฅn SUPER-objekttypen, fรถrutom vรคrdet manager. Fรถr vรคrdet manager anvรคnds 'default_manager' frรฅn SUB-typen.
Steg 3) Skapa anonymt block fรถr att anropa SUB-typen.
Skรคrmdumpen nedan visar det anonyma blocket som anropar SUB-typen och infogar standardhanterar-ID:t.
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 Fรถrklaring:
- Code rad 25: Deklarerar 'guru_emp_det' som typen 'sub_emp_object'.
- Code rad 27: Initierar objektet med den implicita konstruktorn. Konstruktorn har 5 parametrar (4 attribut frรฅn PARENT-typen och 1 attribut frรฅn SUB-typen). Den sista parametern (1002) definierar vรคrdet fรถr default_manager-attributet.
- Code rad 28: Anropar medlemmen 'insert_default_mgr' fรถr att infoga posten med standardhanterar-ID:t som angetts i konstruktorn.
Likhet mellan PL/SQL-objekt
Objektinstanser som tillhรถr samma objekttyp kan jรคmfรถras fรถr att sรคkerstรคlla likhet. Fรถr att gรถra detta behรถver objekttypen en speciell metod som kallas ORDER-metoden.
Denna ORDER-metod ska vara en funktion som returnerar en numerisk typ. Den tar tvรฅ parametrar som indata (fรถrsta parametern: id:t fรถr self-object-instansen; andra parametern: id:t fรถr en annan objektinstans).
ID:n fรถr de tvรฅ objektinstanserna jรคmfรถrs och resultatet returneras som ett tal.
- Ett positivt vรคrde indikerar att SELF-objektinstansen รคr stรถrre รคn den andra instansen.
- Ett negativt vรคrde indikerar att SELF-objektinstansen รคr mindre รคn den andra instansen.
- Noll indikerar att SELF-objektinstansen รคr lika med den andra instansen.
- Om nรฅgon av instanserna รคr null returnerar funktionen null.
Skรคrmdumpen nedan visar syntaxen fรถr ORDER-medlemsfunktionen som mรฅste inkluderas i typtexten fรถr likhetskontrollen.
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; . . ); /
Syntaxfรถrklaring:
- Syntaxen ovan visar ORDER-funktionen som mรฅste inkluderas i typtexten fรถr likhetskontrollen.
- Parametern fรถr denna funktion bรถr vara en instans av samma objekttyp.
- Funktionen kan anropas som "obj_instance_1.match(obj_instance_2)", och detta uttryck returnerar det visade numeriska vรคrdet, dรคr obj_instance_1 och obj_instance_2 รคr instanser av objekttypen.
Exempel 1: I fรถljande exempel jรคmfรถr vi tvรฅ objekt. Vi skapar tvรฅ instanser och jรคmfรถr attributet 'salary' mellan dem. Vi gรถr detta i tvรฅ steg.
- Steg 1: Skapa objekttypen och brรถdtexten.
- Steg 2: Skapa det anonyma blocket fรถr att jรคmfรถra objektinstanserna.
Steg 1) Skapa objekttypen och brรถdtexten.
Skรคrmbilderna nedan visar specifikationen emp_object_equality och dess brรถdtext, som definierar ORDER-funktionen som jรคmfรถr attributet salary.
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 Fรถrklaring:
- Code rad 1-4: Skapar objekttypen 'emp_object_equality' med 1 attribut och 1 medlem.
- Code rad 6-16: Definierar ORDER-funktionen som jรคmfรถr attributet 'salary' fรถr SELF-instansen och parameterinstansen. Den returnerar ett negativt vรคrde om SELF-lรถnen รคr lรคgre, ett positivt vรคrde om SELF-lรถnen รคr hรถgre och 0 om lรถnerna รคr lika.
Code Produktion:
Typ skapad
Steg 2) Skapa det anonyma blocket fรถr att jรคmfรถra objektinstanserna.
Skรคrmdumpen nedan visar det anonyma blocket som jรคmfรถr tvรฅ 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 Fรถrklaring:
- Code rad 20: Deklarerar 'l_obj_1' av typen 'emp_object_equality'.
- Code rad 21: Deklarerar 'l_obj_2' av typen 'emp_object_equality'.
- Code rad 23: Initierar 'l_obj_1' med lรถnevรคrdet '15000'.
- Code rad 24: Initierar 'l_obj_2' med lรถnevรคrdet '17000'.
- Code rad 25-33: Skriver ut meddelandet baserat pรฅ numret som returneras av ORDER-funktionen.


















