Oracle PL/SQL-objecttypen: CREATE TYPE met voorbeelden
โก Slimme samenvatting
Objecttypen in PL/SQL brengen objectgeoriรซnteerd programmeren naar Oraclewaardoor je entiteiten uit de echte wereld kunt modelleren met attributen en methoden. Ze ondersteunen constructors, overerving en gelijkheidsvergelijkingen, zodat รฉรฉn enkel schematype gestructureerde gegevens kan opslaan en verwerken.

Wat is objecttype in PL/SQL?
Objectgeoriรซnteerd programmeren is bijzonder geschikt voor het bouwen van herbruikbare componenten en complexe applicaties. Programma's zijn georganiseerd rond 'objecten' in plaats van 'acties'; dat wil zeggen, ze zijn ontworpen om te werken met en te interageren met een volledig object in plaats van een enkele actie. Deze aanpak stelt de programmeur in staat om details op objectniveau in te vullen en te manipuleren.
De onderstaande afbeelding toont een voorbeeld van een objecttype waarin een bankrekening als object wordt behandeld. De objectattributen bevatten waarden โ voor een bankrekening zijn dit bijvoorbeeld het rekeningnummer en het banksaldo โ terwijl de objectmethoden acties beschrijven zoals het berekenen van de rente of het genereren van een bankafschrift. Elk van deze acties vereist een proces.
In PL / SQLObjectgeoriรซnteerd programmeren is gebaseerd op objecttypen. Een objecttype kan elke entiteit uit de echte wereld representeren. De onderstaande paragrafen gaan dieper in op objecttypen, hun componenten en hoe je ze kunt maken en gebruiken.
Componenten van objecttypen
Een PL/SQL-objecttype bestaat hoofdzakelijk uit twee componenten.
- Attributen
- Leden/methoden
Attributen
Attributen zijn de kolommen of velden waarin gegevens worden opgeslagen. Elk attribuut is gekoppeld aan het gegevenstype dat het verwerkings- en opslagtype voor dat attribuut definieert. Een attribuut kan van elk geldig gegevenstype zijn. PL/SQL-gegevenstype, of het kan van een ander objecttype zijn.
Leden/methoden
Leden, oftewel methoden, zijn subprogramma's Deze leden worden binnen het objecttype gedefinieerd. Ze worden niet gebruikt om gegevens op te slaan, maar definiรซren de verwerking die binnen het objecttype wordt uitgevoerd, bijvoorbeeld het valideren van gegevens voordat het object wordt gevuld. Ze worden gedeclareerd in de objecttypespecificatie en gedefinieerd in de objecttypebody. De body is optioneel: als er geen leden aanwezig zijn, heeft een objecttype geen body.
Object maken in Oracle
Een objecttype kan niet op subprogrammaniveau worden aangemaakt; dit kan alleen op schemaniveau. Zodra het objecttype in het schema is gedefinieerd, kan het in subprogramma's worden gebruikt. Het objecttype wordt aangemaakt met de instructie "CREATE TYPE", en de typebody kan pas worden aangemaakt nadat het objecttype bestaat.
De onderstaande schermafbeeldingen tonen de CREATE TYPE-syntaxis voor de objectspecificatie en de CREATE TYPE BODY-syntaxis waarmee de methoden ervan worden gedefinieerd.
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 syntax laat de creatie zien van een OBJECT met attributen en een 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 worden gedeclareerd voordat ze in een programma worden gebruikt. Zodra het objecttype is aangemaakt, kan het in het declaratiegedeelte van een subprogramma worden gebruikt om een โโvariabele van dat objecttype te declareren.
Wanneer een variabele als objecttype wordt gedeclareerd, wordt er tijdens de uitvoering een nieuwe instantie van het objecttype aangemaakt. Deze nieuw aangemaakte instantie wordt aangeduid met de naam van de variabele. Op deze manier kan รฉรฉn objecttype meerdere waarden onder verschillende instanties opslaan.
De onderstaande schermafbeelding laat zien hoe een variabele binnen een objecttype wordt gedeclareerd. PL/SQL-blok.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Syntaxis uitleg:
- De bovenstaande syntaxis toont de declaratie van een variabele als objecttype in het declaratieve gedeelte.
Zodra een variabele in een subprogramma als objecttype is gedeclareerd, is deze atomair null โ het hele object zelf is null. Het moet worden geรฏnitialiseerd met waarden voordat het in het programma kan worden gebruikt. Objecten worden geรฏnitialiseerd met behulp van constructors.
Constructors zijn de impliciete methoden van een object waarnaar verwezen kan worden met dezelfde naam als het objecttype. De onderstaande schermafbeelding toont de initialisatie van een instantie van een objecttype.
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
Syntaxis uitleg:
- De bovenstaande syntax laat zien hoe een instantie van het objecttype wordt geรฏnitialiseerd met een null-waarde.
- Het object zelf is niet langer null nadat het is geรฏnitialiseerd, maar de attributen binnen het object blijven null totdat er waarden aan worden toegekend.
constructors
Constructors zijn de impliciete methoden van een object die met dezelfde naam als het objecttype kunnen worden aangeroepen. Telkens wanneer het object voor het eerst wordt aangeroepen, wordt deze constructor impliciet aangeroepen.
Je kunt objecten ook initialiseren met behulp van deze constructors. Een constructor kan expliciet worden gedefinieerd door een lid in de objecttypebody te definiรซren met dezelfde naam als het objecttype.
Voorbeeld 1: In het volgende voorbeeld gebruiken we het objecttype-lid om records in de tabel emp in te voegen met de waarden ('RRR', 1005, 20000, 1000) en ('PPP', 1006, 20000, 1001). Nadat de gegevens zijn ingevoegd, tonen we ze met behulp van het objecttype-lid. We gebruiken ook een expliciete constructor om de manager-ID voor het tweede record te vullen met de standaardwaarde 1001.
We voeren het uit in de volgende stappen.
- Stap 1: Maak het objecttype en de objecttypebody aan.
- Stap 2: Maak een anoniem blok aan om het objecttype aan te roepen via de impliciete constructor voor emp_no 1005.
- Stap 3: Maak een anoniem blok aan om het objecttype aan te roepen via de expliciete constructor voor emp_no 1006.
Stap 1) Maak een objecttype en een objecttypebody aan.
De onderstaande schermafbeelding toont hoe de specificatie van het objecttype emp_object wordt aangemaakt, inclusief de attributen en leden.
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); /
De onderstaande schermafbeelding toont hoe de body van het type emp_object wordt aangemaakt met de expliciete constructor en de lidprocedures.
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.manager:=1001; RETURN; END; MEMBER PROCEDURE insert_records IS BEGIN INSERT INTO emp VALUES(emp_no,emp_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
- Code regel 1-9: Het objecttype 'emp_object' wordt aangemaakt met 4 attributen en 3 leden. Het bevat de definitie van een constructor met slechts 3 parameters. (De daadwerkelijke impliciete constructor bevat evenveel parameters als het aantal attributen in het objecttype.)
- Code lijn 10: Het tekstbestand creรซren.
- Code regel 11-21: De expliciete constructor definiรซren. De parameterwaarden toewijzen aan de attributen en het attribuut 'manager' de standaardwaarde '1001' toekennen.
- Code regel 22-26: Het lid 'insert_records' definiรซren, waarin de attribuutwaarden in de tabel 'emp' worden ingevoegd.
- Code regel 27-34: Het lid 'display_records' definiรซren, dat de waarden van de objecttype-attributen weergeeft.
Output:
Type gemaakt
Typetekst gemaakt
Stap 2) Een anoniem blok aanmaken om het aangemaakte objecttype aan te roepen via de impliciete constructor voor emp_no 1005.
De onderstaande schermafbeelding toont het anonieme blok dat emp_object aanroept via de impliciete constructor.
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
- Code regel 37-45: De records worden ingevoegd met behulp van de impliciete constructor. De aanroep van de constructor bevat het werkelijke aantal attribuutwaarden.
- Code lijn 38: Declareert 'guru_emp_det' als objecttype 'emp_object'.
- Code lijn 41: De instructie 'guru_emp_det.display_records' roept het lid 'display_records' aan en de attribuutwaarden worden weergegeven.
- Code lijn 42: De instructie 'guru_emp_det.insert_records' roept het lid 'insert_records' aan en de attribuutwaarden worden in de tabel ingevoegd. Het blok voert vervolgens een commit uit. transactie.
Output:
Naam werknemer: RRR
Werknemersnummer: 1005
Salaris: 20000
Beheerder: 1000
Stap 3) Een anoniem blok aanmaken om het aangemaakte objecttype aan te roepen via de expliciete constructor voor emp_no 1006.
De onderstaande schermafbeelding toont het anonieme blok dat emp_object aanroept via de expliciete constructor met drie argumenten.
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 Uitleg:
- Code regel 46-53: Het record invoegen met behulp van de expliciete constructor.
- Code lijn 46: Declareert 'guru_emp_det' als objecttype 'emp_object'.
- Code lijn 50: De instructie 'guru_emp_det.display_records' roept het lid 'display_records' aan en de attribuutwaarden worden weergegeven.
- Code lijn 51: De instructie 'guru_emp_det.insert_records' roept het lid 'insert_records' aan en de attribuutwaarden worden in de tabel ingevoegd. Omdat er slechts drie argumenten worden doorgegeven, stelt de expliciete constructor de manager-ID in op de standaardwaarde 1001.
Overerving in objecttype
De eigenschap 'overerving' stelt een subobjecttype in staat om toegang te krijgen tot alle attributen en leden van het superobjecttype, ofwel het ouderobjecttype.
Het subobjecttype wordt het overgeรซrfde objecttype genoemd, en het superobjecttype wordt het ouderobjecttype genoemd. De onderstaande syntaxis laat zien hoe je ouder- en overgeรซrfde objecttypen kunt maken. De onderstaande schermafbeelding toont de syntaxis van het oudertype (SUPER), gemarkeerd als NOT FINAL.
CREATE TYPE <object_type_name_parent> AS OBJECT ( <attribute_l><datatype>, . . )NOT FINAL; /
Syntaxis uitleg:
- De bovenstaande syntax laat zien hoe het SUPER-type wordt aangemaakt. De NOT FINAL-clausule maakt het mogelijk dat het type wordt overgeรซrfd.
De onderstaande schermafbeelding toont de syntaxis van het overgeรซrfde (SUB) type, gemaakt met het trefwoord UNDER.
CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent> ( <attribute_l><datatype>, . ); /
Syntaxis uitleg:
- De bovenstaande syntax laat zien hoe het SUB-type wordt aangemaakt. Het bevat alle leden en attributen van het bovenliggende objecttype.
Voorbeeld 1: In het onderstaande voorbeeld gebruiken we de eigenschap 'overerving' om een โโrecord met manager-ID '1002' in te voegen voor het record ('RRR', 1007, 20000). We voeren het programma in de volgende stappen uit.
- Stap 1: Maak het SUPER-type aan.
- Stap 2: Maak het SUB-type en de inhoud aan.
- Stap 3: Maak een anoniem blok aan om het SUB-type aan te roepen.
Stap 1) Maak een SUPER-type of een oudertype aan.
De onderstaande schermafbeelding laat zien hoe het supertype emp_object wordt aangemaakt met de NOT FINAL-clausule.
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 Uitleg:
- Code regel 1-9: Het objecttype 'emp_object' wordt aangemaakt met 4 attributen en 3 leden. Het bevat de definitie van een constructor met slechts 3 parameters. Het is gedeclareerd als 'NOT FINAL', dus het is een parent-type.
Stap 2) Maak een SUB-type aan onder het SUPER-type.
De onderstaande schermafbeelding toont het overgeรซrfde type sub_emp_object en de aanmaak van de bijbehorende body.
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 Uitleg:
- Code regel 10-13: Het aanmaken van 'sub_emp_object' als het overgeรซrfde type met een extra attribuut 'default_manager' en een declaratie van een lidprocedure.
- Code lijn 14: Het creรซren van de body voor het overgeรซrfde objecttype.
- Code regel 16-21: Definieer de lidprocedure die records invoegt in de tabel 'emp' met de waarden van het objecttype SUPER, met uitzondering van de managerwaarde. Voor de managerwaarde wordt 'default_manager' van het objecttype SUB gebruikt.
Stap 3) Een anoniem blok maken om het SUB-type aan te roepen.
De onderstaande schermafbeelding toont het anonieme blok dat het SUB-type aanroept en de standaard manager-ID invoegt.
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 Uitleg:
- Code lijn 25: 'guru_emp_det' wordt gedeclareerd als type 'sub_emp_object'.
- Code lijn 27: Het object wordt geรฏnitialiseerd met de impliciete constructor. De constructor heeft 5 parameters (4 attributen van het PARENT-type en 1 attribuut van het SUB-type). De laatste parameter (1002) definieert de waarde voor het attribuut default_manager.
- Code lijn 28: De methode 'insert_default_mgr' wordt aangeroepen om de record in te voegen met de standaard manager-ID die in de constructor is doorgegeven.
Gelijkheid van PL/SQL-objecten
Objectinstanties die tot hetzelfde objecttype behoren, kunnen op gelijkheid worden vergeleken. Hiervoor heeft het objecttype een speciale methode nodig, de zogenaamde ORDER-methode.
Deze ORDER-methode moet een functie zijn die een numeriek type retourneert. De methode neemt twee parameters als invoer (eerste parameter: de ID van het zelfobject; tweede parameter: de ID van een ander object).
De ID's van de twee objectinstanties worden vergeleken en het resultaat wordt als een getal geretourneerd.
- Een positieve waarde geeft aan dat de SELF-objectinstantie groter is dan de andere instantie.
- Een negatieve waarde geeft aan dat het SELF-objectexemplaar kleiner is dan het andere exemplaar.
- Nul geeft aan dat de SELF-objectinstantie gelijk is aan de andere instantie.
- Als een van beide instanties null is, retourneert de functie null.
De onderstaande schermafbeelding toont de syntaxis van de ORDER-lidfunctie die in de typebody moet worden opgenomen voor de gelijkheidscontrole.
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 syntax toont de ORDER-functie die in de typebody moet worden opgenomen voor de gelijkheidscontrole.
- De parameter voor deze functie moet een instantie van hetzelfde objecttype zijn.
- De functie kan worden aangeroepen als โobj_instance_1.match(obj_instance_2)โ, en deze expressie retourneert de weergegeven numerieke waarde, waarbij obj_instance_1 en obj_instance_2 instanties zijn van het objecttype.
Voorbeeld 1: In het volgende voorbeeld vergelijken we twee objecten. We maken twee instanties aan en vergelijken het attribuut 'salaris' ertussen. We doen dit in twee stappen.
- Stap 1: Maak het objecttype en de objectbody aan.
- Stap 2: Maak het anonieme blok aan om de objectinstanties te vergelijken.
Stap 1) Het objecttype en de objectbody creรซren.
De onderstaande schermafbeeldingen tonen de specificatie emp_object_equality en de bijbehorende body, die de ORDER-functie definieert waarmee het salariskenmerk wordt vergeleken.
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 Uitleg:
- Code regel 1-4: Het objecttype 'emp_object_equality' aanmaken met 1 attribuut en 1 lid.
- Code regel 6-16: De functie ORDER definieert een vergelijking van het 'salary'-attribuut van het SELF-exemplaar en het parameter-exemplaar. De functie retourneert een negatieve waarde als het SELF-salaris lager is, een positieve waarde als het SELF-salaris hoger is en 0 als de salarissen gelijk zijn.
Code Output:
Type gemaakt
Stap 2) Het anonieme blok creรซren om de objectinstanties te vergelijken.
De onderstaande schermafbeelding toont het anonieme blok dat twee instanties van emp_object_equality vergelijkt op basis van salaris.
DECLARE l_obj_1 emp_object_equality; l_obj_2 emp_object_equality; BEGIN l_obj_1:=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_1.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 Uitleg:
- Code lijn 20: 'l_obj_1' wordt gedeclareerd van het type 'emp_object_equality'.
- Code lijn 21: 'l_obj_2' wordt gedeclareerd van het type 'emp_object_equality'.
- Code lijn 23: Initialiseren van 'l_obj_1' met de salariswaarde '15000'.
- Code lijn 24: Initialiseren van 'l_obj_2' met de salariswaarde '17000'.
- Code regel 25-33: Het bericht wordt afgedrukt op basis van het getal dat door de ORDER-functie wordt geretourneerd.


















