Was ist der Objekttyp in PL / SQL?
Die objektorientierte Programmierung eignet sich besonders zum Erstellen wiederverwendbarer Komponenten und komplexer Anwendungen. Sie sind eher nach "Objekten" als nach "Aktionen" organisiert, dh die Programme sind so konzipiert, dass sie mit dem gesamten Objekt und nicht mit der einzelnen Aktion arbeiten und interagieren. Dieses Konzept ermöglicht es dem Programmierer, die Details auf Objekteinheitsebene zu füllen und zu bearbeiten.
Das folgende Bild zeigt ein Beispiel für den Objekttyp, bei dem ein Bankkonto als Objektentität betrachtet wird. Zu den Objektattributen gehören Dinge, die einige Attributwerte enthalten, z. B. im Bankkonto. Es ist die Kontonummer, der Kontostand usw., während Objektmethoden Dinge wie die Berechnung des Zinssatzes, die Erstellung eines Kontoauszugs usw. beschreiben, für die ein bestimmter Prozess abgeschlossen sein muss.
In PL / SQL basiert die objektorientierte Programmierung auf Objekttypen.
Ein Objekttyp kann jede reale Entität darstellen. In diesem Kapitel werden weitere Objekttypen behandelt.
In diesem Tutorial lernen Sie:
- Komponenten von Objekttypen
- Objekt in Oracle erstellen
- Deklarationsinitialisierung des Objekttyps
- Konstruktoren
- Vererbung im Objekttyp
- Gleichheit von PL / SQL-Objekten
Komponenten von Objekttypen
Der PL / SQL-Objekttyp enthält hauptsächlich zwei Komponenten.
- Attribute
- Mitglieder / Methoden
Attribute
Attribute sind die Spalte oder das Feld, in dem Daten gespeichert werden. Jedes Attribut wird dem Datentyp zugeordnet, der den Verarbeitungs- und Speichertyp für dieses Attribut definiert. Das Attribut kann von einem beliebigen gültigen PL / SQL-Datentyp oder von einem anderen Objekttyp sein.
Mitglieder / Methoden
Mitglieder oder Methoden sind Unterprogramme, die im Objekttyp definiert sind. Sie werden nicht zum Speichern von Daten verwendet. Sie werden hauptsächlich verwendet, um Prozesse innerhalb des Objekttyps zu definieren. Beispiele zum Überprüfen von Daten vor dem Auffüllen des Objekttyps. Sie werden im Objekttypabschnitt deklariert und im Objekttypkörperabschnitt des Objekttyps definiert. Der Körperteil im Objekttyp ist ein optionales Teil. Wenn keine Mitglieder vorhanden sind, enthält ein Objekttyp kein Körperteil.
Objekt in Oracle erstellen
Ein Objekttyp kann nicht auf Unterprogrammebene erstellt werden. Sie können 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 nach dem Erstellen seines Objekttyps erstellt werden.
CREATE TYPEAS OBJECT( ,… );/CREATE TYPE BODY AS OBJECT(MEMBER[PROCEDURE|FUNCTION] IS BEGIN END;… );/
Syntax Erläuterung:
- 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 bei anderen Komponenten in PL / SQL müssen auch Objekttypen deklariert werden, bevor sie im Programm verwendet werden.
Sobald der Objekttyp erstellt wurde, kann er im deklarativen Unterprogrammabschnitt verwendet werden, um eine Variable dieses Objekttyps zu deklarieren.
Immer wenn eine Variable im Unterprogramm 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;BEGIN… END;/
Syntax Erläuterung:
- 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, dh das gesamte Objekt selbst ist null. Es muss mit Werten initialisiert werden, um sie im Programm zu verwenden. Sie können mit Konstruktoren initialisiert werden.
Konstruktoren sind die implizite Methode eines Objekts, auf die mit demselben Namen wie der Objekttyp verwiesen werden kann. Die folgende Syntax zeigt die Initialisierung des Objekttyps.
DECLARE;BEGIN := ();END;/
Syntax Erläuterung:
- 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 der Objekttyp verwiesen werden kann. Immer wenn das Objekt zum ersten Mal referenziert wird, wird dieser Konstruktor implizit aufgerufen.
Mit diesem Konstruktor können wir die Objekte auch initialisieren. Der Konstruktor kann explizit definiert werden, indem das Element im Objekttypkörper mit demselben Namen wie der Objekttyp definiert wird.
Beispiel 1 : Im folgenden Beispiel verwenden wir das Objekttypelement, um den Datensatz mit den Werten ('RRR', 1005, 20000, 1000) und ('PPP', 1006, 20000, 1001) in die Tabelle emp einzufügen. Sobald die Daten eingefügt sind, werden sie mit dem Objekttypelement angezeigt. Wir werden auch den expliziten Konstruktor verwenden, 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.
- Schritt 1:
- Objekttyp erstellen
- Objekttyp Körper
- 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 den Objekttyp und den 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 ASCONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2,p_salary NUMBER)RETURN SELF AS RESULTISBEGINDbms_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_recordsISBEGININSERT INTO emp VALUES(emp_noemp_name,salary,manager);ENDMEMBER PROCEDURE display_recordsISBEGINDbms_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 Elementen. 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 Elements 'insert_records', in das die Attributwerte in die Tabelle 'emp' eingefügt werden.
- Codezeile 27-34 : Definieren des Elements 'display_records', in dem die Werte der Objekttypattribute angezeigt werden.
Ausgabe
Typ erstellt
Typ body erstellt
Schritt 2) Erstellen eines anonymen Blocks zum Aufrufen des erstellten Objekttyps über den impliziten Konstruktor für emp_no 1005
DECLAREguru_emp_det emp_object;BEGINguru_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 den guru_emp_det als Objekttyp von 'emp_object'.
- Codezeile 41 : Anweisung 'guru_emp_det.display_records', die als Mitgliedsfunktion 'diplay_records' bezeichnet wird, und die Attributwerte werden angezeigt
- Codezeile 42 : Anweisung 'guru_emp_det.insert_records', die als Mitgliedsfunktion 'insert_records' bezeichnet wird, und die Attributwerte werden in die Tabelle eingefügt.
Ausgabe
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
DECLAREguru_emp_det emp_object;BEGINguru_emp_det:=emp_object(1006,'PPP',20000);guru_emp_det.display_records;guru_emp_det.insert_records;COMMIT;END;/
Ausgabe
Employee Name:PPPEmployee Number:1006Salary:20000Manager:1001
Code Erläuterung:
- Codezeile 46-53 : Einfügen der Datensätze mit dem expliziten Konstruktor.
- Codezeile 46 : Deklariert den guru_emp_det als Objekttyp von 'emp_object'.
- Codezeile 50 : Anweisung 'guru_emp_det.display_records', die als Mitgliedsfunktion 'display_records' bezeichnet wird, und die Attributwerte werden angezeigt
- Codezeile 51 : Anweisung 'guru_emp_det.insert_records', die als Mitgliedsfunktion 'insert_records' bezeichnet wird, und die Attributwerte werden in die Tabelle eingefügt.
Vererbung im Objekttyp
Mit der Vererbungseigenschaft kann der Unterobjekttyp auf alle Attribute und Mitglieder des Superobjekttyps oder des übergeordneten Objekttyps zugreifen.
Der Unterobjekttyp wird als geerbter Objekttyp und der Superobjekttyp als übergeordneter Objekttyp bezeichnet. Die folgende Syntax zeigt, wie übergeordneter und geerbter Objekttyp erstellt werden.
CREATE TYPEAS OBJECT( ,… )NOT FINAL;/
Syntax Erläuterung:
- Die obige Syntax zeigt die Erstellung des SUPER-Typs.
CREATE TYPEUNDER ( ,.);/
Syntax Erläuterung:
- Die obige Syntax zeigt die Erstellung des SUB-Typs. Es enthält alle Elemente und Attribute des übergeordneten Objekttyps.
Beispiel 1: Im folgenden Beispiel verwenden wir die Vererbungseigenschaft, um den Datensatz mit der Manager-ID als '1002' für den folgenden Datensatz einzufügen ('RRR', 1007, 20000).
Wir werden das obige Programm in den folgenden Schritten ausführen
- Schritt 1: Erstellen Sie den SUPER-Typ.
- Schritt 2: Erstellen Sie den SUB-Typ und den SUB-Body.
- Schritt 3: Erstellen eines anonymen Blocks zum Aufrufen des SUB-Typs.
Schritt 1) Erstellen Sie den SUPER-Typ oder den ü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 Erläuterung:
- Codezeile 1-9 : Erstellen des Objekttyps 'emp_object' mit 4 Attributen und 3 Elementen. Es enthält die Definition von Konstruktoren mit nur 3 Parametern. Es wurde als "NICHT ENDGÜLTIG" deklariert, es handelt sich also um einen übergeordneten Typ.
Schritt 2) Erstellen Sie den SUB-Typ unter SUPER-Typ.
CREATE OR REPLACE TYPE sub_emp_objectUNDER emp_object(default_manager NUMBER,MEMBER PROCEDURE insert_default_mgr);/CREATE OR REPLACE TYPE BODY sub_emp_objectASMEMBER PROCEDURE insert_default_mgrISBEGININSERT INTO empVALUES(emp_no,emp_name:salary,manager):END;END;/
Code Erläuterung:
- Codezeile 10-13 : Erstellen des sub_emp_object als geerbten Typ mit einem zusätzlichen Attribut 'default_manager' und einer Deklaration der Mitgliedsprozedur.
- Codezeile 14 : Erstellen des Körpers für den geerbten Objekttyp.
- Codezeile 1 6 -21 : Definieren der Elementprozedur, die die Datensätze in die Tabelle "emp" einfügt, mit den Werten vom Objekttyp 'SUPER', mit Ausnahme des Managerwerts. Für den Managerwert wird der Typ 'default_manager' vom Typ 'SUB' verwendet.
Schritt 3) Erstellen eines anonymen Blocks zum Aufrufen des SUB-Typs
DECLAREguru_emp_det sub_emp_object;BEGINguru_emp_det:= sub_emp_object(1007,'RRR',20000,1000,1002);guru_emp_det.insert_default_mgr;COMMIT;END;/
Code Erläuterung:
- Codezeile 25 : Deklarieren von 'guru_emp_det' als 'sub_emp_object' Typ.
- 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 : Aufrufen des Mitglieds 'insert_default_mgr', um die Datensätze mit der im Konstruktor übergebenen Standardmanager-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 die spezielle Methode im Objekttyp 'ORDER'-Methode.
Diese 'ORDER'-Methode sollte die Funktion sein, die den numerischen Typ zurückgibt. Es werden zwei Parameter als Eingabe verwendet (erster Parameter: ID der Selbstobjektinstanz, zweiter Parameter: ID einer anderen Objektinstanz).
Die ID der Instanz mit zwei Objekten wird verglichen und das Ergebnis in numerischer Form 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 BODYAS OBJECT(ORDER MEMBER FUNCTION match( object_type_name_ 1)RETURN INTEGER IS BEGINIF parameter THENRETURN -1; --any negative number will doELSIF id>c.id THENRETURN 1; -any positive number will doELSERETURN 0;END IF;END;… );/
Syntax Erläuterung:
- Die obige Syntax zeigt die ORDER-Funktion, die zur Gleichheitsprüfung in den Typentext 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.
Beispiel 1 : Im folgenden Beispiel sehen wir, wie zwei Objekte verglichen werden. Wir werden zwei Instanzen erstellen und das Attribut 'Gehalt' zwischen ihnen vergleichen. Wir werden zwei Schritte machen.
- Schritt 1: Erstellen des Objekttyps und des Körpers.
- Schritt 2: Erstellen des anonymen Blocks zum Aufrufen des Vergleichs der Objektinstanz.
Schritt 1) Erstellen des Objekttyps und des 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 ASORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGERISBEGIN IF salaryc.salaryTHEN RETURN 1;ELSERETURN 0;END IF: END;END;/
Code Erläuterung:
- Codezeile 1-4: Erstellen des Objekttyps 'emp_object_equality' mit 1 Attributen und 1 Element.
- Codezeile 6-16 : Definieren der ORDER-Funktion, die das 'Gehalt'-Attribut der SELF-Instanz und des Parameterinstanztyps vergleicht. Es gibt negativ zurück, wenn das SELBST-Gehalt niedriger ist, oder positiv, wenn das SELBST-Gehalt höher ist, und 0, wenn die Gehälter gleich sind.
Code-Ausgabe:
Typ erstellt
Schritt 2) Erstellen des anonymen Blocks zum Aufrufen des Vergleichs der Objektinstanz.
DECLAREl_obj_l emp_object_equality;l_obj_2 emp_object_equality;BEGINl_obj_l:=emp_object_equality(15000);l_obj_2:=emp_object_equality(17000);IF l_obj_1.equalS(l_obj_2)>0THENDbms_output.put_line(’Salary of first instance is greater’):ELSIF l_obj_l.equalS(l_obj_2)<0THENDbms_output.put_line(’Salary of second instance is greater’);ELSEDbms_output.put_line(’Salaries are equal’);END IF;END;/
Ausgabe
Salary of second instance is greater
Code Erläuterung:
- Codezeile 20 : Deklarieren von l_obj_1 vom Typ emp_object_equality.
- Codezeile 21 : Deklarieren von l_obj_2 vom Typ emp_object_equality.
- Codezeile 23 : Initialisierung von l_obj_1 mit dem Gehaltswert '15000'
- Codezeile 24 : Initialisierung von l_obj_1 mit dem Gehaltswert '17000'
- Codezeile 25-33 : Drucken Sie die Nachricht basierend auf der Rücksendenummer der ORDER-Funktion.
Zusammenfassung
In diesem Kapitel haben wir den Objekttyp und seine Eigenschaften gesehen. Wir haben auch über Konstruktoren, Elemente, Attribute, Vererbung und Gleichheit in PL / SQL-Objekten gesprochen.