Oracle Handledning för PL/SQL-objekttyper med EXEMPEL
Vad är objekttyp i PL/SQL?
Objektorienterad programmering är speciellt lämpad för att bygga återanvändbara komponenter och komplexa applikationer. De är organiserade kring "objekt" snarare än "åtgärder", dvs programmen är designade för att fungera och interagera med hela objektet snarare än den enstaka åtgärden. Detta koncept tillåter programmeraren att fylla i och manipulera detaljerna på objektenhetsnivå.
Bilden nedan visar ett exempel på den objekttyp där ett bankkonto anses vara en objektenhet. Objektattributen inkluderar saker som har vissa attributvärden, till exempel i Bankkonto; det är kontonummer, banksaldo, etc. medan objektmetoder beskriver saker som att beräkna ränta, generera kontoutdrag etc. som kräver att en viss process slutförs.
I PL/SQL baseras objektorienterad programmering på objekttyper.
En objekttyp kan representera vilken verklig enhet som helst. Vi kommer att diskutera fler objekttyper i det här kapitlet.
Komponenter av objekttyper
PL / SQL objekttypen innehåller huvudsakligen två komponenter.
- attribut
- Medlemmar/Metoder
attribut
Attribut är kolumnen eller fältet där data lagras. Varje attribut kommer att mappas till den datatyp som definierar bearbetnings- och lagringstypen för det attributet. Attributet kan vara vilket som helst giltigt PL/SQL-datatyp, eller det kan vara av en annan objekttyp.
Medlemmar/Metoder
Medlemmar eller metoder är underprogram som definieras i objekttypen. De används inte för att lagra data. De används huvudsakligen för att definiera process inuti objekttypen. För exempel på att validera data innan objekttypen fylls i. De deklareras i objekttypssektionen och definieras i objekttypens bodysektion för objekttypen. Kroppssektion i objekttyp är en valfri del. Om det inte finns några medlemmar kommer en objekttyp inte att innehålla någon kroppsdel.
Skapa objekt i Oracle
En objekttyp kan inte skapas på underprogramnivå, De kan bara skapas på schemanivå. När objekttypen väl är definierad i schemat kan densamma användas i underprogram. Objekttypen kan skapas med 'SKAPA TYP'. Typkroppen kan endast skapas efter att dess objekttyp har skapats.
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:
- Ovanstående syntax visar skapandet av 'OBJECT' med attribut och 'OBJECT-BODY' med metoder.
- Metoderna kan också överbelastas i objektkroppen.
Deklarationsinitiering av objekttyp
Liksom andra komponenter i PL/SQL måste även objekttyper deklareras innan de används i programmet.
När objekttypen väl har skapats kan den användas i underprogrammets deklarativa sektion för att deklarera en variabel av den objekttypen.
Närhelst någon variabel deklareras i underprogrammet som objekttyp, kommer en ny instans av objekttypen att skapas under körning, och denna nyskapade instans kan hänvisas till variabelnamnet. På så sätt kan en enskild objekttyp lagra flera värden under olika instanser.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Syntaxförklaring:
- Ovanstående syntax visar deklarationen av en variabel som en objekttyp i det deklarativa avsnittet.
När variabeln väl har deklarerats som en objekttyp i ett underprogram kommer den att vara atomärt noll, dvs hela objektet i sig är null. Det måste initieras med värden för att kunna använda dem i programmet. De kan initieras med hjälp av konstruktörer.
Konstruktörer är den implicita metoden för ett objekt som kan hänvisas till med samma namn som objekttypen. Syntaxen nedan visar initieringen av objekttypen.
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
Syntaxförklaring:
- Ovanstående syntax visar initieringen av objekttypsinstansen med ett nollvärde.
- Nu är inte objektet i sig null då det har initierats, men attributen inuti objektet kommer att vara null då vi inte har tilldelat några värden till dessa attribut.
konstruktörer
Konstruktörer är den implicita metoden för ett objekt som kan hänvisas till med samma namn som objekttypen. Närhelst objektet hänvisas för första gången kommer denna konstruktor att anropas implicit.
Vi kan också initiera objekten med hjälp av dessa konstruktorer. Konstruktorn kan definieras explicit genom att definiera medlemmen i objekttypskroppen med samma namn på objekttypen.
Exempelvis 1: I följande exempel kommer vi att använda objekttypsmedlemmen för att infoga posten i emp-tabellen med värden ('RRR', 1005, 20000, 1000) och ('PPP', 1006, 20000, 1001). När data har infogats kommer vi att visa densamma med hjälp av objekttypsmedlem. Vi kommer också att använda den explicita konstruktorn för att fylla i manager-id som standard med 1001-värdet för den andra posten.
Vi kommer att utföra det i stegen nedan.
- Step1:
- Skapa objekttyp
- Objekttypskropp
- Steg 2: Skapa ett anonymt block för att anropa skapad objekttyp genom implicit konstruktor för emp_no 1005.
- Steg 3: Skapa ett anonymt block för att anropa skapad objekttyp genom explicit konstruktor för emp_no 1006.
Steg 1) Skapa objekttyp och objekttypskropp
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: /
Kodförklaring
- Kodrad 1-9: Skapar objekttypen 'emp_object' med 4 attribut och 3 medlemmar. Den innehåller definitionen av konstruktörer med endast 3 parametrar. (Faktisk implicit konstruktor kommer att innehålla antalet parametrar lika med antalet attribut som finns i objekttypen)
- Kodrad 10: Skapar texttexten.
- Kodrad 11-21: Definierar den explicita konstruktorn. Tilldela parametervärdet till attributen och tilldela värdet för attributet 'manager' med standardvärdet '1001'.
- Kodrad 22-26: Definierar medlemmen 'insert_records' där attributvärdena infogas i 'emp'-tabellen.
- Kodrad 27-34: Definierar medlemmen 'display_records' där värdena för objekttypsattributen visas.
Produktion
Typ skapad
Skriv texten skapad
Steg 2) Skapar anonymt block för att anropa skapad objekttyp genom implicit konstruktor för emp_nr 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;
Kodförklaring
- Kodrad 37-45: Infogar posterna med den implicita konstruktorn. Call to constructor innehåller det faktiska antalet attributvärden.
- Kodrad 38: Deklarerar guru_emp_det som objekttyp för 'emp_object'.
- Kodrad 41: Uttalandet 'guru_emp_det.display_records' kallas 'diplay_records'-medlemsfunktionen och attributvärdena visas
- Kodrad 42: Påståendet 'guru_emp_det.insert_records' kallas medlemsfunktionen 'insert_records' och attributvärdena infogas i tabellen.
Produktion
Anställds namn: RRR
Antal anställda: 1005
Lön: 20000 XNUMX
Chef: 1000
Steg 3) Skapar anonymt block för att anropa skapad objekttyp genom explicit konstruktor för emp_nr 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
Kodförklaring:
- Kodrad 46-53: Infogar posterna med den explicita konstruktorn.
- Kodrad 46: Deklarerar guru_emp_det som objekttyp för 'emp_object'.
- Kodrad 50: Uttalandet 'guru_emp_det.display_records' kallas medlemsfunktionen 'display_records' och attributvärdena visas
- Kodrad 51: Påståendet 'guru_emp_det.insert_records' kallas medlemsfunktionen 'insert_records' och attributvärdena infogas i tabellen.
Arv i objekttyp
Arvsegenskapen tillåter subobjekttypen att komma åt alla attribut och medlemmar av superobjekttypen eller överordnad objekttyp.
Subobjekttypen kallas ärvd objekttyp och superobjekttypen kallas överordnad objekttyp. Syntaxen nedan visar hur man skapar en överordnad och ärvd objekttyp.
CREATE TYPE <object_type_name_parent> AS OBJECT ( <attribute_l><datatype>, . . )NOT FINAL; /
Syntaxförklaring:
- Ovanstående syntax visar skapandet av SUPER-typ.
CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent> ( <attribute_l><datatype>, . ); /
Syntaxförklaring:
- Ovanstående syntax visar skapandet av SUB-typ. Den innehåller alla medlemmar och attribut från den överordnade objekttypen.
Example1: I exemplet nedan kommer vi att använda arvsegenskapen för att infoga posten med manager-id som '1002' för följande post ('RRR', 1007, 20000).
Vi kommer att köra ovanstående program i följande steg
- Steg 1: Skapa SUPER-typ.
- Steg 2: Skapa SUB-typ och text.
- Steg 3: Skapa ett anonymt block för att anropa SUB-typen.
Steg 1) Skapa SUPER-typ eller överordnad typ.
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; /
Kodförklaring:
- Kodrad 1-9: Skapar objekttypen 'emp_object' med 4 attribut och 3 medlemmar. Den innehåller definitionen av konstruktörer med endast 3 parametrar. Det har deklarerats som "NOT FINAL" så det är av överordnad typ.
Steg 2) Skapa SUB-typ under SUPER-typ.
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; /
Kodförklaring:
- Kodrad 10-13: Skapar sub_emp_object som ärvd typ med ytterligare ett attribut 'default_manager' och medlemsprocedurdeklaration.
- Kodrad 14: Skapar brödtexten för den ärvda objekttypen.
- Kodrad 16-21: Definierar medlemsproceduren som infogar posterna i "emp"-tabellen med värdena från 'SUPER'-objekttypen, med undantag för managervärde. För förvaltarvärde använder den "default_manager" från typen "SUB".
Steg 3) Skapar anonymt block för att anropa 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; /
Kodförklaring:
- Kodrad 25: Deklarerar 'guru_emp_det' som typen 'sub_emp_object'.
- Kodrad 27: Initiering av objektet med den implicita konstruktorn. Konstruktören har 5 parametrar (4 attribut från PARENT-typ och 2 attribut från SUB-typ). Den sista parametern (1002) definierar värdet för default_manager-attributet
- Kodrad 28: Anropar medlemmen 'insert_default_mgr' för att infoga posterna med standardhanterar-id:t skickat i konstruktorn.
Likhet mellan PL/SQL-objekt
Den objektinstans som hör till samma objekt kan jämföras för likhet. För detta måste vi ha den speciella metoden i objekttypen som kallas 'ORDER'-metoden.
Denna 'ORDER'-metod bör vara funktionen som returnerar numerisk typ. Den tar två parametrar som indata, (första parametern: id för självobjektsinstansen, andra parameter: id för en annan objektinstans).
ID:t för instansen med två objekt jämförs och resultatet returneras i numerisk form.
- Positivt värde representerar att SELF-objektinstansen är större än en annan instans.
- Negativt värde representerar att SELF-objektinstansen är mindre än en annan instans.
- Noll representerar att SELF-objektinstansen är lika med en annan instans.
- Om någon av instanserna är null, kommer denna funktion att returnera 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; . . ); /
Syntaxförklaring:
- Ovanstående syntax visar ORDER-funktionen som måste inkluderas i typkroppen för likhetskontroll.
- Parametern för denna funktion bör vara en instans av samma objekttyp.
- Ovanstående funktion kan kallas "obj_instance_1.match(obj_instance_2)" och detta uttryck kommer att returnera det numeriska värdet som visas, där obj_instance_1 och obj_instance_2 är instansen av objekttypsnamn.
example1: I följande exempel ska vi se hur man jämför två objekt. Vi kommer att skapa två instanser och vi kommer att jämföra attributet "lön" mellan dem. Vi ska göra int två steg.
- Steg 1: Skapa objekttyp och kropp.
- Steg 2: Skapa det anonyma blocket att anropa jämför objektinstansen.
Steg 1) Skapa objekttyp och kropp.
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; /
Kodförklaring:
- Kodrad 1-4: Skapar objekttypen 'emp_object_equality' med 1 attribut och 1 medlem.
- Kodrad 6-16: Definierar ORDER-funktionen som jämför "lön"-attributet för SELF-instans och parameterinstanstyp. Den returnerar negativt om SELF-lönen är lägre eller positiv om SELF-lönen är större och 0 om lönerna är lika.
Kodutgång:
Typ skapad
Steg 2) Skapa det anonyma blocket att anropa jämför objektinstansen.
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
Kodförklaring:
- Kodrad 20: Deklarerar l_obj_1 av typen emp_object_equality.
- Kodrad 21: Deklarerar l_obj_2 av typen emp_object_equality.
- Kodrad 23: Initialisering av l_obj_1 med lönevärde som '15000'
- Kodrad 24: Initialisering av l_obj_1 med lönevärde som '17000'
- Kodrad 25-33: Skriv ut meddelandet baserat på returnumret från ORDER-funktionen.
Sammanfattning
I det här kapitlet har vi sett objekttypen och deras egenskaper. Vi har också diskuterat om konstruktörer, medlemmar, attribut, arv och jämlikhet i PL/SQL-objekt.