PL/SQL - Objektorientierte Programmierung

Hallo da draußen, ambitionierte Programmierer! Heute machen wir uns auf eine aufregende Reise in die Welt der objektorientierten Programmierung (OOP) in PL/SQL. Machen Sie sich keine Sorgen, wenn Sie neu im Programmieren sind – ich werde Ihr freundlicher Guide sein und alles Schritt für Schritt erklären. Also, tauchen wir ein!

PL/SQL - Object Oriented

Was ist objektorientierte Programmierung?

Bevor wir loslegen, lassen Sie uns verstehen, worum es bei der OOP geht. Stellen Sie sich vor, Sie bauen ein Haus mit Lego-Steinen. Jeder Stein repräsentiert ein Objekt, und Sie können diese Steine auf verschiedene Weisen kombinieren, um komplexere Strukturen zu erstellen. Genau das tut die OOP in der Programmierung – sie ermöglicht es uns, Objekte zu erstellen und zu manipulieren, die realweltliche Entitäten darstellen.

Instanziieren eines Objekts

Nun lernen wir, wie man ein Objekt in PL/SQL erstellt (oder "instanciiert"). Stellen Sie es sich vor, wie man einen Lego-Charakter in Ihrer Programmierwelt zum Leben erweckt!

CREATE OR REPLACE TYPE person AS OBJECT (
name VARCHAR2(50),
age NUMBER,
MEMBER FUNCTION say_hello RETURN VARCHAR2
);

CREATE OR REPLACE TYPE BODY person AS
MEMBER FUNCTION say_hello RETURN VARCHAR2 IS
BEGIN
RETURN 'Hallo, mein Name ist ' || name || ' und ich bin ' || age || ' Jahre alt.';
END;
END;

DECLARE
john person;
BEGIN
john := person('John Doe', 30);
DBMS_OUTPUT.PUT_LINE(john.say_hello());
END;

In diesem Beispiel haben wir einen person-Objekttyp mit zwei Attributen (name und age) und einer Methode (say_hello) erstellt. Dann haben wir ein Objekt john instanziert und seine say_hello-Methode aufgerufen.

Member Methods

Member Methods sind wie besondere Fähigkeiten, die unsere Objekte besitzen. Lassen Sie uns eine weitere Methode zu unserem person-Objekt hinzufügen:

CREATE OR REPLACE TYPE person AS OBJECT (
name VARCHAR2(50),
age NUMBER,
MEMBER FUNCTION say_hello RETURN VARCHAR2,
MEMBER PROCEDURE have_birthday
);

CREATE OR REPLACE TYPE BODY person AS
MEMBER FUNCTION say_hello RETURN VARCHAR2 IS
BEGIN
RETURN 'Hallo, mein Name ist ' || name || ' und ich bin ' || age || ' Jahre alt.';
END;

MEMBER PROCEDURE have_birthday IS
BEGIN
age := age + 1;
DBMS_OUTPUT.PUT_LINE(name || ' ist jetzt ' || age || ' Jahre alt.');
END;
END;

DECLARE
john person;
BEGIN
john := person('John Doe', 30);
john.have_birthday();
DBMS_OUTPUT.PUT_LINE(john.say_hello());
END;

Hier haben wir eine have_birthday-Prozedur hinzugefügt, die das Alter der Person um 1 erhöht. Es ist, als würde man unserem Lego-Charakter die Fähigkeit geben, Geburtstage zu feiern!

Verwendung der Map-Methode

Die Map-Methode wird verwendet, um Objekte zu vergleichen. Es ist, als würde man unseren Objekten eine spezielle ID-Karte geben, die uns bei der Sortierung hilft. Sehen wir uns an, wie es funktioniert:

CREATE OR REPLACE TYPE person AS OBJECT (
name VARCHAR2(50),
age NUMBER,
MAP MEMBER FUNCTION get_id RETURN NUMBER
);

CREATE OR REPLACE TYPE BODY person AS
MAP MEMBER FUNCTION get_id RETURN NUMBER IS
BEGIN
RETURN age;
END;
END;

DECLARE
john person := person('John Doe', 30);
jane person := person('Jane Smith', 25);
BEGIN
IF john > jane THEN
DBMS_OUTPUT.PUT_LINE(john.name || ' ist älter');
ELSE
DBMS_OUTPUT.PUT_LINE(jane.name || ' ist älter');
END IF;
END;

