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.

Objekttyper i PL/SQL

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.

  1. attribut
  2. 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.

Skapa objekt i OracleSkapa objekt i Oracle

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.

Deklarationsinitiering av objekttyp

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.

Deklarationsinitiering av objekttyp

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

konstruktörer

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);
/

konstruktörer

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

konstruktörer

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

konstruktörer

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.

Arv i objekttyp

CREATE TYPE <object_type_name_parent> AS OBJECT
(
<attribute_l><datatype>,
.
.
)NOT FINAL;
/

Syntaxförklaring:

  • Ovanstående syntax visar skapandet av SUPER-typ.

Arv i objekttyp

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.

Arv i objekttyp

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.

Arv i objekttyp

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

Arv i objekttyp

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.

Likhet mellan PL/SQL-objekt

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.

Likhet mellan PL/SQL-objekt

Likhet mellan PL/SQL-objekt

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.

Likhet mellan PL/SQL-objekt

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.

Dagligt Guru99-nyhetsbrev

Kickstarta dagen med de senaste och viktigaste AI-nyheterna som levereras just nu.