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.



















