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.

Objekttyper i PL/SQL

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.

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

Opret objekt i OracleOpret 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;โ€ญ
.
.	โ€ฌ
);
/

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.

Erklรฆring Initialisering af objekttype

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.

Erklรฆring Initialisering af objekttype

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

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:
/

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

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;

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

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

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.

Arv i objekttype

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

Syntaks forklaring:

  • Ovenstรฅende syntaks viser oprettelsen af โ€‹โ€‹SUPER type.

Arv i objekttype

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.

Arv i objekttype

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.

Arv i objekttype

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

Arv i objekttype

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.

Ligestilling af PL/SQL-objekter

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.

Ligestilling af PL/SQL-objekter

Ligestilling af PL/SQL-objekter

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.

Ligestilling af PL/SQL-objekter

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.

Opsummer dette indlรฆg med: