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.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: