Programmierung in MySQL Teil 4 – Grundkonstrukte

Die Routinen aus dem letzten Teil meiner Artikelserie fielen noch in die Kategorie „Trivialbeispiele“. Genau wie in anderen Programmiersprachen, gibt es bei MySQL Variablen, If-Abfragen und Schleifen. Heute werde ich diese drei Grundkonstrukte vorstellen. Auch wenn der Dialekt jeder Programmiersprache immer ein wenig anders ist, sind doch die Grundideen meistens gleich und als Programmierer kann man sich recht schnell auch in SQL einfinden. Nach der Lektüre dieses Artikels kann man dann die ersten sinnvollen Routinen erstellen.

Überblick über die Artikelserie

  1. Sinn und Unsinn
  2. Einrichtung und Vorbereitung
  3. Die erste Routine
  4. Grundkonstrukte
  5. Cursor
  6. Trigger
  7. Der Event Scheduler

Variablen deklarieren

Ohne Variablen geht in keiner Programmiersprache etwas und so ist es auch in MySQL. Variablen werden mit dem Schlüsselwort DECLARE deklariert. Die (vereinfachte) Syntax dafür ist:

DECLARE Variablenname Variablentyp [DEFAULT Standardwert];

Diese Deklaration muss vor allen anderen Anweisungen in einer MySQL Routine erfolgen, ansonsten erzeugt MySQL einen Fehler. In der Regel hat man also oben in der Routine einen Block an Deklarationen. An Datentypen sind die üblichen Werte zugelassen, die man aus der Tabellendeklaration kennt (INT, VARCHAR, DATETIME, …). Als PHP-Programmierer muss man sich hier etwas umstellen, da jede Variable genau einen Datentypen hat, der nicht beliebig umgewandelt werden kann.

Um einer Variable einen Wert zuzuweisen, steht die Anweisung SET zur Verfügung:

SET Variablenname = neuer Variablenwert;

Als kleines Beispiel ändern wir die Hello World Prozedur aus dem letzten Beispiel ein wenig ab, sodass die Ausgabe zunächst in einer Variable gespeichert wird.

CREATE DEFINER=`root`@`localhost` PROCEDURE `hello_world`(par_name VARCHAR(32))
BEGIN
DECLARE var_output VARCHAR(128);
SET var_output = concat('Hello ', par_name);
SELECT var_output;
END

Ich setze vor Variablen gerne ein „var_“, um sie später in komplexen Queries besser von Spalten in Tabellen unterscheiden zu können. Zudem kann man so vermeiden, versehentlich reservierte Wörter als Variablenname zu verwenden. Nach der Deklaration weise ich der Variablen einen Wert zu und wähle diesen Wert anschließend aus. Das Ergebnis ist das Selbe, wie an Ende des letzten Artikels, nur wird diesmal eine Variable benutzt.

Die hier deklarierte Variable ist eine lokale Variable, die nur in dieser Prozedur gültig ist. Es gibt in MySQL auch globale Variablen. Diese starten mit dem Zeichen @ und sind in der gesamten Datenbankverbindung gültig. Globale Variablen müssen nicht mit DECLARE deklariert werden, sondern können direkt benutzt werden. Wie in anderen Sprachen auch, sollte man globale Variablen nur in Sonderfällen einsetzen, wo der gleiche Wert mehrfach benötigt wird.

Variable mit Werten aus der Datenbank füllen

In der Praxis benötigt man Variablen häufig, um Werte aus der Datenbank zwischen zu speichern. Die Syntax dafür ist ähnlich wie bei einem normalen SELECT:

SELECT Spaltenname INTO Variablenname FROM Tabellenname [WHERE ...];

Neben WHERE sind natürlich auch die anderen SELECT-Erweiterungen wie ORDER BY, GROUP BY, LIMIT etc. erlaubt. Man kann auch mehrere Spalten auswählen, muss dann aber die gleiche Anzahl an Variablen angeben. Kann kein passender Datensatz gefunden werden, bekommt die Variable den Wert NULL. Als kleines Beispiel habe ich die Hello World Prozedur so abgeändert, dass man ihr eine Id übergibt und sie sich daraus aus einer Tabelle den passenden Namen sucht:

CREATE DEFINER=`root`@`localhost` PROCEDURE `hello_world`(par_id INT)
BEGIN
DECLARE var_output, var_name VARCHAR(128);
SELECT test_name INTO var_name FROM test_table WHERE test_id = par_id;
SET var_output = concat('Hello ', var_name);
SELECT var_output;
END

