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.