Oracle Opplæring i PL/SQL-objekttyper med EKSEMPLER

Hva er objekttype i PL/SQL?

Objektorientert programmering er spesielt egnet for å bygge gjenbrukbare komponenter og komplekse applikasjoner. De er organisert rundt "objekter" i stedet for "handlinger", dvs. programmene er designet for å fungere og samhandle med hele objektet i stedet for enkelthandlingen. Dette konseptet lar programmereren fylle ut og manipulere detaljene på objektenhetsnivå.

Bildet nedenfor viser et eksempel på objekttypen der en bankkonto regnes som en objektenhet. Objektattributtene inkluderer ting som har noen attributtverdier, for eksempel i bankkonto; det er kontonummer, banksaldo osv. mens objektmetoder beskriver ting som å beregne rente, generere kontoutskrift osv. som krever at en viss prosess er fullført.

Objekttyper i PL/SQL

I PL/SQL er objektorientert programmering basert på objekttyper.

En objekttype kan representere en hvilken som helst enhet i den virkelige verden. Vi skal diskutere flere objekttyper i dette kapittelet.

Komponenter av objekttyper

PL / SQL objekttype inneholder hovedsakelig to komponenter.

  1. attributter
  2. Medlemmer/metoder

attributter

Attributter er kolonnen eller feltet der data lagres. Hvert attributt vil bli tilordnet til datatypen som definerer behandlings- og lagringstypen for det attributtet. Attributtet kan være gyldig PL/SQL datatype, eller det kan være av en annen objekttype.

Medlemmer/metoder

Medlemmer eller Metoder er underprogrammer som er definert i objekttypen. De brukes ikke til å lagre data. De brukes hovedsakelig til å definere prosess inne i objekttypen. For eksempler på å validere data før du fyller ut objekttypen. De er deklarert i objekttypedelen og definert i objekttypekroppsdelen av objekttypen. Brøddel i objekttype er en valgfri del. Hvis ingen medlemmer er til stede, vil en objekttype ikke inneholde noen kroppsdel.

Lag objekt i Oracle

En objekttype kan ikke opprettes på underprogramnivå, de kan bare opprettes på skjemanivå. Når objekttypen er definert i skjemaet, kan den samme brukes i underprogrammer. Objekttypen kan opprettes ved å bruke 'CREATE TYPE'. Typeteksten kan bare opprettes etter å ha opprettet objekttypen.

Lag objekt i OracleLag 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:

  • Syntaksen ovenfor viser opprettelsen av 'OBJECT' med attributter og 'OBJECT-BODY' med metoder.
  • Metodene kan også overbelastes i objektkroppen.

Erklæringsinitialisering av objekttype

Som andre komponenter i PL/SQL, er det også nødvendig å deklarere objekttyper før de brukes i programmet.

Når objekttypen er opprettet, kan den brukes i underprogramdeklarasjonsdelen for å erklære en variabel av den objekttypen.

Hver gang en variabel er deklarert i underprogrammet som objekttype, vil en ny forekomst av objekttypen bli opprettet under kjøring, og denne nyopprettede forekomsten kan refereres til variabelnavnet. På denne måten kan en enkelt objekttype lagre flere verdier under forskjellige forekomster.

Erklæringsinitialisering av objekttype

DECLARE
<variable_name> <object_type_name>;
BEGIN
.
.
END;
/

Syntaks forklaring:

  • Syntaksen ovenfor viser deklarasjonen av en variabel som en objekttype i den deklarative delen.

Når variabelen er erklært som en objekttype i et underprogram, vil den være atomisk null, dvs. hele objektet i seg selv en null. Det må initialiseres med verdier for å bruke dem i programmet. De kan initialiseres ved hjelp av konstruktører.

Konstruktører er den implisitte metoden til et objekt som kan refereres til med samme navn som objekttypen. Syntaksen nedenfor viser initialiseringen av objekttypen.

Erklæringsinitialisering av objekttype

DECLARE
<variable_name> <object_type_name>; 
BEGIN
<variable_name>:=<object_type_name>();
END;
/

Syntaks forklaring:

  • Syntaksen ovenfor viser initialiseringen av objekttypeforekomsten med en nullverdi.
  • Nå er ikke selve objektet null ettersom det har blitt initialisert, men attributtene inne i objektet vil være null da vi ikke har tildelt noen verdier til disse attributtene.

Konstruktører

Konstruktører er den implisitte metoden til et objekt som kan refereres til med samme navn som objekttypen. Når objektet blir referert for første gang, vil denne konstruktøren bli kalt implisitt.