Hier habe ich zusätzlich noch die Möglichkeit benutzt, über DECLARE mehrere Variablen auf ein Mal zu deklarieren.

If-Abfragen

Die Syntax für If-Abfragen ist wie folgt:

IF Bedingung THEN Anweisung(en)
[ELSEIF Bedingung THEN Anweisung(en)]
[ELSE Anweisung(en)]
END IF;

Soweit so gut, hier gibt es nicht viel zu beachten. Als Beispiel überprüft mein Hello World, ob es zu der übergebenen Id überhaupt einen Namen gibt und füllt die Variable ansonsten mit einem Standardwert:

CREATE DEFINER=`root`@`localhost` PROCEDURE `hello_world`(par_id INT)
BEGIN
DECLARE var_output, var_name VARCHAR(128);
SELECT test_name INTO var_name FROM test_table WHERE test_id = par_id;
IF var_name IS NULL THEN
SET var_name = 'Unbekannter';
END IF;
SET var_output = concat('Hello ', var_name);
SELECT var_output;
END

Ich habe hier zur besseren Übersicht die Anweisung im If-Fall nochmal in eine eigene Zeile gesetzt. Übergibt man der Prozedur jetzt eine ungültige Id, gibt sie „Hello Unbekannter“ aus.

Schleifen

MySQL kennt verschiedene Schleifen, meistens kommt man aber mit WHILE aus. Die Syntax ist wieder nichts Besonderes:

WHILE Bedingung DO
Anweisung(en)
END WHILE;

Da es hier gegenüber If keine neuen Sprachelemente gibt und mir ehrlich gesagt auch keine halbwegs sinnvolle Erweiterung meines Hello World einfällt, verzichte in an dieser Stelle auf ein Beispiel und verweise einfach auf das Beispiel vom MySQL Referenzhandbuch. Schleifen werden in MySQL meistens im Zusammenhang mit Cursorn verwendet, auf die ich im nächsten Teil der Serie näher eingehen werde. Dann wird es auch nochmal eine sinnvolle WHILE-Schleife als Beispiel geben.

Fazit

Wer bisher nur PHP und JavaScript programmiert hat, muss sich bei der Arbeit mit MySQL-Variablen ein wenig umgewöhnen. Ansonsten sind die Grundkonstrukte von MySQL auch nicht großartig anders, als in anderen Programmiersprachen. Mit den heute vorgestellten Anweisungen kann man anfangen, sinnvolle MySQL-Routinen zu erstellen. Was noch fehlt ist das Durchlaufen mehrerer Datensätze einer Tabelle. Dies wird in MySQL mit Cursorn realisiert, die ich im nächsten Teil der Serie vorstellen werde.

Solltest duFragen haben oder eine wichtige Anweisung hier vermissen, schreib einfach einen Kommentar.

Merkblatt

Damit du immer schnell nachgucken kannst wie das mit der MySQL Programmierung nochmal ging, habe ich ein zweiseitiges Merkblatt erstellt. Dort stehen alle Beispiele dieser Serie nochmal drauf. Du kannst das Merkblatt ausdrucken und mit einem Blick dein Gedächtnis auffrischen.

Jetzt herunterladen

Außerdem kannst du meine regelmäßigen Entwickler Tipps bestellen. Etwa ein Mal pro Monat verschicke ich Tipps zur Arbeit als Entwickler, sowohl zur technischen Seite als auch zur Zusammenarbeit mit Kunden.

Ich bin damit einverstanden, die Tipps per E-Mail zu erhalten, kann sie aber jederzeit abbestellen. Für den Versand wird der Anbieter CleverReach benutzt. Weitere Infos in der Datenschutz-Erklärung.


 


4 Gedanken zu “Programmierung in MySQL Teil 4 – Grundkonstrukte
  1. Was ist bei den Parametern mit den verschiedenen Typen
    * in
    * out
    * inout
    ?

  2. Hallo Tom,

    ein IN-Parameter ist ein Wert, der der Routine von außen übergeben wird und den sie zur Berechnung verwenden kann.

    OUT ist ein Parameter, der raus geht. Wenn du diesem in der Routine einen Wert zuweist, ist er nach dem Aufruf in der übergebenen Variable verfügbar.

    INOUT ist die Kombi. Ein Parameter der übergeben und verändert werden kann. Das ist vergleichbar mit Call-By-Reference in anderen Programmiersprachen.

    Viele Grüße und einen schönen Start in die Woche,
    Jonas

  3. ysql> DECLARE var_output VARCHAR(128);
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‚DECLARE var_output VARCHAR(128)‘ at line 1

Kommentieren

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.