CodeGym /Kurse /SQL SELF /Vergleich von PL/pgSQL mit anderen prozeduralen Programmi...

Vergleich von PL/pgSQL mit anderen prozeduralen Programmiersprachen (PL/SQL, T-SQL)

SQL SELF
Level 49 , Lektion 2
Verfügbar

In der Datenbankwelt gibt es mehrere Sprachen, die das klassische SQL erweitern und es ermöglichen, richtige Business-Logik direkt in der Datenbank zu schreiben. Jede ist für ihre Plattform optimiert, aber im Grunde lösen sie ähnliche Aufgaben – Datenbearbeitung automatisieren, vereinfachen und beschleunigen. Zu diesen Sprachen gehören PL/pgSQL für PostgreSQL, PL/SQL für Oracle und T-SQL für SQL Server. Jede hat ihre eigenen Besonderheiten, Vorteile und Eigenheiten, über die wir jetzt sprechen werden.

PL/pgSQL (Procedural Language/PostgreSQL Structured Query Language) ist eine prozedurale Programmiersprache, die in PostgreSQL integriert ist. Ihr Hauptzweck ist es, SQL um Features wie Variablen, Schleifen, Kontrollstrukturen und Fehlerbehandlung zu erweitern. Damit ist die Sprache ein mächtiges Tool, um komplexe Business-Logik direkt auf der Datenbankseite umzusetzen.

PL/SQL (Procedural Language/SQL) ist eine prozedurale Programmiersprache, die in Oracle-Datenbanken eingebaut ist. Sie bietet ähnliche Möglichkeiten zur Datenverarbeitung und zum Erstellen von Prozeduren, Funktionen und Packages. PL/SQL gilt als sehr ausgereifte Sprache dank Jahrzehnten der Weiterentwicklung und einer reichen Tool-Ökosphäre.

T-SQL (Transact-SQL) ist eine von Microsoft entwickelte Sprache für SQL Server. Sie erweitert Standard-SQL um Variablen, Kontrollstrukturen und andere prozedurale Features. T-SQL hat seine eigenen Besonderheiten bei Transaktionen, Cursornutzung und JSON-Verarbeitung.

Gemeinsamkeiten zwischen PL/pgSQL, PL/SQL und T-SQL

Auf den ersten Blick wirken alle drei Sprachen ziemlich ähnlich. Kein Wunder, denn sie haben das gleiche Ziel – dir als Entwickler helfen, Business-Logik direkt in der Datenbank umzusetzen. Schauen wir uns die wichtigsten Gemeinsamkeiten an:

  1. Block-Syntax

    Alle drei Sprachen bieten eine strukturierte Art, prozeduralen Code zu schreiben. Die wichtigsten Elemente:

    • Variablendeklaration.
    • Haupt-Block für die Ausführung (BEGIN ... END).
    • Unterstützung für Fehlerbehandlung.
  2. Variablen

    Du kannst in allen diesen Sprachen Variablen deklarieren und verwenden. Beispiel für eine Variablendeklaration in PL/pgSQL:

    DECLARE
        student_id INT;
    BEGIN
        student_id := 10;
    END;
    

    Das Gleiche geht auch in PL/SQL und T-SQL.

  3. Kontrollstrukturen

    Alle Sprachen unterstützen IF...THEN, CASE, LOOP, FOR, WHILE, was das Schreiben von komplexen Algorithmen ermöglicht.

  4. Funktionen und Prozeduren

    Du kannst eigene Funktionen und Prozeduren erstellen und aufrufen, die entweder einzelne Werte oder ganze Tabellen zurückgeben.

Unterschiede zwischen PL/pgSQL, PL/SQL und T-SQL

Entwickler stehen oft vor der Situation, von einer Datenbank auf eine andere umzusteigen. Da ist es wichtig, die Feinheiten der Sprachen zu kennen. Schauen wir uns die wichtigsten Unterschiede an.

Variablendeklaration

PL/pgSQL: Variablen werden im DECLARE-Block deklariert. Für die Zuweisung nutzt man :=.

DECLARE
    total_students INT;
BEGIN
    total_students := 5;
END;

PL/SQL: Die Deklaration ist ähnlich wie bei PL/pgSQL, aber der Typ kann mit %TYPE von einer Tabellenspalte übernommen werden.

DECLARE
    student_name students.name%TYPE;
BEGIN
    student_name := 'John';
END;

T-SQL: Variablen werden mit dem Schlüsselwort DECLARE deklariert, Zuweisung erfolgt mit SET oder SELECT.

