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