Hauptmenü

Untermenü

Advanced SQL - Einstiegstutorial 3 - Stored Procedure

1. Die Abschnitte

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 stufeINTO 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