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.