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:
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.
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.
Kontrollstrukturen
Alle Sprachen unterstützen
IF...THEN,CASE,LOOP,FOR,WHILE, was das Schreiben von komplexen Algorithmen ermöglicht.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.
GO TO FULL VERSION