Oracle PL/SQL-objecttypen-tutorial met VOORBEELDEN
Wat is objecttype in PL/SQL?
Object-Oriented Programming is vooral geschikt voor het bouwen van herbruikbare componenten en complexe applicaties. Ze zijn georganiseerd rond "objecten" in plaats van "acties", d.w.z. de programma's zijn ontworpen om te werken en te interacteren met het gehele object in plaats van de enkele actie. Dit concept stelt de programmeur in staat om de details op objectentiteitenniveau te vullen en te manipuleren.
De onderstaande afbeelding toont een voorbeeld van het objecttype waarin een bankrekening als objectentiteit wordt beschouwd. De objectattributen omvatten dingen die bepaalde attribuutwaarden bevatten, bijvoorbeeld in Bankrekening; het is rekeningnummer, banksaldo, enz., terwijl objectmethoden zaken beschrijven zoals het berekenen van de rente, het genereren van bankafschriften, enz. waarvoor een bepaald proces moet worden voltooid.
Bij PL/SQL is objectgeoriënteerd programmeren gebaseerd op objecttypen.
Een objecttype kan elke entiteit uit de echte wereld vertegenwoordigen. In dit hoofdstuk gaan we meer objecttypen bespreken.
Componenten van objecttypen
PL / SQL objecttype bevat hoofdzakelijk twee componenten.
- Attributen
- Leden/methoden
Attributen
Attributen zijn de kolom of het veld waarin gegevens worden opgeslagen. Elk attribuut wordt toegewezen aan het gegevenstype dat het verwerkings- en opslagtype voor dat attribuut definieert. Het attribuut kan elk geldig attribuut zijn PL/SQL-gegevenstype, 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 processen binnen het objecttype te definiëren. Voor voorbeelden van het valideren van gegevens voordat het objecttype wordt ingevuld. Ze worden gedeclareerd in de objecttypesectie en gedefinieerd in de objecttypehoofdsectie van het objecttype. Lichaamssectie in objecttype is een optioneel onderdeel. Als er geen leden aanwezig zijn, bevat een objecttype geen lichaamsdeel.
Object maken 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 in subprogramma's worden gebruikt. Het objecttype kan worden aangemaakt met 'CREATE TYPE'. Het typelichaam kan alleen worden gemaakt nadat het objecttype is gemaakt.
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; . . ); /
Syntaxis uitleg:
- De bovenstaande syntaxis toont de creatie van 'OBJECT' met attributen en 'OBJECT-BODY' met methoden.
- De methoden kunnen ook overbelast raken in de objecttekst.
Verklaring Initialisatie van objecttype
Net als andere componenten in PL/SQL moeten objecttypen ook worden gedeclareerd voordat ze in het programma kunnen worden gebruikt.
Zodra het objecttype is gemaakt, kan het in de declaratieve sectie van het subprogramma worden gebruikt om een variabele van dat objecttype te declareren.
Telkens wanneer een variabele in het subprogramma als objecttype wordt gedeclareerd, wordt er tijdens runtime een nieuw exemplaar van het objecttype gemaakt, en naar dit nieuw gemaakte exemplaar kan worden verwezen naar de naam van de variabele. Op deze manier kan een enkel objecttype meerdere waarden onder verschillende instanties opslaan.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Syntaxis uitleg:
- De bovenstaande syntaxis toont de declaratie van een variabele als objecttype in de declaratieve sectie.
Zodra de variabele is gedeclareerd als een objecttype in een subprogramma, zal het atomisch null zijn, d.w.z. het hele object zelf is null. Het moet worden geïnitialiseerd met waarden om ze in het programma te gebruiken. Ze kunnen worden geïnitialiseerd met 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 <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
Syntaxis uitleg:
- De bovenstaande syntaxis toont de initialisatie van de objecttype-instantie met een nulwaarde.
- Nu is het object zelf niet nul zoals het is geïnitialiseerd, maar de attributen binnen het object zullen null zijn omdat we geen waarden aan deze attributen hebben toegewezen.
constructors
Constructors zijn de impliciete methode van een object waarnaar kan worden verwezen met dezelfde naam als die van het objecttype. 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 de hoofdtekst van het objecttype te definiëren met dezelfde naam als het objecttype.
Voorbeeld 1: In het volgende voorbeeld gaan we het objecttypelid gebruiken om de record in de emp-tabel in te voegen met waarden ('RRR', 1005, 20000, 1000) en ('PPP', 1006, 20000, 1001). Zodra de gegevens zijn ingevoegd, gaan we deze weergeven met behulp van objecttypelid. We gaan ook de expliciete constructor gebruiken om de manager-id standaard in te vullen met de waarde 1001 voor de tweede record.
We gaan het in de onderstaande stappen uitvoeren.
- Stap1:
- Objecttype maken
- Objecttype lichaam
- Stap 2: Een anoniem blok maken om het gemaakte objecttype aan te roepen via de impliciete constructor voor emp_no 1005.
- Stap 3: Een anoniem blok maken om het gemaakte objecttype aan te roepen via een expliciete constructor voor emp_no 1006.
Stap 1) Maak het objecttype en de hoofdtekst van het objecttype aan
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 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: /
Code Uitleg
- Coderegel 1-9: Creëren van het objecttype 'emp_object' met 4 attributen en 3 leden. Het bevat de definitie van constructors met slechts 3 parameters. (De werkelijke impliciete constructor zal het aantal parameters bevatten dat gelijk is aan het aantal attributen dat aanwezig is in het objecttype)
- Coderegel 10: De teksttekst maken.
- Coderegel 11-21: De expliciete constructor definiëren. Het toekennen van de parameterwaarde aan de attributen en het toekennen van de waarde voor attribuut 'manager' met de standaardwaarde '1001'.
- Coderegel 22-26: Het definiëren van het lid 'insert_records' waarin de attribuutwaarden worden ingevoegd in de 'emp'-tabel.
- Coderegel 27-34: Het definiëren van het lid 'display_records' waarin de waarden van de objecttype-attributen worden weergegeven.
uitgang
Type gemaakt
Typetekst gemaakt
Stap 2) Anoniem blok maken om het gemaakte objecttype aan te roepen via een impliciete constructor voor emp_no 1005
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;
Code Uitleg
- Coderegel 37-45: De records invoegen met behulp van de impliciete constructor. Aanroep van constructor bevat het werkelijke aantal attribuutwaarden.
- Coderegel 38: Declareert de guru_emp_det als objecttype van 'emp_object'.
- Coderegel 41: Statement 'guru_emp_det.display_records' riep de lidfunctie 'diplay_records' aan en de waarden van de kenmerken worden weergegeven
- Coderegel 42: Verklaring 'guru_emp_det.insert_records' genaamd de lidfunctie 'insert_records' en de attribuutwaarden worden in de tabel ingevoegd.
uitgang
Naam werknemer: RRR
Werknemersnummer: 1005
Salaris: 20000
Beheerder: 1000
Stap 3) Anoniem blok maken om het gemaakte objecttype aan te roepen via een expliciete constructor voor emp_no 1006
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; /
uitgang
Employee Name:PPP Employee Number:1006 Salary:20000 Manager: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' riep de lidfunctie 'display_records' aan en de waarden van de kenmerken worden weergegeven
- Coderegel 51: Verklaring 'guru_emp_det.insert_records' genaamd de lidfunctie 'insert_records' en de attribuutwaarden worden in de tabel ingevoegd.
Overerving in objecttype
Dankzij de overervingseigenschap heeft het subobjecttype toegang tot alle attributen en leden van het superobjecttype of het bovenliggende objecttype.
Het subobjecttype wordt het overgeërfde objecttype genoemd en het superobjecttype het bovenliggende objecttype. De onderstaande syntaxis laat zien hoe u het bovenliggende en overgenomen objecttype kunt maken.
CREATE TYPE <object_type_name_parent> AS OBJECT ( <attribute_l><datatype>, . . )NOT FINAL; /
Syntaxis uitleg:
- De bovenstaande syntaxis toont de creatie van het SUPER-type.
CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent> ( <attribute_l><datatype>, . ); /
Syntaxis uitleg:
- De bovenstaande syntaxis toont de creatie van het SUB-type. Het bevat alle leden en attributen van het bovenliggende objecttype.
Example1: In het onderstaande voorbeeld gaan we de overervingseigenschap gebruiken om de record met manager-id '1002' in te voegen voor de volgende record ('RRR', 1007, 20000).
We gaan het bovenstaande programma in de volgende stappen uitvoeren
- Stap 1: Creëer het SUPER-type.
- Stap 2: Maak een SUB-type en hoofdtekst aan.
- Stap 3: Een anoniem blok maken om het SUB-type aan te roepen.
Stap 1) Maak een 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 objecttype 'emp_object' met 4 attributen en 3 leden. Het bevat de definitie van constructors met slechts 3 parameters. Het is gedeclareerd als 'NIET DEFINITIEF', dus het is een oudertype.
Stap 2) Maak een SUB-type onder SUPER-type.
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; /
Code Verklaring:
- Coderegel 10-13: Het sub_emp_object creëren als overgenomen type met extra attribuut 'default_manager' en lidproceduredeclaratie.
- Coderegel 14: De hoofdtekst voor het overgenomen objecttype maken.
- Coderegel 16-21: Het definiëren van de lidprocedure die de records invoegt in de “emp”-tabel met de waarden van het objecttype 'SUPER', behalve de managerwaarde. Voor managerwaarde wordt het type 'default_manager' van 'SUB' gebruikt.
Stap 3) Anoniem blok maken om het SUB-type aan te roepen
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; /
Code Verklaring:
- Coderegel 25: 'guru_emp_det' declareren als 'sub_emp_object' type.
- Coderegel 27: Het object initialiseren 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 de standaard manager-ID 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 het numerieke type retourneert. Er zijn twee parameters nodig als invoer (eerste parameter: id van de zelf-objectinstantie, tweede parameter: id van een andere objectinstantie).
De id van de twee objectinstanties wordt vergeleken en het resultaat wordt numeriek geretourneerd.
- Positieve waarde geeft aan dat de SELF-objectinstantie groter is dan een andere instantie.
- Negatieve waarde geeft aan dat de SELF-objectinstantie 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 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; . . ); /
Syntaxis uitleg:
- De bovenstaande syntaxis toont de ORDER-functie die moet worden opgenomen in de typebody 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 expressie retourneert de numerieke waarde zoals weergegeven, waarbij obj_instance_1 en obj_instance_2 de instantie zijn van object_type_name.
Example1: In het volgende voorbeeld gaan we zien hoe we twee objecten kunnen vergelijken. We gaan twee instanties maken en we gaan het kenmerk 'salary' tussen hen vergelijken. We gaan in twee stappen te werk.
- Stap 1: Het objecttype en de hoofdtekst creëren.
- Stap 2: Het anonieme blok maken om de objectinstantie aan te roepen.
Stap 1) Het objecttype en de hoofdtekst 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 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; /
Code Verklaring:
- Coderegel 1-4: Het objecttype 'emp_object_equality' maken met 1 attributen en 1 lid.
- Coderegel 6-16: Definieert de ORDER-functie die het 'salary'-kenmerk van SELF-instantie en parameterinstantietype vergelijkt. Het retourneert negatief als SELF-salaris lager is of positief als SELF-salaris hoger is en 0 als salarissen gelijk zijn.
Code-uitvoer:
Type gemaakt
Stap 2) Het anonieme blok maken om de objectinstantie aan te roepen.
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; /
uitgang
Salary of second instance is greater
Code Verklaring:
- Coderegel 20: Het declareren van de l_obj_1 van het type emp_object_equality.
- Coderegel 21: Het declareren van de l_obj_2 van het type emp_object_equality.
- Coderegel 23: Initialiseren van l_obj_1 met salariswaarde als '15000'
- Coderegel 24: Initialiseren van l_obj_1 met salariswaarde als '17000'
- Coderegel 25-33: Druk het bericht af op basis van het retournummer uit de ORDER-functie.
Samenvatting
In dit hoofdstuk hebben we het objecttype en hun eigenschappen gezien. We hebben ook gesproken over constructors, leden, attributen, overerving en gelijkheid in PL/SQL-objecten.