DECLARE @total_students INT;
SET @total_students = 5;  -- oder
SELECT @total_students = COUNT(*) FROM students;

Fehlerbehandlung

PL/pgSQL: Nutzt den EXCEPTION-Block für Fehlerbehandlung. Zum Beispiel:

BEGIN
    SELECT * INTO my_var FROM nonexistent_table;
EXCEPTION
    WHEN others THEN
        RAISE NOTICE 'Ein Fehler ist aufgetreten!';
END;

PL/SQL: Nutzt auch EXCEPTION, aber mit detaillierterer Fehlerklassifikation.

BEGIN
    SELECT * INTO my_var FROM nonexistent_table;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('Keine Daten gefunden!');
END;

T-SQL: Nutzt TRY...CATCH-Konstrukte.

BEGIN TRY
    SELECT 1/0; -- Fehler: Division durch Null
END TRY
BEGIN CATCH
    PRINT 'Ein Fehler ist aufgetreten!';
END CATCH;

Arbeiten mit Cursorn

PL/pgSQL: Cursor sind implizit und können in Schleifen verwendet werden.

FOR row IN SELECT * FROM students LOOP
    RAISE NOTICE 'Student: %', row.name;
END LOOP;

PL/SQL: Cursor werden explizit deklariert. Zum Beispiel:

DECLARE
    CURSOR student_cursor IS SELECT * FROM students;
    student_row students%ROWTYPE;
BEGIN
    OPEN student_cursor;
    FETCH student_cursor INTO student_row;
    CLOSE student_cursor;
END;

T-SQL: Cursor werden mit dem Schlüsselwort CURSOR deklariert.

DECLARE student_cursor CURSOR FOR SELECT name FROM students;
OPEN student_cursor;
FETCH NEXT FROM student_cursor;
CLOSE student_cursor;
DEALLOCATE student_cursor;

Arbeiten mit Transaktionen

PL/pgSQL: Transaktionen werden mit BEGIN, COMMIT, ROLLBACK gesteuert.

PL/SQL: Transaktionen werden ähnlich mit COMMIT, ROLLBACK und SAVEPOINT gesteuert.

T-SQL: Hier gibt es zusätzlich BEGIN TRANSACTION für den Start einer Transaktion.

JSON-Unterstützung

PL/pgSQL: Sehr mächtige JSON-Verarbeitung mit den Datentypen JSON und JSONB. Beispiel:

SELECT data->>'key' FROM json_table;

PL/SQL: JSON-Support kam später dazu und ist etwas weniger flexibel.

T-SQL: Sehr komfortable JSON-Verarbeitung mit JSON_QUERY, JSON_VALUE und Co.

Wann solltest du PL/pgSQL, PL/SQL oder T-SQL verwenden?

PL/pgSQL:

  • Die offensichtliche Wahl, wenn deine Datenbank PostgreSQL ist.
  • Super für große Datenmengen dank starker Datentypen (JSONB, Arrays).
  • Offenes Ökosystem, viel Flexibilität.

PL/SQL:

  • Die Wahl für Oracle-Produkte.
  • Reiches Ökosystem für Datenbearbeitung (Packages, eingebaute Prozeduren).

T-SQL:

  • Wird in Microsoft SQL Server verwendet.
  • Ideal für Microsoft-Anwendungen und Integration in den Microsoft Azure Stack.

Beispiel für die gleiche Aufgabe in PL/pgSQL, PL/SQL und T-SQL

Aufgabe: Die Anzahl der Studenten zählen und das Ergebnis zurückgeben

PL/pgSQL:

CREATE FUNCTION count_students() RETURNS INT AS $$
DECLARE
    total INT;
BEGIN
    SELECT COUNT(*) INTO total FROM students;
    RETURN total;
END;
$$ LANGUAGE plpgsql;

PL/SQL:

CREATE OR REPLACE FUNCTION count_students RETURN NUMBER IS
    total NUMBER;
BEGIN
    SELECT COUNT(*) INTO total FROM students;
    RETURN total;
END;

T-SQL:

CREATE FUNCTION count_students()
RETURNS INT
AS
BEGIN
    DECLARE @total INT;
    SELECT @total = COUNT(*) FROM students;
    RETURN @total;
END;

Jetzt kennst du die ungefähren Unterschiede zwischen PL/pgSQL, PL/SQL und T-SQL. Jede Sprache hat ihre eigenen Besonderheiten und Einsatzszenarien, die sie einzigartig machen. Die Wahl der Sprache (und der Datenbank) hängt immer von deinen Anforderungen und dem Projekt ab.

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION