Oracle Tutorial zu PL/SQL-Objekttypen mit BEISPIELEN
Was ist der Objekttyp in PL/SQL?
Objektorientierte Programmierung eignet sich besonders fรผr den Aufbau wiederverwendbarer Komponenten und komplexer Anwendungen. Sie sind um โObjekteโ statt um โAktionenโ herum organisiert, d. h. die Programme sind so konzipiert, dass sie mit dem gesamten Objekt und nicht mit einer einzelnen Aktion arbeiten und interagieren. Dieses Konzept ermรถglicht es dem Programmierer, die Details auf Objektebene zu fรผllen und zu bearbeiten.
Das folgende Bild zeigt ein Beispiel fรผr den Objekttyp, bei dem ein Bankkonto als Objekteinheit betrachtet wird. Zu den Objektattributen gehรถren Dinge, die bestimmte Attributwerte enthalten, beispielsweise in โBankkontoโ; Dabei handelt es sich um die Kontonummer, den Kontostand usw., wรคhrend Objektmethoden Dinge wie die Berechnung des Zinssatzes, die Erstellung eines Kontoauszugs usw. beschreiben, die den Abschluss eines bestimmten Prozesses erfordern.
In PL/SQL basiert die objektorientierte Programmierung auf Objekttypen.
Ein Objekttyp kann jede reale Entitรคt darstellen. In diesem Kapitel werden wir weitere Objekttypen besprechen.
Komponenten von Objekttypen
PL / SQL Der Objekttyp besteht hauptsรคchlich aus zwei Komponenten.
- Attribute
- Mitglieder/Methoden
Attribute
Attribute sind die Spalte oder das Feld, in denen Daten gespeichert werden. Jedes Attribut wird dem Datentyp zugeordnet, der den Verarbeitungs- und Speichertyp fรผr dieses Attribut definiert. Das Attribut kann beliebig gรผltig sein PL/SQL-Datentyp, oder es kann von einem anderen Objekttyp sein.
Mitglieder/Methoden
Mitglieder oder Methoden sind Unterprogramme, die im Objekttyp definiert sind. Sie werden nicht zur Speicherung von Daten verwendet. Sie werden hauptsรคchlich zur Definition von Prozessen innerhalb des Objekttyps verwendet. Beispiele fรผr die Validierung von Daten vor dem Auffรผllen des Objekttyps. Sie werden im Objekttypabschnitt deklariert und im Objekttypkรถrperabschnitt des Objekttyps definiert. Der Kรถrperabschnitt im Objekttyp ist ein optionaler Teil. Wenn keine Mitglieder vorhanden sind, enthรคlt ein Objekttyp keinen Kรถrperteil.
Objekt erstellen in Oracle
Ein Objekttyp kann nicht auf Unterprogrammebene erstellt werden. Er kann nur auf Schemaebene erstellt werden. Sobald der Objekttyp im Schema definiert ist, kann dieser in Unterprogrammen verwendet werden. Der Objekttyp kann mit โCREATE TYPEโ erstellt werden. Der Typkรถrper kann erst erstellt werden, nachdem sein Objekttyp erstellt wurde.
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 von โOBJECTโ mit Attributen und โOBJECT-BODYโ 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 im Programm verwendet werden kรถnnen.
Sobald der Objekttyp erstellt wurde, kann er im deklarativen Abschnitt des Unterprogramms verwendet werden, um eine Variable dieses Objekttyps zu deklarieren.
Immer wenn im Unterprogramm eine Variable als Objekttyp deklariert wird, wird zur Laufzeit eine neue Instanz des Objekttyps erstellt, und diese neu erstellte Instanz kann auf den Variablennamen verwiesen werden. Auf diese Weise kann ein einzelner Objekttyp mehrere Werte unter verschiedenen Instanzen speichern.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Syntaxerklรคrung:
- Die obige Syntax zeigt die Deklaration einer Variablen als Objekttyp im deklarativen Abschnitt.
Sobald die Variable in einem Unterprogramm als Objekttyp deklariert ist, ist sie atomar null, d. h. das gesamte Objekt selbst ist null. Sie muss mit Werten initialisiert werden, um sie im Programm verwenden zu kรถnnen. Sie kรถnnen mithilfe von Konstruktoren initialisiert werden.
Konstruktoren sind die implizite Methode eines Objekts, auf die mit demselben Namen wie dem Objekttyp verwiesen werden kann. Die folgende Syntax zeigt die Initialisierung des Objekttyps.
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.
- Jetzt ist das Objekt selbst nicht null, da es initialisiert wurde, aber die Attribute innerhalb des Objekts sind null, da wir diesen Attributen keine Werte zugewiesen haben.
Konstruktoren
Konstruktoren sind die implizite Methode eines Objekts, auf die mit demselben Namen wie dem Objekttyp verwiesen werden kann. Immer wenn auf das Objekt zum ersten Mal verwiesen wird, wird dieser Konstruktor implizit aufgerufen.
Wir kรถnnen die Objekte auch mit diesem Konstruktor initialisieren. Der Konstruktor kann explizit definiert werden, indem das Mitglied im Objekttypkรถrper mit demselben Namen wie der Objekttyp definiert wird.
Beispiel 1: Im folgenden Beispiel verwenden wir das Objekttyp-Element, um den Datensatz mit den Werten ('RRR', 1005, 20000, 1000) und ('PPP', 1006, 20000, 1001) in die emp-Tabelle einzufรผgen. Sobald die Daten eingefรผgt sind, zeigen wir sie mit dem Objekttyp-Element an. Wir verwenden auรerdem den expliziten Konstruktor, um die Manager-ID standardmรครig mit dem Wert 1001 fรผr den zweiten Datensatz zu fรผllen.
Wir werden es in den folgenden Schritten ausfรผhren.
- Step1:
- Objekttyp erstellen
- Kรถrper des Objekttyps
- Schritt 2: Erstellen eines anonymen Blocks zum Aufrufen des erstellten Objekttyps รผber den impliziten Konstruktor fรผr emp_no 1005.
- Schritt 3: Erstellen eines anonymen Blocks zum Aufrufen des erstellten Objekttyps รผber den expliziten Konstruktor fรผr emp_no 1006.
Schritt 1) Erstellen Sie einen Objekttyp und einen Objekttypkรถrper
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 Erklรคrung
- Codezeile 1-9: Erstellen des Objekttyps โemp_objectโ mit 4 Attributen und 3 Mitgliedern. Es enthรคlt die Definition von Konstruktoren mit nur 3 Parametern. (Der tatsรคchliche implizite Konstruktor enthรคlt die Anzahl der Parameter, die der Anzahl der im Objekttyp vorhandenen Attribute entspricht.)
- Codezeile 10: Erstellen des Typkรถrpers.
- Codezeile 11-21: Definieren des expliziten Konstruktors. Zuweisen des Parameterwerts zu den Attributen und Zuweisen des Werts fรผr das Attribut โManagerโ mit dem Standardwert โ1001โ.
- Codezeile 22-26: Definieren des Mitglieds โinsert_recordsโ, in dem die Attributwerte in die Tabelle โempโ eingefรผgt werden.
- Codezeile 27-34: Definieren des Members โdisplay_recordsโ, in dem die Werte der Objekttypattribute angezeigt werden.
Ausgang
Typ erstellt
Typkรถrper erstellt
Schritt 2) Erstellen eines anonymen Blocks zum Aufrufen des erstellten Objekttyps รผber einen impliziten Konstruktor fรผr 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 Erklรคrung
- Codezeile 37-45: Einfรผgen der Datensรคtze mit dem impliziten Konstruktor. Der Aufruf des Konstruktors enthรคlt die tatsรคchliche Anzahl der Attributwerte.
- Codezeile 38: Deklariert guru_emp_det als Objekttyp โemp_objectโ.
- Codezeile 41: Anweisung 'guru_emp_det.display_records' ruft die Memberfunktion 'diplay_records' auf und die Attributwerte werden angezeigt
- Codezeile 42: Die Anweisung โguru_emp_det.insert_recordsโ hat die Memberfunktion โinsert_recordsโ aufgerufen und die Attributwerte werden in die Tabelle eingefรผgt.
Ausgang
Name des Mitarbeiters: RRR
Mitarbeiternummer: 1005
Gehalt: 20000
Manager: 1000
Schritt 3) Erstellen eines anonymen Blocks zum Aufrufen des erstellten Objekttyps รผber den expliziten Konstruktor fรผr 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; /
Ausgang
Employee Name:PPP Employee Number:1006 Salary:20000 Manager:1001
Code-Erklรคrung:
- Codezeile 46-53: Einfรผgen der Datensรคtze mit dem expliziten Konstruktor.
- Codezeile 46: Deklariert guru_emp_det als Objekttyp โemp_objectโ.
- Codezeile 50: Anweisung 'guru_emp_det.display_records' ruft die Memberfunktion 'display_records' auf und die Attributwerte werden angezeigt
- Codezeile 51: Die Anweisung โguru_emp_det.insert_recordsโ hat die Memberfunktion โinsert_recordsโ aufgerufen und die Attributwerte werden in die Tabelle eingefรผgt.
Vererbung im Objekttyp
Die Vererbungseigenschaft ermรถglicht dem Unterobjekttyp den Zugriff auf alle Attribute und Mitglieder des รผbergeordneten Objekttyps oder รผbergeordneten Objekttyps.
Der Unterobjekttyp wird als geerbter Objekttyp bezeichnet, und der รผbergeordnete Objekttyp wird als รผbergeordneter Objekttyp bezeichnet. Die folgende Syntax zeigt, wie ein รผbergeordneter und geerbter Objekttyp erstellt wird.
CREATE TYPE <object_type_name_parent> AS OBJECT ( <attribute_l><datatype>, . . )NOT FINAL; /
Syntaxerklรคrung:
- Die obige Syntax zeigt die Erstellung des SUPER-Typs.
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. Es enthรคlt alle Mitglieder und Attribute des รผbergeordneten Objekttyps.
Example1: Im folgenden Beispiel verwenden wir die Vererbungseigenschaft, um den Datensatz mit der Manager-ID โ1002โ fรผr den folgenden Datensatz (โRRRโ, 1007, 20000) einzufรผgen.
Wir werden das obige Programm in den folgenden Schritten ausfรผhren
- Schritt 1: SUPER-Typ erstellen.
- Schritt 2: Erstellen Sie einen SUB-Typ und einen SUB-Kรถrper.
- Schritt 3: Erstellen eines anonymen Blocks zum Aufrufen des SUB-Typs.
Schritt 1) Erstellen Sie einen SUPER-Typ oder einen รผbergeordneten Typ.
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-Erklรคrung:
- Codezeile 1-9: Erstellen des Objekttyps โemp_objectโ mit 4 Attributen und 3 Mitgliedern. Es enthรคlt die Definition von Konstruktoren mit nur 3 Parametern. Es wurde als โNOT FINALโ deklariert, es handelt sich also um einen รผbergeordneten Typ.
Schritt 2) Erstellen Sie den SUB-Typ unter dem SUPER-Typ.
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-Erklรคrung:
- Codezeile 10-13: Erstellen des sub_emp_object als geerbten Typ mit einem zusรคtzlichen Attribut โdefault_managerโ und einer Mitgliedsprozedurdeklaration.
- Codezeile 14: Erstellen des Kรถrpers fรผr den geerbten Objekttyp.
- Codezeile 16-21: Definieren der Mitgliedsprozedur, die die Datensรคtze mit den Werten vom Objekttyp โSUPERโ in die Tabelle โempโ einfรผgt, mit Ausnahme des Managerwerts. Als Managerwert wird der Typ โdefault_managerโ vom Typ โSUBโ verwendet.
Schritt 3) Erstellen eines anonymen Blocks zum Aufrufen des SUB-Typs
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-Erklรคrung:
- Codezeile 25: Deklaration von โguru_emp_detโ als Typ โsub_emp_objectโ.
- Codezeile 27: Initialisieren des Objekts mit dem impliziten Konstruktor. Der Konstruktor verfรผgt รผber 5 Parameter (4 Attribute vom Typ PARENT und 2 Attribute vom Typ SUB). Der letzte Parameter (1002) definiert den Wert fรผr das Attribut โdefault_managerโ.
- Codezeile 28: Aufruf des Mitglieds โinsert_default_mgrโ, um die Datensรคtze mit der im Konstruktor รผbergebenen Standard-Manager-ID einzufรผgen.
Gleichheit von PL/SQL-Objekten
Die Objektinstanz, die zu denselben Objekten gehรถrt, kann auf Gleichheit verglichen werden. Dazu benรถtigen wir eine spezielle Methode im Objekttyp namens โORDERโ-Methode.
Diese โORDERโ-Methode sollte die Funktion sein, die den numerischen Typ zurรผckgibt. Als Eingabe werden zwei Parameter benรถtigt (erster Parameter: ID der Selbstobjektinstanz, zweiter Parameter: ID einer anderen Objektinstanz).
Die ID der beiden Objektinstanzen wird verglichen und das Ergebnis wird numerisch zurรผckgegeben.
- Ein positiver Wert bedeutet, dass die SELF-Objektinstanz grรถรer als eine andere Instanz ist.
- Ein negativer Wert bedeutet, dass die SELF-Objektinstanz kleiner als eine andere Instanz ist.
- Null bedeutet, dass die SELF-Objektinstanz einer anderen Instanz entspricht.
- Wenn eine der Instanzen null ist, gibt diese Funktion null zurรผck.
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 zur Gleichheitsprรผfung in den Typkรถrper aufgenommen werden muss.
- Der Parameter fรผr diese Funktion sollte eine Instanz desselben Objekttyps sein.
- Die obige Funktion kann als โobj_instance_1.match(obj_instance_2)โ aufgerufen werden und dieser Ausdruck gibt den numerischen Wert wie gezeigt zurรผck, wobei obj_instance_1 und obj_instance_2 die Instanz von object_type_name sind.
Beispiel1: Im folgenden Beispiel werden wir sehen, wie man zwei Objekte vergleicht. Wir werden zwei Instanzen erstellen und das Attribut โGehaltโ zwischen ihnen vergleichen. Wir werden in zwei Schritten vorgehen.
- Schritt 1: Erstellen des Objekttyps und -kรถrpers.
- Schritt 2: Erstellen des anonymen Blocks zum Aufrufen des Vergleichs der Objektinstanz.
Schritt 1) Erstellen des Objekttyps und -kรถrpers.
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-Erklรคrung:
- Codezeile 1-4: Erstellen des Objekttyps โemp_object_equalityโ mit 1 Attribut und 1 Mitglied.
- Codezeile 6-16: Definieren der ORDER-Funktion, die das Attribut โGehaltโ der SELF-Instanz und des Parameterinstanztyps vergleicht. Sie gibt einen negativen Wert zurรผck, wenn das SELF-Gehalt kleiner ist, einen positiven Wert, wenn das SELF-Gehalt grรถรer ist, und 0, wenn die Gehรคlter gleich sind.
Codeausgabe:
Typ erstellt
Schritt 2) Erstellen des anonymen Blocks zum Aufrufen des Vergleichs der Objektinstanz.
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; /
Ausgang
Salary of second instance is greater
Code-Erklรคrung:
- Codezeile 20: Deklarieren des l_obj_1 vom Typ emp_object_equality.
- Codezeile 21: Deklarieren des l_obj_2 vom Typ emp_object_equality.
- Codezeile 23: l_obj_1 wird mit dem Gehaltswert โ15000โ initialisiert.
- Codezeile 24: l_obj_1 wird mit dem Gehaltswert โ17000โ initialisiert.
- Codezeile 25-33: Drucken Sie die Nachricht basierend auf der Rรผckgabenummer aus der ORDER-Funktion.
Zusammenfassung
In diesem Kapitel haben wir den Objekttyp und seine Eigenschaften gesehen. Wir haben auch รผber Konstruktoren, Mitglieder, Attribute, Vererbung und Gleichheit in PL/SQL-Objekten gesprochen.


