Vi kan også initialisere objektene ved å bruke denne konstruktøren. Konstruktøren kan defineres eksplisitt ved å definere medlemmet i objekttypekroppen med samme navn som objekttypen.

Eksempel 1: I det følgende eksempelet skal vi bruke objekttypemedlemmet til å sette inn posten i emp-tabellen med verdier ('RRR', 1005, 20000, 1000) og ('PPP', 1006, 20000, 1001). Når dataene er satt inn, skal vi vise det samme ved å bruke objekttypemedlem. Vi kommer også til å bruke den eksplisitte konstruktøren til å fylle ut manager-IDen som standard med 1001-verdien for den andre posten.

Vi skal utføre det i trinnene nedenfor.

  • Step1:
  • Opprett objekttype
  • Objekttype kropp
  • Trinn 2: Opprette en anonym blokk for å kalle opprettet objekttype gjennom implisitt konstruktør for emp_no 1005.
  • Trinn 3: Opprette en anonym blokk for å kalle opprettet objekttype gjennom eksplisitt konstruktør for emp_no 1006.

Trinn 1) Opprett objekttype og objekttypebrødtekst

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: Opprette 'emp_object'-objekttypen med 4 attributter og 3 medlemmer. Den inneholder definisjonen av konstruktører med bare 3 parametere. (Faktisk implisitt konstruktør vil inneholde antall parametere lik antall attributter som er tilstede i objekttypen)
  • Kodelinje 10: Oppretter tekstteksten.
  • Kodelinje 11-21: Definerer den eksplisitte konstruktøren. Tilordne parameterverdien til attributtene og tilordne verdien for attributtet 'manager' med standardverdien '1001'.
  • Kodelinje 22-26: Definerer medlemmet 'insert_records' der attributtverdiene settes inn i 'emp'-tabellen.
  • Kodelinje 27-34: Definerer medlemmet 'display_records' som viser verdiene til objekttypeattributtene.

Produksjon

Type opprettet

Skriv brødtekst opprettet

Trinn 2) Opprette anonym blokk for å kalle opprettet objekttype gjennom implisitt konstruktør for 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: Setter inn postene ved å bruke den implisitte konstruktøren. Call to constructor inneholder det faktiske antallet attributtverdier.
  • Kodelinje 38: Erklærer guru_emp_det som objekttype for 'emp_object'.
  • Kodelinje 41: Utsagn 'guru_emp_det.display_records' kalt 'diplay_records'-medlemsfunksjonen og attributtverdiene vises
  • Kodelinje 42: Utsagn 'guru_emp_det.insert_records' kalt 'insert_records'-medlemsfunksjonen og attributtverdiene settes inn i tabellen.

Produksjon

Ansatt navn: RRR

Ansattnummer: 1005

Lønn: 20000

Leder: 1000

Trinn 3) Opprette anonym blokk for å kalle opprettet objekttype gjennom eksplisitt konstruktør for 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;
/

Produksjon

Employee Name:PPP 
Employee Number:1006 
Salary:20000 
Manager:1001

Kodeforklaring:

  • Kodelinje 46-53: Setter inn postene ved å bruke den eksplisitte konstruktøren.
  • Kodelinje 46: Erklærer guru_emp_det som objekttype for 'emp_object'.
  • Kodelinje 50: Utsagn 'guru_emp_det.display_records' kalt 'display_records'-medlemsfunksjonen og attributtverdiene vises
  • Kodelinje 51: Utsagn 'guru_emp_det.insert_records' kalt 'insert_records'-medlemsfunksjonen og attributtverdiene settes inn i tabellen.

Arv i objekttype

Arveegenskap lar subobjekttypen få tilgang til alle attributtene og medlemmene av superobjekttypen eller overordnet objekttype.

Underobjekttypen kalles arvet objekttype, og superobjekttypen kalles overordnet objekttype. Syntaksen nedenfor viser hvordan du oppretter overordnet og arvet objekttype.

Arv i objekttype

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

Syntaks forklaring:

  • Syntaksen ovenfor viser opprettelsen av SUPER-typen.

Arv i objekttype

CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent>
(
<attribute_l><datatype>,
.
);
/

Syntaks forklaring:

  • Syntaksen ovenfor viser oppretting av SUB-type. Den inneholder alle medlemmene og attributtene fra den overordnede objekttypen.

Example1: I eksemplet nedenfor skal vi bruke arveegenskapen til å sette inn posten med manager-ID som '1002' for følgende post ('RRR', 1007, 20000).

Vi skal utføre programmet ovenfor i følgende trinn

  • Trinn 1: Lag SUPER-type.
  • Trinn 2: Lag SUB-type og kropp.
  • Trinn 3: Opprette en anonym blokk for å ringe SUB-typen.

Trinn 1) Opprett 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: Opprette 'emp_object'-objekttypen med 4 attributter og 3 medlemmer. Den inneholder definisjonen av konstruktører med bare 3 parametere. Den har blitt erklært som 'IKKE FINAL', så den er overordnet.

Trinn 2) Opprett 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: Opprette sub_emp_object som arvet type med ytterligere ett attributt 'default_manager' og medlemsprosedyreerklæring.
  • Kodelinje 14: Oppretter brødteksten for den arvede objekttypen.
  • Kodelinje 16-21: Definerer medlemsprosedyren som setter inn postene i "emp"-tabellen med verdiene fra 'SUPER'-objekttypen, bortsett fra managerverdien. For managerverdi bruker den 'default_manager' fra 'SUB'-typen.

Trinn 3) Oppretter anonym blokk for å ringe 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: Initialiserer objektet med den implisitte konstruktøren. Konstruktøren har 5 parametere (4 attributter fra PARENT-type og 2 attributter fra SUB-type). Den siste parameteren (1002) definerer verdien for default_manager-attributtet
  • Kodelinje 28: Kaller medlemmet 'insert_default_mgr' for å sette inn postene med standard manager-ID sendt i konstruktøren.

Likhet mellom PL/SQL-objekter

Objektforekomsten som tilhører de samme objektene kan sammenlignes for likhet. For dette må vi ha den spesielle metoden i objekttypen kalt 'ORDER'-metoden.

Denne 'ORDER'-metoden skal være funksjonen som returnerer numerisk type. Den tar to parametere som input, (første parameter: id for selvobjektforekomsten, andre parameter: ID for en annen objektforekomst).

ID-en til de to objektforekomstene sammenlignes, og resultatet returneres i numerisk.

  • Positiv verdi representerer at SELF-objektforekomsten er større enn en annen forekomst.
  • Negativ verdi representerer at SELF-objektforekomsten er mindre enn en annen forekomst.
  • Null representerer at SELF-objektforekomsten er lik en annen forekomst.
  • Hvis noen av forekomstene er null, vil denne funksjonen returnere null.

Likhet mellom 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:

  • Syntaksen ovenfor viser ORDER-funksjonen som må inkluderes i typelegemet for likhetssjekk.
  • Parameteren for denne funksjonen skal være en forekomst av samme objekttype.
  • Funksjonen ovenfor kan kalles "obj_instance_1.match(obj_instance_2)", og dette uttrykket vil returnere den numeriske verdien som vist, der obj_instance_1 og obj_instance_2 er forekomsten av objekttypenavn.

example1: I det følgende eksempelet skal vi se hvordan vi sammenligner to objekter. Vi skal opprette to forekomster, og vi skal sammenligne attributtet "lønn" mellom dem. Vi skal gjøre to trinn.

  • Trinn 1: Opprette objekttypen og kroppen.
  • Trinn 2: Opprett den anonyme blokken for å ringe sammenlign objektforekomsten.

Trinn 1) Opprette objekttype og kropp.

Likhet mellom PL/SQL-objekter

Likhet mellom 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: Opprette 'emp_object_equality'-objekttypen med 1 attributter og 1 medlem.
  • Kodelinje 6-16: Definerer ORDER-funksjonen som sammenligner 'lønn'-attributtet til SELF-forekomst og parameterforekomsttype. Den returnerer negativt hvis SELV-lønnen er mindre eller positiv hvis SELV-lønnen er større og 0 hvis lønningene er like.

Kodeutgang:

Type opprettet

Trinn 2) Opprette den anonyme blokken som skal kalles, sammenligne objektforekomsten.

Likhet mellom 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;
/

Produksjon

Salary of second instance is greater

Kodeforklaring:

  • Kodelinje 20: Erklærer l_obj_1 av typen emp_object_equality.
  • Kodelinje 21: Erklærer l_obj_2 av typen emp_object_equality.
  • Kodelinje 23: Initialiserer l_obj_1 med lønnsverdi som '15000'
  • Kodelinje 24: Initialiserer l_obj_1 med lønnsverdi som '17000'
  • Kodelinje 25-33: Skriv ut meldingen basert på returnummeret fra ORDER-funksjonen.

Oppsummering

I dette kapittelet har vi sett objekttypen og deres egenskaper. Vi har også diskutert om konstruktører, medlemmer, attributter, arv og likhet i PL/SQL-objekter.