In diesem Beispiel verwenden wir das age als ID für den Vergleich. Es ist, als würden wir Lego-Charaktere basierend auf ihrer Größe vergleichen!

Verwendung der Order-Methode

Die Order-Methode ist eine andere Möglichkeit, Objekte zu vergleichen, bietet jedoch mehr Flexibilität als die Map-Methode. Es ist, als hätten wir einen speziellen Richter, um unsere Lego-Charaktere zu vergleichen:

CREATE OR REPLACE TYPE person AS OBJECT (
name VARCHAR2(50),
age NUMBER,
ORDER MEMBER FUNCTION compare(p person) RETURN INTEGER
);

CREATE OR REPLACE TYPE BODY person AS
ORDER MEMBER FUNCTION compare(p person) RETURN INTEGER IS
BEGIN
IF self.age < p.age THEN
RETURN -1;
ELSIF self.age > p.age THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END;
END;

DECLARE
john person := person('John Doe', 30);
jane person := person('Jane Smith', 30);
BEGIN
IF john > jane THEN
DBMS_OUTPUT.PUT_LINE(john.name || ' ist älter');
ELSIF john < jane THEN
DBMS_OUTPUT.PUT_LINE(jane.name || ' ist älter');
ELSE
DBMS_OUTPUT.PUT_LINE('Sie sind gleich alt');
END IF;
END;

Diese Methode ermöglicht es uns, eine benutzerdefinierte Vergleichslogik zu definieren. Es ist besonders nützlich, wenn wir Objekte basierend auf mehreren Attributen vergleichen möchten.

Vererbung für PL/SQL-Objekte

Vererbung ist wie das Erstellen eines Familienstammbaums für unsere Objekte. Wir können neue Objekttypen erstellen, die Eigenschaften und Methoden von bestehenden übernehmen. Sehen wir uns das an:

CREATE OR REPLACE TYPE employee UNDER person (
job_title VARCHAR2(50),
salary NUMBER,
MEMBER FUNCTION get_annual_salary RETURN NUMBER
);

CREATE OR REPLACE TYPE BODY employee AS
MEMBER FUNCTION get_annual_salary RETURN NUMBER IS
BEGIN
RETURN salary * 12;
END;
END;

DECLARE
emp employee := employee('Alice Johnson', 35, 'Manager', 5000);
BEGIN
DBMS_OUTPUT.PUT_LINE(emp.say_hello());
DBMS_OUTPUT.PUT_LINE('Jährliches Einkommen: $' || emp.get_annual_salary());
END;

Hier ist employee ein Kind von person, das seine Attribute und Methoden erbt und eigene hinzufügt. Es ist, als würden wir einen besonderen Lego-Charakter erstellen, der alles kann, was ein regulärer Charakter kann, plus mehr!

Abstrakte Objekte in PL/SQL

Abstrakte Objekte sind wie.Blueprints für andere Objekte. Sie definieren eine Struktur, können aber nicht direkt instanziert werden. Lassen Sie uns ein abstraktes Objekt erstellen:

CREATE OR REPLACE TYPE shape AS OBJECT (
name VARCHAR2(50),
MEMBER FUNCTION get_area RETURN NUMBER
) NOT INSTANTIABLE NOT FINAL;

CREATE OR REPLACE TYPE circle UNDER shape (
radius NUMBER,
OVERRIDING MEMBER FUNCTION get_area RETURN NUMBER
);

CREATE OR REPLACE TYPE BODY circle AS
OVERRIDING MEMBER FUNCTION get_area RETURN NUMBER IS
BEGIN
RETURN 3.14159 * radius * radius;
END;
END;

DECLARE
c circle := circle('Mein Kreis', 5);
BEGIN
DBMS_OUTPUT.PUT_LINE('Fläche von ' || c.name || ': ' || c.get_area());
END;

In diesem Beispiel ist shape ein abstraktes Objekt, das eine gemeinsame Struktur für alle Formen definiert. circle ist eine konkrete Implementierung von shape. Es ist, als hätten wir ein allgemeines Lego-Bedienungs-handbuch (das abstrakte Objekt) und erstellen dann spezifische Lego-Modelle basierend darauf!

Und das war's! Wir haben die Grundlagen der objektorientierten Programmierung in PL/SQL behandelt. Denken Sie daran, Übung macht den Meister, also fürchten Sie sich nicht, mit diesen Konzepten zu experimentieren. Viel Spaß beim Programmieren!

Credits: Image by storyset