Premium

Stored Procedures und Functions sind nicht nur bequeme Container für eine Gruppe von Queries. Sie erlauben dir auch, recht komplexe Logik mit Verzweigungen und Schleifen umzusetzen.

In diesem Artikel schauen wir uns die wichtigsten Kontrollstrukturen an: die Verzweigungen IF und CASE sowie die WHILE-Schleife.

Die IF-Anweisung

IF führt Code abhängig davon aus, ob eine Bedingung erfüllt ist.

Syntax von IF

MySQL 8.1
IF bedingung THEN
    -- Code, der bei wahrer Bedingung ausgeführt wird
ELSEIF andere_bedingung THEN
    -- Code für die alternative Bedingung
ELSE
    -- Default-Code
END IF;
MySQL 8.1
IF bedingung THEN
    -- Code, der bei wahrer Bedingung ausgeführt wird
ELSIF andere_bedingung THEN
    -- Code für die alternative Bedingung
ELSE
    -- Default-Code
END IF;

Beispiel für IF

Wir bauen eine Procedure, die einen Studenten anhand seines Alters in eine Kategorie einordnet:

MySQL 8.1
CREATE PROCEDURE categorize_student_by_age(
    IN student_id INT,
    OUT category VARCHAR(20)
)
BEGIN
    DECLARE student_age INT;

    -- Alter des Studenten ermitteln
    SELECT TIMESTAMPDIFF(YEAR, birthday, CURDATE())
    INTO student_age
    FROM Student
    WHERE id = student_id;

    -- Kategorie anhand des Alters bestimmen
    IF student_age < 18 THEN
        SET category = 'Minderjährig';
    ELSEIF student_age BETWEEN 18 AND 25 THEN
        SET category = 'Jung';
    ELSE
        SET category = 'Erwachsen';
    END IF;
END;

-- Aufruf der Procedure
CALL categorize_student_by_age(1, @category);
SELECT @category AS age_category;

Wir bauen eine Function, die einen Studenten anhand seines Alters in eine Kategorie einordnet:

MySQL 8.1
CREATE OR REPLACE FUNCTION categorize_student_by_age(student_id INT)
RETURNS VARCHAR(20)
LANGUAGE plpgsql
AS $$
DECLARE
    student_age INT;
    category VARCHAR(20);
BEGIN
    -- Alter des Studenten ermitteln
    SELECT EXTRACT(YEAR FROM AGE(CURRENT_DATE, birthday))
    INTO student_age
    FROM Student
    WHERE id = student_id;

    -- Kategorie anhand des Alters bestimmen
    IF student_age < 18 THEN
        category := 'Minderjährig';
    ELSIF student_age BETWEEN 18 AND 25 THEN
        category := 'Jung';
    ELSE
        category := 'Erwachsen';
    END IF;

    RETURN category;
END;
$$;

-- Aufruf der Function
SELECT categorize_student_by_age(1) AS age_category;
age_category
Jung

Die CASE-Anweisung

CASE bietet eine elegantere Möglichkeit, mehrere Bedingungen zu verarbeiten.

Syntax von CASE

MySQL 8.1
CASE
    WHEN bedingung1 THEN ergebnis1
    WHEN bedingung2 THEN ergebnis2
    ELSE default_ergebnis
END CASE;
MySQL 8.1
CASE
    WHEN bedingung1 THEN ergebnis1
    WHEN bedingung2 THEN ergebnis2
    ELSE default_ergebnis
END CASE;

Beispiel für CASE

Wir bauen dieselbe Kategorisierungs-Procedure, diesmal mit CASE:

MySQL 8.1
CREATE PROCEDURE categorize_student_with_case(
    IN student_id INT,
    OUT category VARCHAR(20)
)
BEGIN
    DECLARE student_age INT;

    -- Alter des Studenten ermitteln
    SELECT TIMESTAMPDIFF(YEAR, birthday, CURDATE())
    INTO student_age
    FROM Student
    WHERE id = student_id;

    -- Kategorie mit CASE bestimmen
    SET category = CASE
        WHEN student_age < 18 THEN 'Minderjährig'
        WHEN student_age BETWEEN 18 AND 25 THEN 'Jung'
        ELSE 'Erwachsen'
    END;
END;

-- Aufruf der Procedure
CALL categorize_student_with_case(1, @category);
SELECT @category AS age_category;

Wir bauen dieselbe Kategorisierungs-Function, diesmal mit CASE:

MySQL 8.1
CREATE OR REPLACE FUNCTION categorize_student_with_case(student_id INT)
RETURNS VARCHAR(20)
LANGUAGE plpgsql
AS $$
DECLARE
    student_age INT;
    category VARCHAR(20);
BEGIN
    -- Alter des Studenten ermitteln
    SELECT EXTRACT(YEAR FROM AGE(CURRENT_DATE, birthday))
    INTO student_age
    FROM Student
    WHERE id = student_id;

    -- Kategorie mit CASE bestimmen
    category := CASE
        WHEN student_age < 18 THEN 'Minderjährig'
        WHEN student_age BETWEEN 18 AND 25 THEN 'Jung'
        ELSE 'Erwachsen'
    END;

    RETURN category;
END;
$$;

-- Aufruf der Function
SELECT categorize_student_with_case(1) AS age_category;
age_category
Jung

Die WHILE-Schleife

Mit WHILE kannst du Code wiederholt ausführen, solange eine Bedingung erfüllt ist.

Syntax von WHILE

MySQL 8.1
WHILE bedingung DO
    -- Code, der in der Schleife ausgeführt wird
END WHILE;
MySQL 8.1
WHILE bedingung LOOP
    -- Code, der in der Schleife ausgeführt wird
END LOOP;

Beispiel für WHILE

Hier ein Beispiel für eine Stored Procedure, die mehrere Testfächer anlegt:

MySQL 8.1
CREATE PROCEDURE create_test_subjects(IN count_subjects INT)
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE subject_id INT DEFAULT 20;

    WHILE i <= count_subjects DO
        INSERT INTO Subject (id, name)
        VALUES
        (
            subject_id + i,
            CONCAT('Test Subject ', i)
        );

        SET i = i + 1;
    END WHILE;
END;

-- 3 Testfächer anlegen
CALL create_test_subjects(3);

-- Ergebnis prüfen
SELECT * FROM Subject WHERE name LIKE 'Test Subject%';
MySQL 8.1
CREATE OR REPLACE PROCEDURE create_test_subjects(count_subjects INT)
LANGUAGE plpgsql
AS $$
DECLARE
    i INT := 1;
    subject_id INT := 20;
BEGIN
    WHILE i <= count_subjects LOOP
        INSERT INTO Subject (id, name)
        VALUES
        (
            subject_id + i,
            'Test Subject ' || i
        );

        i := i + 1;
    END LOOP;

    RAISE NOTICE '% Testfächer wurden erstellt', count_subjects;
END;
$$;

-- 3 Testfächer anlegen
CALL create_test_subjects(3);

-- Ergebnis prüfen
SELECT * FROM Subject WHERE name LIKE 'Test Subject%';
idname
21Test Subject 1
22Test Subject 2
23Test Subject 3

Mit Kontrollstrukturen werden Stored Procedures und Functions zu einem mächtigen Werkzeug, um komplexe Geschäftslogik direkt in der Datenbank umzusetzen! 🚀