Oracle PL/SQL-Objekttypen: CREATE TYPE mit Beispielen
โก Intelligente Zusammenfassung
Objekttypen in PL/SQL bringen die objektorientierte Programmierung auf OracleSie ermรถglichen es Ihnen, reale Entitรคten mit Attributen und Methoden zu modellieren. Sie unterstรผtzen Konstruktoren, Vererbung und Gleichheitsvergleiche, sodass ein einzelner Schema-Typ strukturierte Daten speichern und verarbeiten kann.

Was ist der Objekttyp in PL/SQL?
Objektorientierte Programmierung eignet sich besonders fรผr die Entwicklung wiederverwendbarer Komponenten und komplexer Anwendungen. Programme sind um โObjekteโ statt um โAktionenโ herum organisiert; das heiรt, sie sind darauf ausgelegt, mit einem gesamten Objekt anstatt mit einer einzelnen Aktion zu arbeiten und zu interagieren. Dieser Ansatz ermรถglicht es dem Programmierer, Details auf Objektebene festzulegen und zu bearbeiten.
Die Abbildung unten zeigt ein Beispiel fรผr einen Objekttyp, bei dem ein Bankkonto als Objekt behandelt wird. Die Objektattribute enthalten Werte โ im Falle eines Bankkontos beispielsweise Kontonummer, Kontostand usw. โ wรคhrend die Objektmethoden Aktionen wie die Berechnung des Zinssatzes oder die Erstellung eines Kontoauszugs beschreiben, fรผr die jeweils ein Prozess ausgefรผhrt werden muss.
In PL / SQLObjektorientierte Programmierung basiert auf Objekttypen. Ein Objekttyp kann jede beliebige Entitรคt der realen Welt reprรคsentieren. In den folgenden Abschnitten werden Objekttypen, ihre Komponenten sowie deren Erstellung und Verwendung nรคher erlรคutert.
Komponenten von Objekttypen
Ein PL/SQL-Objekttyp besteht im Wesentlichen aus zwei Komponenten.
- Attribute
- Mitglieder/Methoden
Attribute
Attribute sind die Spalten oder Felder, in denen Daten gespeichert werden. Jedes Attribut ist dem Datentyp zugeordnet, der die Verarbeitung und Speicherung dieses Attributs definiert. Ein Attribut kann von jedem gรผltigen Datentyp sein. PL/SQL-Datentyp, oder es kann von einem anderen Objekttyp sein.
Mitglieder/Methoden
Mitglieder oder Methoden sind Unterprogramme Sie sind innerhalb des Objekttyps definiert. Sie dienen nicht der Datenspeicherung, sondern definieren die Verarbeitung innerhalb des Objekttyps โ beispielsweise die Validierung von Daten vor dem Befรผllen des Objekts. Sie werden in der Spezifikation des Objekttyps deklariert und im Objekttyprumpf definiert. Der Rumpf ist optional: Sind keine Elemente vorhanden, besitzt ein Objekttyp keinen Rumpf.
Objekt erstellen in Oracle
Ein Objekttyp kann nicht auf Unterprogrammebene, sondern nur auf Schemaebene erstellt werden. Sobald der Objekttyp im Schema definiert ist, kann er in Unterprogrammen verwendet werden. Die Erstellung des Objekttyps erfolgt mit der Anweisung โCREATE TYPEโ, der Typrumpf kann jedoch erst nach der Existenz des Objekttyps erstellt werden.
Die folgenden Screenshots zeigen die CREATE TYPE-Syntax fรผr die Objektspezifikation und die CREATE TYPE BODY-Syntax, die die Methoden definiert.
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; . . ); /
Syntaxerklรคrung:
- Die obige Syntax zeigt die Erstellung eines OBJEKTS mit Attributen und eines OBJEKTKรRPERS mit Methoden.
- Die Methoden kรถnnen auch im Objektkรถrper รผberladen werden.
Deklarationsinitialisierung des Objekttyps
Wie andere Komponenten in PL/SQL mรผssen auch Objekttypen deklariert werden, bevor sie in einem Programm verwendet werden. Sobald der Objekttyp erstellt ist, kann er im Deklarationsteil eines Unterprogramms verwendet werden, um eine Variable dieses Objekttyps zu deklarieren.
Wird eine Variable als Objekttyp deklariert, wird zur Laufzeit eine neue Instanz dieses Objekttyps erstellt, auf die dann รผber den Variablennamen zugegriffen wird. Auf diese Weise kann ein einzelner Objekttyp mehrere Werte in verschiedenen Instanzen speichern.
Der folgende Screenshot zeigt, wie eine Variable innerhalb eines Objekts als Objekttyp deklariert wird. PL/SQL-Block.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Syntaxerklรคrung:
- Die obige Syntax zeigt die Deklaration eines Variable als Objekttyp im deklarativen Abschnitt.
Sobald eine Variable in einem Unterprogramm als Objekttyp deklariert wird, ist sie atomar null โ das gesamte Objekt selbst ist null. Sie muss initialisiert werden, bevor sie im Programm verwendet werden kann. Objekte werden mithilfe von Konstruktoren initialisiert.
Konstruktoren sind implizite Methoden eines Objekts, die รผber denselben Namen wie der Objekttyp aufgerufen werden kรถnnen. Der folgende Screenshot zeigt die Initialisierung einer Objektinstanz.
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
Syntaxerklรคrung:
- Die obige Syntax zeigt die Initialisierung der Objekttypinstanz mit einem Nullwert.
- Das Objekt selbst ist nach der Initialisierung nicht mehr null, aber die Attribute innerhalb des Objekts bleiben null, bis ihnen Werte zugewiesen werden.
Konstruktoren
Konstruktoren sind implizite Methoden eines Objekts, die รผber denselben Namen wie der Objekttyp aufgerufen werden kรถnnen. Immer wenn zum ersten Mal auf das Objekt zugegriffen wird, wird dieser Konstruktor implizit aufgerufen.
Sie kรถnnen Objekte auch mithilfe dieser Konstruktoren initialisieren. Ein Konstruktor kann explizit definiert werden, indem im Objekttyprumpf ein Element mit demselben Namen wie der Objekttyp definiert wird.
Beispiel 1: Im folgenden Beispiel verwenden wir das Objekttyp-Member, um Datensรคtze mit den Werten ('RRR', 1005, 20000, 1000) und ('PPP', 1006, 20000, 1001) in die Tabelle โempโ einzufรผgen. Nach dem Einfรผgen der Daten zeigen wir diese mithilfe desselben Objekttyp-Members an. Auรerdem verwenden wir einen expliziten Konstruktor, um die Manager-ID fรผr den zweiten Datensatz mit dem Standardwert 1001 zu belegen.
Wir fรผhren es in den folgenden Schritten durch.
- Schritt 1: Erstellen Sie den Objekttyp und den Objekttypkรถrper.
- Schritt 2: Erstellen Sie einen anonymen Block, um den Objekttyp รผber den impliziten Konstruktor fรผr emp_no 1005 aufzurufen.
- Schritt 3: Erstellen Sie einen anonymen Block, um den Objekttyp รผber den expliziten Konstruktor fรผr emp_no 1006 aufzurufen.
Schritt 1) โโObjekttyp und Objekttypkรถrper erstellen.
Der folgende Screenshot zeigt die Erstellung der Objekttypspezifikation emp_object mit ihren Attributen und Elementen.
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); /
Der folgende Screenshot zeigt, wie der Rumpf des Typs emp_object mit dem expliziten Konstruktor und den Member-Prozeduren erstellt wird.
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 Erlรคuterung
- Code Zeile 1-9: Es wird der Objekttyp 'emp_object' mit 4 Attributen und 3 Membern erstellt. Er enthรคlt die Definition eines Konstruktors mit nur 3 Parametern. (Der tatsรคchliche implizite Konstruktor enthรคlt die Anzahl der Parameter, die der Anzahl der im Objekttyp vorhandenen Attribute entspricht.)
- Code Zeile 10: Erstellung des Typkรถrpers.
- Code Zeile 11-21: Den expliziten Konstruktor definieren. Den Attributen die Parameterwerte zuweisen und dem Attribut 'manager' den Standardwert '1001' zuweisen.
- Code Zeile 22-26: Definition des Elements 'insert_records', in das die Attributwerte in die Tabelle 'emp' eingefรผgt werden.
- Code Zeile 27-34: Das Element 'display_records' wird definiert, welches die Werte der Attribute des Objekttyps anzeigt.
Ausgang:
Typ erstellt
Typkรถrper erstellt
Schritt 2) Erstellen eines anonymen Blocks, um den erstellten Objekttyp รผber den impliziten Konstruktor fรผr emp_no 1005 aufzurufen.
Der untenstehende Screenshot zeigt den anonymen Block, der emp_object รผber den impliziten Konstruktor aufruft.
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 Erlรคuterung
- Code Zeile 37-45: Die Datensรคtze werden mithilfe des impliziten Konstruktors eingefรผgt. Der Aufruf des Konstruktors enthรคlt die tatsรคchliche Anzahl der Attributwerte.
- Code Zeile 38: Deklariert 'guru_emp_det' als Objekttyp 'emp_object'.
- Code Zeile 41: Die Anweisung 'guru_emp_det.display_records' ruft das Element 'display_records' auf und die Attributwerte werden angezeigt.
- Code Zeile 42: Die Anweisung 'guru_emp_det.insert_records' ruft das Element 'insert_records' auf, und die Attributwerte werden in die Tabelle eingefรผgt. Anschlieรend wird der Block ausgefรผhrt. Transaktion.
Ausgang:
Name des Mitarbeiters: RRR
Mitarbeiternummer: 1005
Gehalt: 20000
Manager: 1000
Schritt 3) Erstellen eines anonymen Blocks, um den erstellten Objekttyp รผber den expliziten Konstruktor fรผr emp_no 1006 aufzurufen.
Der untenstehende Screenshot zeigt den anonymen Block, der emp_object รผber den expliziten Konstruktor mit drei Argumenten aufruft.
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; /
Ausgang
Employee Name:PPP Employee Number:1006 Salary:20000 Manager:1001
Code Erlรคuterung:
- Code Zeile 46-53: Einfรผgen des Datensatzes mithilfe des expliziten Konstruktors.
- Code Zeile 46: Deklariert 'guru_emp_det' als Objekttyp 'emp_object'.
- Code Zeile 50: Die Anweisung 'guru_emp_det.display_records' ruft das Element 'display_records' auf und die Attributwerte werden angezeigt.
- Code Zeile 51: Die Anweisung 'guru_emp_det.insert_records' ruft die Methode 'insert_records' auf, und die Attributwerte werden in die Tabelle eingefรผgt. Da nur drei Argumente รผbergeben werden, setzt der explizite Konstruktor die Manager-ID auf ihren Standardwert 1001.
Vererbung im Objekttyp
Die Vererbungseigenschaft ermรถglicht es einem Unterobjekttyp, auf alle Attribute und Elemente des Oberobjekttyps bzw. des รผbergeordneten Objekttyps zuzugreifen.
Der Unterobjekttyp wird als geerbter Objekttyp, der Oberobjekttyp als Elternobjekttyp bezeichnet. Die folgende Syntax zeigt, wie Eltern- und Unterobjekttypen erstellt werden. Der Screenshot unten zeigt die Syntax fรผr den Elterntyp (SUPER), der als NICHT FINAL gekennzeichnet ist.
CREATE TYPE <object_type_name_parent> AS OBJECT ( <attribute_l><datatype>, . . )NOT FINAL; /
Syntaxerklรคrung:
- Die obige Syntax zeigt die Erstellung des SUPER-Typs. Die NOT FINAL-Klausel ermรถglicht die Vererbung des Typs.
Der folgende Screenshot zeigt die Syntax des vererbten (SUB)-Typs, die mit dem Schlรผsselwort UNDER erstellt wurde.
CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent> ( <attribute_l><datatype>, . ); /
Syntaxerklรคrung:
- Die obige Syntax zeigt die Erstellung des SUB-Typs. Er enthรคlt alle Elemente und Attribute des รผbergeordneten Objekttyps.
Beispiel 1: Im folgenden Beispiel verwenden wir die Vererbungseigenschaft, um einen Datensatz mit der Manager-ID โ1002โ fรผr den Datensatz (โRRRโ, 1007, 20000) einzufรผgen. Das Programm wird in den folgenden Schritten ausgefรผhrt.
- Schritt 1: Erstellen Sie den SUPER-Typ.
- Schritt 2: Erstellen Sie den Untertyp und den Rumpf.
- Schritt 3: Erstellen Sie einen anonymen Block, um den SUB-Typ aufzurufen.
Schritt 1) โโErstellen Sie einen SUPER-Typ oder einen รผbergeordneten Typ.
Der folgende Screenshot zeigt, wie der Supertyp emp_object mit der NOT FINAL-Klausel erstellt wird.
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 Erlรคuterung:
- Code Zeile 1-9: Es wird der Objekttyp โemp_objectโ mit vier Attributen und drei Membern erstellt. Er enthรคlt die Definition eines Konstruktors mit nur drei Parametern. Da er als โNOT FINALโ deklariert wurde, handelt es sich um einen Obertyp.
Schritt 2) Erstellen Sie einen Untertyp unter dem Obertyp.
Der folgende Screenshot zeigt, wie der geerbte Typ sub_emp_object und sein Rumpf erstellt werden.
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 Erlรคuterung:
- Code Zeile 10-13: Erstellung von 'sub_emp_object' als geerbter Typ mit einem zusรคtzlichen Attribut 'default_manager' und einer Member-Prozedurdeklaration.
- Code Zeile 14: Erstellen des Rumpfes fรผr den geerbten Objekttyp.
- Code Zeile 16-21: Die Prozedur definiert, welche Datensรคtze mit den Werten des SUPER-Objekttyps in die Tabelle โempโ einfรผgt, mit Ausnahme des Werts fรผr โManagerโ. Fรผr den Wert โManagerโ wird โdefault_managerโ aus dem SUB-Typ verwendet.
Schritt 3) Erstellen eines anonymen Blocks zum Aufruf des SUB-Typs.
Der untenstehende Screenshot zeigt den anonymen Block, der den SUB-Typ aufruft und die Standardmanager-ID einfรผgt.
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 Erlรคuterung:
- Code Zeile 25: Deklaration von 'guru_emp_det' als Typ 'sub_emp_object'.
- Code Zeile 27: Das Objekt wird mit dem impliziten Konstruktor initialisiert. Dieser Konstruktor hat fรผnf Parameter (vier Attribute des รผbergeordneten Typs und ein Attribut des untergeordneten Typs). Der letzte Parameter (1002) definiert den Wert des Attributs `default_manager`.
- Code Zeile 28: Die Methode 'insert_default_mgr' wird aufgerufen, um den Datensatz mit der im Konstruktor รผbergebenen Standardmanager-ID einzufรผgen.
Gleichheit von PL/SQL-Objekten
Objektinstanzen desselben Objekttyps kรถnnen auf Gleichheit verglichen werden. Dazu benรถtigt der Objekttyp eine spezielle Methode namens ORDER-Methode.
Die ORDER-Methode sollte eine Funktion sein, die einen numerischen Typ zurรผckgibt. Sie benรถtigt zwei Parameter als Eingabe (erster Parameter: die ID der Selbstobjektinstanz; zweiter Parameter: die ID einer anderen Objektinstanz).
Die IDs der beiden Objektinstanzen werden verglichen, und das Ergebnis wird als Zahl zurรผckgegeben.
- Ein positiver Wert bedeutet, dass die SELF-Objektinstanz grรถรer ist als die andere Instanz.
- Ein negativer Wert bedeutet, dass die SELF-Objektinstanz kleiner ist als die andere Instanz.
- Null bedeutet, dass die SELF-Objektinstanz mit der anderen Instanz identisch ist.
- Wenn eine der beiden Instanzen null ist, gibt die Funktion null zurรผck.
Der folgende Screenshot zeigt die Syntax der ORDER-Memberfunktion, die im Typrumpf fรผr den Gleichheitstest enthalten sein muss.
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; . . ); /
Syntaxerklรคrung:
- Die obige Syntax zeigt die ORDER-Funktion, die im Typrumpf fรผr den Gleichheitstest enthalten sein muss.
- Der Parameter fรผr diese Funktion sollte eine Instanz desselben Objekttyps sein.
- Die Funktion kann als โobj_instance_1.match(obj_instance_2)โ aufgerufen werden, und dieser Ausdruck gibt den angezeigten numerischen Wert zurรผck, wobei obj_instance_1 und obj_instance_2 Instanzen des Objekttyps sind.
Beispiel 1: Im folgenden Beispiel vergleichen wir zwei Objekte. Wir erstellen zwei Instanzen und vergleichen deren Attribut โGehaltโ. Dies geschieht in zwei Schritten.
- Schritt 1: Objekttyp und -kรถrper erstellen.
- Schritt 2: Erstellen Sie den anonymen Block zum Vergleichen der Objektinstanzen.
Schritt 1) โโErstellen des Objekttyps und des Objektkรถrpers.
Die folgenden Screenshots zeigen die Spezifikation emp_object_equality und ihren Rumpf, der die ORDER-Funktion definiert, die das Gehaltsattribut vergleicht.
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 Erlรคuterung:
- Code Zeile 1-4: Erstelle den Objekttyp 'emp_object_equality' mit 1 Attribut und 1 Element.
- Code Zeile 6-16: Die Funktion ORDER definiert, die das Attribut 'salary' der SELF-Instanz mit dem der Parameterinstanz vergleicht. Sie gibt einen negativen Wert zurรผck, wenn das Gehalt der SELF-Instanz niedriger ist, einen positiven Wert, wenn das Gehalt der SELF-Instanz hรถher ist, und 0, wenn die Gehรคlter gleich sind.
Code Ausgang:
Typ erstellt
Schritt 2) Erstellen des anonymen Blocks zum Vergleichen der Objektinstanzen.
Der untenstehende Screenshot zeigt den anonymen Block, der zwei emp_object_equality-Instanzen anhand des Gehalts vergleicht.
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; /
Ausgang
Salary of second instance is greater
Code Erlรคuterung:
- Code Zeile 20: Deklaration von 'l_obj_1' vom Typ 'emp_object_equality'.
- Code Zeile 21: Deklaration von 'l_obj_2' vom Typ 'emp_object_equality'.
- Code Zeile 23: Initialisiere 'l_obj_1' mit dem Gehaltswert '15000'.
- Code Zeile 24: Initialisiere 'l_obj_2' mit dem Gehaltswert '17000'.
- Code Zeile 25-33: Die Nachricht wird basierend auf der von der ORDER-Funktion zurรผckgegebenen Zahl ausgegeben.


















