Advanced MySQL - Zwischenspeicherung - Routinen
1. Ein Wunder, ein Wunder
Und nein, ich werde euch jetzt nicht auf den Fuß treten. Denn hier geht es in der Tat um etwas Erstaunliches. Man kann in MySQL
echte Funktionen (FUNCTION
) programmieren. Oder Prozeduren (PROCEDURE
). Der grundsätzliche Unterschied ist
der, dass Funktionen einen Wert zurückgeben, Prozeduren dagegen (normalerweise) nicht. Darum führt man sie unter dem Begriff Routinen.
Wichtig ist noch, dass beide dauerhaft(!) auf dem Server gespeichert werden.
Sinn und Zweck
- Die Kommunikation zwischen Client und Server wird auf ein Minimum beschränkt. Dadurch können SQL-Statements schneller verarbeitet werden.
- Gespeicherte Routinen sichern die Datenintegrität.
- Es können beliebig viele Anweisungen in einer Routine zusammengefasst werden.
- Die Routinen können Bedingungen zur Ablaufsteuerung enthalten.
-
Clients benötigen keine Rechte für
INSERT
-,DELETE
- oderUPDATE
-Anweisungen. Dadurch wird die Gefahr von SQL-Injections radikal verringert.
2. Der grundsätzliche Aufbau
Stored Functions
CREATE FUNCTION blubb()
RETURNS ...
BEGIN
...
END;
Stored Procedures
CREATE PROCEDURE blubber()
BEGIN
...
END;
Unterschiede
Stored Functions geben immer nur einen einzigen Wert zurück. Stored Procedures dagegen gar nichts, einen oder mehrere Werte. Außerdem können sie auch mehrere Datensätze zurückliefern. Allerdings davon immer nur ein Feld.
Anwendung
Stored Functions werden gewöhnlich genommen, um zum Beispiel eindeutige IDs zu bekommen. Stored Procedures dagegen setzt man sehr gerne ein, um Werte in eine Datenbank zu schreiben. Das ist aber nur eine sehr grobe Unterscheidung.
3. Der Aufruf
Stored Function
SELECT * FROM blubb();
Stored Procedure
CALL blubber();
Manchmal können auch Prozeduren etwas zurückgeben. In so einem Fall muss man CALL
mit SELECT
kombinieren.
CALL blubber();
SELECT * FROM blubber();
4. Der Delimiter
Damit begrenzt man eine Routine. Oder genauer gesagt, man beendet sie damit. Die Standardvorgabe ist normalerweise das Semikolon. Jetzt kann es aber passieren, dass das innerhalb einer Anweisung gesetzt werden muss. Und dann weiß MySQL nicht, wann die Routine zu Ende ist. In so einem Fall muss man definitiv den Delimiter ändern.
DELIMITER $
CREATE PROCEDURE blubb()
BEGIN
...
END$
DELIMITER ;
Ach ja, nach der Routine sollte man tunlichst den Standard mit DELIMITER ;
wiederherstellen.
Ein Hinweis
Bei der Wahl des Delimiters sollte man auf wenige Zeichen zurückgreifen, um später keine Konflikte mit Abfragen auszulösen.
Besonders beliebt sind das Dollarzeichen (auch gedoppelt als $$
) und der doppelte Schrägstrich (//
).
Auch die so genannte Pipe sieht man das eine oder andere Mal (|
). Der Lattenzaun #
dagegen ist ein
echtes no-go, da das Zeichen für Kommentare verwendet wird.
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt