Advanced SQL - Einstiegstutorial 3 - Stored Procedure
1. Die Abschnitte
- Vorwort
- Stored Procedure
- View
- Subselect Teil 1
- Subselect Teil 2
- Subselect Teil 3
2. Die Berechnung
... für das Gildenkonto ist zugegebenermaßen ein Mäusefurz. Aber da wir das in den kommen Praxistutorials mit Sicherheit an zig Stellen benötigen, kapseln wir das in einer Routine und überlassen der dann die Arbeit. Zunächst mal kommen die üblichen Vorarbeiten.
DROP PROCEDURE IF EXISTS gildenkonto;
DELIMITER $$
Erläuterung
Wenn ich eine gespeicherte Routine oder Funktion entwickle, so baue ich die DROP-Anweisung immer mit ein. Denn bei Fehlern wird sie einfach
geplättet und muss nicht händisch gelöscht werden. Den DELIMITER benötigen wir, weil wir in der Routine später mit dem Semikolon arbeiten müssen.
3. Die Routine
... selber hat folgenden Grundaufbau.
CREATE PROCEDURE gildenkonto (IN gid INT)
BEGIN
...
END $$
DELIMITER ;
Erläuterung
Als Parameter übergeben wir die ID einer Gilde. Diesen Wert benötigen wir später für das Updaten der Tabelle gilde. Das IN besagt,
dass die Variable gid in der Routine benutzt wird und mit INT legen wir den Typ fest. Ach ja, das IN könnte man hier
auch weglassen, aber das wisst ihr ja sicherlich.
Mit BEGIN starten wir dann die eigentlichen Anweisungen und mit END schließen wir sie ab. Zu guter Letzt setzen wir den
DELIMITER auf den Ursprungswert (Semikolon) zurück.
4. Die Funktionialität
Zunächst mal benötigen wir eine Variable, in der wir das Ergebnis einer Anfrage abspeichern. Und da wir gottlob mit glatten Werten arbeiten, nehmen wir für den
Typ ein INT.
BEGIN
DECLARE summe INT;
...
END $$
Die Abfrage
DECLARE summe INT;
SELECT
SUM(gold * stufe) INTO summe
FROM
charakter c
LEFT JOIN
mitglied m ON c.id = m.charakter
WHERE
m.gilde = gid;
Erläuterung
Diese Abfrage ist ganz leicht zu erklären. Wir holen uns die Summe von gold * stufe eines jeden Charakters, dessen Mitglied zur Gilde
gid gehört. Und die ID der Gilde übergeben wir später, wenn wir die Routine aufrufen. Das Ergebnis selber schreiben wir mit
SELECT ... INTO in die Variable summe.
Ein Tipp
Bevor man so eine Abfrage einbaut, sollte man sie vorher separat testen. Also zum Beispiel mit einem konkreten Wert für die Gilden-ID. Erst wenn alles korrekt ist, baut man sie in die Routine ein.
SELECT
SUM(gold * stufe) AS summe
FROM
charakter c
LEFT JOIN
mitglied m ON c.id = m.charakter
WHERE
m.gilde = 1;
Das Update
... kommt dann direkt nach der SELECT-Anweisung. Dabei bekommt die Spalte einnahmen den Wert der Variable summe, wo die
Spalte id mit dem Parameter der Routine übereinstimmt.
UPDATE gilde SET einnahmen = summe WHERE id = gid;
5. Die praktische Nutzung
Wer sich die Theorie genau durchgelesen hat, weiß was jetzt kommt. Zunächst ändert man einen maßgeblichen Wert von
Charakter X und ruft im Anschluss die Routine gildenkonto auf. Als Parameter übergibt man die ID der Gilde.
UPDATE charakter SET gold = gold + 1000 WHERE id = 2;
CALL gildenkonto(1);
Ein Tipp
Spielt mal ein wenig damit herum. Ändert den Wert der Spalte gold und/oder stufe und ruft danach gilddenkonto auf. Achtet
aber immer darauf, dass ihr den richtigen Wert der Gilden-ID übergebt.
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt