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!
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