Oracle PL / SQL-objecttypen zelfstudie met VOORBEELDEN

Wat is objecttype in PL / SQL?

Objectgeoriënteerd programmeren is vooral geschikt voor het bouwen van herbruikbare componenten en complexe applicaties. Ze zijn georganiseerd rond "objecten" in plaats van "acties", dwz de programma's zijn ontworpen om te werken en interactie te hebben met het hele object in plaats van de enkele actie. Met dit concept kan de programmeur de details op het niveau van objectentiteiten invullen en manipuleren.

Onderstaande afbeelding toont een voorbeeld van het objecttype waarin een bankrekening wordt beschouwd als een objectentiteit. De objectattributen omvatten zaken die bepaalde attribuutwaarden bevatten, bijvoorbeeld in Bankrekening; het is rekeningnummer, banksaldo, enz. terwijl objectmethoden zaken beschrijven als het berekenen van de rentevoet, het genereren van bankafschriften, enz. waarvoor een bepaald proces moet worden voltooid.

In PL / SQL is objectgeoriënteerd programmeren gebaseerd op objecttypen.

Een objecttype kan elke werkelijke entiteit vertegenwoordigen. In dit hoofdstuk gaan we meer objecttypen bespreken.

In deze tutorial leer je,

  • Componenten van objecttypen
  • Maak een object in Oracle
  • Declaratie-initialisatie van objecttype
  • Constructeurs
  • Overerving in objecttype
  • Gelijkheid van PL / SQL-objecten

Componenten van objecttypen

Het PL / SQL-objecttype bevat hoofdzakelijk twee componenten.

  1. Attributen
  2. Leden / methoden

Attributen

Attributen zijn de kolom of het veld waarin gegevens worden opgeslagen. Elk kenmerk wordt toegewezen aan het datatype dat het verwerkings- en opslagtype voor dat kenmerk definieert. Het attribuut kan van elk geldig PL / SQL-datatype zijn, of het kan van een ander objecttype zijn.

Leden / methoden

Leden of methoden zijn subprogramma's die zijn gedefinieerd in het objecttype. Ze worden niet gebruikt om gegevens op te slaan. Ze worden voornamelijk gebruikt om het proces binnen het objecttype te definiëren. Voor voorbeelden die gegevens valideren voordat het objecttype wordt ingevuld. Ze worden gedeclareerd in het objecttype-gedeelte en gedefinieerd in het objecttype-hoofdgedeelte van het objecttype. Hoofdgedeelte in objecttype is een optioneel onderdeel. Als er geen leden aanwezig zijn, bevat een objecttype geen lichaamsdeel.

Maak een object in Oracle

Een objecttype kan niet op subprogrammaniveau worden gemaakt. Ze kunnen alleen op schemaniveau worden gemaakt. Zodra het objecttype in het schema is gedefinieerd, kan hetzelfde worden gebruikt in subprogramma's. Het objecttype kan worden aangemaakt met 'CREATE TYPE'. Het type body kan alleen worden gemaakt nadat het objecttype is gemaakt.

CREATE TYPE AS OBJECT(,… );/CREATE TYPE BODY AS OBJECT(MEMBER[PROCEDURE|FUNCTION]ISBEGINEND;‭… ‬);/

Syntaxis Uitleg:

  • De bovenstaande syntaxis toont het creëren van 'OBJECT' met attributen en 'OBJECT-BODY' met methoden.
  • De methoden kunnen ook in de objectbody worden overbelast.

Declaratie-initialisatie van objecttype

Net als andere componenten in PL / SQL, moeten objecttypen ook worden gedeclareerd voordat ze in het programma worden gebruikt.

Zodra het objecttype is gemaakt, kan het worden gebruikt in de declaratieve sectie van het subprogramma om een ​​variabele van dat objecttype te declareren.

Telkens wanneer een variabele in het subprogramma wordt gedeclareerd als objecttype, wordt tijdens runtime een nieuw exemplaar van het objecttype gemaakt en kan dit nieuw gemaakte exemplaar worden verwezen naar de variabelenaam. Op deze manier kan een enkel objecttype meerdere waarden onder verschillende instanties opslaan.

DECLARE ;BEGIN… END;/

Syntaxis Uitleg:

  • De bovenstaande syntaxis toont de declaratie van een variabele als een objecttype in de declaratieve sectie.

Als de variabele eenmaal is gedeclareerd als een objecttype in een subprogramma, is deze atomair null, dwz het hele object zelf is null. Het moet worden geïnitialiseerd met waarden om ze in het programma te kunnen gebruiken. Ze kunnen worden geïnitialiseerd met behulp van constructors.

Constructors zijn de impliciete methode van een object waarnaar kan worden verwezen met dezelfde naam als die van het objecttype. De onderstaande syntaxis toont de initialisatie van het objecttype.

DECLARE ;BEGIN:=();END;/

Syntaxis Uitleg:

  • De bovenstaande syntaxis toont de initialisatie van de objecttype-instantie met een null-waarde.
  • Nu is het object zelf niet null zoals het is geïnitialiseerd, maar de attributen in het object zullen null zijn omdat we geen waarden aan deze attributen hebben toegewezen.

Constructeurs

Constructors zijn de impliciete methode van een object waarnaar kan worden verwezen met dezelfde naam als die van het objecttype. Telkens wanneer het object voor de eerste keer wordt verwezen, wordt deze constructor impliciet aangeroepen.

We kunnen de objecten ook initialiseren met behulp van deze constructor. De constructor kan expliciet worden gedefinieerd door het lid in objecttype body te definiëren met dezelfde naam als het objecttype.

Voorbeeld 1 : In het volgende voorbeeld gaan we het objecttype lid gebruiken om het record in de emp-tabel in te voegen met waarden ('RRR', 1005, 20000, 1000) en ('PPP', 1006, 20000, 1001). Nadat de gegevens zijn ingevoegd, gaan we hetzelfde weergeven met behulp van het objecttype lid. We gaan ook de expliciete constructor gebruiken om de manager-ID standaard te vullen met 1001-waarde voor het tweede record.

We gaan het uitvoeren in onderstaande stappen.

  • Stap 1:
    • Maak een objecttype
    • Objecttype lichaam
  • Stap 2: Een anoniem blok maken om het gecreëerde objecttype aan te roepen via een impliciete constructor voor emp_no 1005.
  • Stap 3: Een anoniem blok maken om het gecreëerde objecttype aan te roepen via een expliciete constructor voor emp_no 1006.

Stap 1) Creëer objecttype en objecttype body

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 ASCONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2,p_salary NUMBER)RETURN SELF AS RESULTISBEGINDbms_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_recordsISBEGININSERT INTO emp VALUES(emp_noemp_name,salary,manager);ENDMEMBER PROCEDURE display_recordsISBEGINDbms_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:/

Code Verklaring

  • Coderegel 1-9 : Creëren van het 'emp_object' objecttype met 4 attributen en 3 leden. Het bevat de definitie van constructors met slechts 3 parameters. (Werkelijke impliciete constructor bevat het aantal parameters dat gelijk is aan het aantal attributen dat aanwezig is in het objecttype)
  • Coderegel 10 : Aanmaken van het type body.
  • Coderegel 11-21 : de expliciete constructor definiëren. Het toewijzen van de parameterwaarde aan de attributen en het toekennen van de waarde voor attribuut 'manager' met de standaardwaarde '1001'.
  • Coderegel 22-26 : Definiëren van het lid 'insert_records' waarin de attributenwaarden worden ingevoegd in de 'emp'-tabel.
  • Coderegel 27-34 : Definiëren van het lid 'display_records' waarin de waarden van de objecttype-attributen worden weergegeven.

Uitvoer

Type gemaakt

Type body gemaakt

Stap 2) Anoniem blok maken om het gecreëerde objecttype aan te roepen via een impliciete constructor voor emp_no 1005

DECLAREguru_emp_det emp_object;BEGINguru_emp_det:=emp_object(1005,’RRR',20000,1000);guru_emp_det.display_records;guru_emp_det.insert_records;COMMIT;END;

Code Verklaring

  • Coderegel 37-45 : de records invoegen met behulp van de impliciete constructor. Aanroep naar constructor bevat het werkelijke aantal attributenwaarden.
  • Coderegel 38 : Declareert de guru_emp_det als objecttype van 'emp_object'.
  • Coderegel 41 : Statement 'guru_emp_det.display_records' genaamd de 'diplay_records' lidfunctie en de attributenwaarden worden weergegeven
  • Coderegel 42 : Statement 'guru_emp_det.insert_records' genaamd de 'insert_records' lidfunctie en de attributenwaarden worden in de tabel ingevoegd.

Uitvoer

Werknemer Naam: RRR

Werknemersnummer: 1005

Salaris: 20000

Beheerder: 1000

Stap 3) Anoniem blok maken om gemaakt objecttype aan te roepen via expliciete constructor voor emp_no 1006

DECLAREguru_emp_det emp_object;BEGINguru_emp_det:=emp_object(1006,'PPP',20000);guru_emp_det.display_records;guru_emp_det.insert_records;COMMIT;END;/

Uitvoer

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

Code Verklaring:

  • Coderegel 46-53 : de records invoegen met behulp van de expliciete constructor.
  • Coderegel 46 : Declareert de guru_emp_det als objecttype van 'emp_object'.
  • Coderegel 50 : Statement 'guru_emp_det.display_records' genaamd de 'display_records' lidfunctie en de attributenwaarden worden weergegeven
  • Coderegel 51 : Statement 'guru_emp_det.insert_records' genaamd de 'insert_records' lidfunctie en de attributenwaarden worden in de tabel ingevoegd.

Overerving in objecttype

Overervingseigenschap geeft het subobjecttype toegang tot alle attributen en leden van het superobjecttype of bovenliggende objecttype.

Het subobjecttype wordt overgeërfd objecttype genoemd en het superobjecttype wordt het bovenliggende objecttype genoemd. De onderstaande syntaxis laat zien hoe u een bovenliggend en overgeërfd objecttype kunt maken.

CREATE TYPE  AS OBJECT(,… )NOT FINAL;/

Syntaxis Uitleg:

  • De bovenstaande syntaxis toont het maken van het SUPER-type.
CREATE TYPEUNDER(,.);/

Syntaxis Uitleg:

  • De bovenstaande syntaxis toont het maken van het SUB-type. Het bevat alle leden en attributen van het bovenliggende objecttype.

Voorbeeld1: In het onderstaande voorbeeld gaan we de overervingseigenschap gebruiken om het record in te voegen met manager-ID als '1002' voor het volgende record ('RRR', 1007, 20000).

We gaan het bovenstaande programma uitvoeren in de volgende stappen

  • Stap 1: Maak een SUPER-type.
  • Stap 2: Maak een SUB-type en body.
  • Stap 3: Een anoniem blok maken om het SUB-type aan te roepen.

Stap 1) Creëer SUPER-type of Ouder-type.

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

Code Verklaring:

  • Coderegel 1-9 : Creëren van het 'emp_object' objecttype met 4 attributen en 3 leden. Het bevat de definitie van constructors met slechts 3 parameters. Het is verklaard als 'NIET DEFINITIEF', dus het is het bovenliggende type.

Stap 2) Maak SUB-type aan onder SUPER-type.

CREATE OR REPLACE TYPE sub_emp_objectUNDER emp_object(default_manager NUMBER,MEMBER PROCEDURE insert_default_mgr);/CREATE OR REPLACE TYPE BODY sub_emp_objectASMEMBER PROCEDURE insert_default_mgrISBEGININSERT INTO empVALUES(emp_no,emp_name:salary,manager):END;END;/

Code Verklaring:

  • Coderegel 10-13 : Creëren van het sub_emp_object als overgeërfd type met een extra attribuut 'default_manager' en een member procedure declaratie.
  • Coderegel 14 : het lichaam maken voor het overgeërfde objecttype.
  • Coderegel 1 6 -21 : Definiëren van de lidprocedure die de records invoegt in de "emp" -tabel met de waarden van het 'SUPER'-objecttype, behalve de managerwaarde. Voor managerwaarde gebruikt het het type 'default_manager' van het type 'SUB'.

Stap 3) Anoniem blok maken om het SUB-type aan te roepen

DECLAREguru_emp_det sub_emp_object;BEGINguru_emp_det:= sub_emp_object(1007,'RRR',20000,1000,1002);guru_emp_det.insert_default_mgr;COMMIT;END;/

Code Verklaring:

  • Coderegel 25 : 'guru_emp_det' declareren als 'sub_emp_object' type.
  • Coderegel 27 : Initialiseren van het object met de impliciete constructor. De constructor heeft 5 parameters (4 attributen van het PARENT-type en 2 attributen van het SUB-type). De laatste parameter (1002) definieert de waarde voor het kenmerk default_manager
  • Coderegel 28 : Het lid 'insert_default_mgr' aanroepen om de records in te voegen met het standaard manager-ID dat is doorgegeven in de constructor.

Gelijkheid van PL / SQL-objecten

De objectinstantie die tot dezelfde objecten behoort, kan op gelijkheid worden vergeleken. Hiervoor hebben we de speciale methode nodig in het objecttype genaamd 'ORDER'-methode.

Deze 'ORDER'-methode moet de functie zijn die een numeriek type retourneert. Er zijn twee parameters nodig als invoer (eerste parameter: id van de instantie van het zelfobject, tweede parameter: id van een andere instantie van een object).

De id van de instantie van twee objecten wordt vergeleken en het resultaat wordt numeriek geretourneerd.

  • Positieve waarde geeft aan dat de SELF-objectinstantie groter is dan een andere instantie.
  • Een negatieve waarde geeft aan dat de instantie van het SELF-object kleiner is dan een andere instantie.
  • Nul geeft aan dat de SELF-objectinstantie gelijk is aan een andere instantie.
  • Als een van de instanties null is, retourneert deze functie null.
CREATE TYPE BODYAS OBJECT(ORDER MEMBER FUNCTION match(
 object_type_name_ 1)RETURN INTEGER IS BEGINIF parameter THENRETURN -1; --any negative number will doELSIF id>c.id THENRETURN 1; -any positive number will doELSERETURN 0;END IF;END;… );/

Syntaxis Uitleg:

  • De bovenstaande syntaxis toont de ORDER-functie die moet worden opgenomen in de typelichaam voor gelijkheidscontrole.
  • De parameter voor deze functie moet een instantie van hetzelfde objecttype zijn.
  • De bovenstaande functie kan worden aangeroepen als "obj_instance_1.match (obj_instance_2)" en deze uitdrukking zal de getoonde numerieke waarde retourneren, waarbij obj_instance_1 en obj_instance_2 de instantie zijn van object_type_name.

Voorbeeld1 : In het volgende voorbeeld gaan we zien hoe we twee objecten kunnen vergelijken. We gaan twee instanties maken en we gaan het kenmerk 'salaris' ertussen vergelijken. We gaan in twee stappen doen.

  • Stap 1: Het objecttype en de hoofdtekst maken.
  • Stap 2: Het anonieme blok maken om aan te roepen, vergelijk de objectinstantie.

Stap 1) Het objecttype en de body maken.

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 ASORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGERISBEGIN‭ ‬IF salaryc.salaryTHEN RETURN 1;ELSERETURN 0;END IF:‭ ‬END;END;/

Code Verklaring:

  • Coderegel 1-4: Creëren van het 'emp_object_equality' objecttype met 1 attributen en 1 lid.
  • Coderegel 6-16 : Definiëren van de ORDER-functie die het 'salaris'-attribuut van SELF-instantie en parameterinstantie-type vergelijkt. Het retourneert negatief als het ZELF-salaris lager is of positief als het ZELF-salaris hoger is en 0 als het salaris gelijk is.

Code-uitvoer:

Type gemaakt

Stap 2) Creëren van het anonieme blok om aan te roepen, vergelijk de objectinstantie.

DECLAREl_obj_l emp_object_equality;l_obj_2 emp_object_equality;BEGINl_obj_l:=emp_object_equality(15000);l_obj_2:=emp_object_equality(17000);IF l_obj_1.equalS(l_obj_2)>0THENDbms_output.put_line(’Salary of first instance is greater’):ELSIF l_obj_l.equalS(l_obj_2)<0THENDbms_output.put_line(’Salary of second instance is greater’);ELSEDbms_output.put_line(’Salaries are equal’);END IF;END;/

Uitvoer

Salary of second instance is greater

Code Verklaring:

  • Coderegel 20 : Declaratie van de l_obj_1 van het type emp_object_equality.
  • Coderegel 21 : declareren van de l_obj_2 van het type emp_object_equality.
  • Coderegel 23 : initialiseren l_obj_1 met salariswaarde als '15000'
  • Coderegel 24 : initialiseren l_obj_1 met salariswaarde als '17000'
  • Coderegel 25-33 : Druk het bericht af op basis van het retournummer van de ORDER-functie.

Overzicht

In dit hoofdstuk hebben we het objecttype en hun eigenschappen gezien. We hebben ook gesproken over constructeurs, leden, attributen, overerving en gelijkheid in PL / SQL-objecten.

Interessante artikelen...