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.

Objekttypen in PL/SQL

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.

  1. Attribute
  2. 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.

Objekt erstellen in OracleObjekt erstellen in Oracle

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.

Deklarationsinitialisierung des Objekttyps

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.

Deklarationsinitialisierung 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

Konstruktoren

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);
/

Konstruktoren

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

Konstruktoren

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

Konstruktoren

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.

Vererbung im Objekttyp

CREATE TYPE <object_type_name_parent> AS OBJECT
(
<attribute_l><datatype>,
.
.
)NOT FINAL;
/

Syntaxerklärung:

  • Die obige Syntax zeigt die Erstellung des SUPER-Typs.

Vererbung im Objekttyp

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.

Vererbung im Objekttyp

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.

Vererbung im Objekttyp

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

Vererbung im Objekttyp

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.

Gleichheit von PL/SQL-Objekten

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.

Gleichheit von PL/SQL-Objekten

Gleichheit von PL/SQL-Objekten

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.

Gleichheit von PL/SQL-Objekten

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.