MySQL bietet uns die Möglichkeit, gespeicherte Prozeduren zu erstellen . Gespeicherte Prozeduren sind ein leistungsstarker Teil von MySQL (und anderen Datenbankverwaltungssystemen wie SQL Server) und ermöglichen Ihnen mehr als Ansichten.
Eine gespeicherte Prozedur ist eine Sammlung von SQL-Anweisungen, die in der Datenbank gespeichert sind. Eine gespeicherte Prozedur kann Geschäftslogik enthalten, was einer der Hauptaspekte ist, die gespeicherte Prozeduren von Ansichten unterscheiden. Eine gespeicherte Prozedur kann Parameter akzeptieren, und Sie können Variablen setzen, IF
schreiben Anweisungen usw. innerhalb einer gespeicherten Prozedur.
Wie funktionieren gespeicherte Prozeduren?
Zunächst erstellen Sie die gespeicherte Prozedur. Sobald es erstellt wurde, können Sie es ausführen (oder genauer gesagt, Sie "rufen" es auf).
Um eine gespeicherte Prozedur auszuführen, "rufen" Sie sie auf. Wenn Sie es aufrufen, geben Sie auch alle Parameter an, die es möglicherweise benötigt. Die gespeicherte Prozedur wird dann ausgeführt und verwendet Ihre Parameter so, wie es der Code vorgibt.
Beispielsweise könnten Sie eine gespeicherte Prozedur schreiben, die eine FruitId
akzeptiert Parameter. Die gespeicherte Prozedur könnte dann diesen Parameter nehmen und ihn verwenden, um den Bestand auf diese bestimmte Frucht zu überprüfen. Daher könnten Sie die gespeicherte Prozedur jedes Mal mit einer anderen Frucht-ID aufrufen und sie würde einen Wert zurückgeben, der Ihnen zeigt, wie viel von dieser Frucht auf Lager ist.
Erstellen Sie eine gespeicherte Prozedur
Gespeicherte Prozeduren werden mit CREATE PROCEDURE
erstellt Aussage.
Syntax
Hier ist die Syntax zum Erstellen einer gespeicherten Prozedur:
CREATE PROCEDURE sp_name(p_1 INT) BEGIN ...code goes here... END;
Ersetzen Sie sp_name mit dem Namen, den Sie für die gespeicherte Prozedur verwenden möchten. Die Klammern sind erforderlich – sie schließen alle Parameter ein. Wenn keine Parameter erforderlich sind, können die Klammern leer sein.
Der Hauptteil der gespeicherten Prozedur kommt zwischen BEGIN
und END
Schlüsselwörter. Diese Schlüsselwörter werden zum Schreiben zusammengesetzter Anweisungen verwendet. Eine zusammengesetzte Anweisung kann mehrere Anweisungen enthalten, die bei Bedarf verschachtelt werden können. Daher können Sie BEGIN
verschachteln und END
Blöcke.
In den meisten Fällen müssen Sie auch CREATE PROCEDURE
einschließen Anweisung mit DELIMITER
Befehle und ändern Sie END;
bis END //
. So:
DELIMITER // CREATE PROCEDURE sp_name(p_1 INT) BEGIN ...code goes here... END // DELIMITER ;
Ich werde bald erklären, warum, aber jetzt schauen wir uns ein Beispiel an.
Beispiel
Hier ist ein einfaches Beispiel für das Erstellen einer gespeicherten Prozedur. Ausführen des folgenden Codes für unseren FruitShop Die Datenbank erstellt eine gespeicherte Prozedur namens spCheckFruitStock :
DELIMITER // CREATE PROCEDURE spCheckFruitStock(thisFruit SMALLINT) BEGIN SELECT Fruit.FruitName, Fruit.Inventory, Units.UnitName FROM Fruit INNER JOIN Units ON Fruit.UnitId = Units.UnitId WHERE Fruit.FruitId = thisFruit; END // DELIMITER ;
Jetzt können wir diese gespeicherte Prozedur wie folgt aufrufen:
CALL spCheckFruitStock(1);
Hier übergeben wir einen Parameter von 1
das ist die ID für
Apple
.
Hier ist das Ergebnis:
Wir können dasselbe für jede Frucht in unserer Datenbank tun, indem wir einfach den an die gespeicherte Prozedur übergebenen Parameter ändern.
Über das DELIMITER
Befehl
Im obigen Beispiel haben wir ein paar DELIMITER
hinzugefügt Befehle und wir haben ein Semikolon durch zwei Schrägstriche ersetzt. Was ist hier los?
Wir haben dies getan, um MySQL anzuweisen, ein anderes Trennzeichen zu verwenden, während es unsere gespeicherte Prozedur erstellt.
Der Grund dafür ist, dass MySQL das Semikolon bereits als Trennzeichen für das Ende jeder SQL-Anweisung erkennt. Sobald MySQL also das erste Semikolon sieht, interpretiert es das Trennzeichen als solches und unsere gespeicherte Prozedur würde brechen.
Das DELIMITER
Der Befehl ermöglicht es uns, MySQL anzuweisen, ein anderes Trennzeichen zu verwenden. Im obigen Beispiel setzen wir dies auf zwei Schrägstriche (//
), aber das hätte alles sein können (vermeiden Sie jedoch die Verwendung eines umgekehrten Schrägstrichs (\
), da dies das Escape-Zeichen für MySQL ist). Durch die Änderung des Trennzeichens versucht MySQL nicht, unsere Semikolons als Ende der Anweisung zu interpretieren – es wartet, bis es die beiden Schrägstriche sieht.
Nachdem wir die gespeicherte Prozedur erstellt haben, können wir DELIMITER ;
verwenden um das Trennzeichen wieder auf das Semikolon zurückzusetzen.
Löschen einer gespeicherten Prozedur
Sie können eine gespeicherte Prozedur löschen, indem Sie DROP PROCEDURE
verwenden Erklärung. So:
DROP PROCEDURE spCheckFruitStock;
Ändern einer gespeicherten Prozedur
Sie können einige ändern Aspekte einer gespeicherten Prozedur mithilfe von ALTER PROCEDURE
Erklärung.
Um jedoch den Hauptteil der gespeicherten Prozedur oder einen ihrer Parameter zu ändern, müssen Sie die Prozedur löschen und erneut erstellen. So:
DROP PROCEDURE IF EXISTS spCheckFruitStock; DELIMITER // CREATE PROCEDURE spCheckFruitStock(thisFruit SMALLINT) BEGIN SELECT Fruit.FruitId, Fruit.FruitName, Fruit.Inventory, Units.UnitName FROM Fruit INNER JOIN Units ON Fruit.UnitId = Units.UnitId WHERE Fruit.FruitId = thisFruit; END // DELIMITER ;
Hier haben wir Fruit.FruitId
hinzugefügt zur Liste der zurückzugebenden Spalten.
Ergebnis:
Eine fortgeschrittenere gespeicherte Prozedur
Das obige Beispiel war einfach, um die Syntax zum Erstellen und Aufrufen gespeicherter Prozeduren zu demonstrieren. Sehen wir uns eine etwas komplexere gespeicherte Prozedur an:
DROP PROCEDURE IF EXISTS spCheckFruitStockLevel; DELIMITER // CREATE PROCEDURE spCheckFruitStockLevel( IN pFruitId SMALLINT(5), OUT pStockLevel VARCHAR(6)) BEGIN DECLARE stockNumber SMALLINT; SELECT Fruit.Inventory into stockNumber FROM Fruit INNER JOIN Units ON Fruit.UnitId = Units.UnitId WHERE Fruit.FruitId = pFruitId; IF stockNumber > 10 THEN SET pStockLevel = 'High'; ELSEIF (stockNumber <= 10 AND stockNumber >= 5) THEN SET pStockLevel = 'Medium'; ELSEIF (stockNumber < 5) THEN SET pStockLevel = 'Low - Please Replace Now!'; END IF; END // DELIMITER ;
Das obige Beispiel akzeptiert zwei verschiedene Parametermodi (IN
und OUT
). IN
ist die Vorgabe, deshalb war der Modus im vorherigen Beispiel nicht enthalten.
Auch hier setzen wir eine Variable. Wir verwenden DECLARE stockNumber SMALLINT
um eine Variable namens stockNumber
zu deklarieren mit einem Typ von SMALLINT
(kleine ganze Zahl).
Wir verwenden ein SELECT
Anweisung, den Lagerbestand für die angegebene Frucht-ID zu suchen und diese unserer stockNumber
zuzuordnen Variable.
Schließlich verwenden wir ein SQL IF
-Anweisung, um den Lagerbestand zu ermitteln, indem Sie diesen Wert in pStockLevel
einfügen Parameter (der natürlich der OUT
ist Parameter — das ist der Wert, den wir sehen werden, wenn wir die gespeicherte Prozedur aufrufen).
Aufruf einer gespeicherten Prozedur mit einem OUT
oder INOUT
Parameter
In unserem letzten Beispiel haben wir zwei Parameter angegeben, einen IN
-Parameter und ein OUT
Parameter.
Wenn wir diese gespeicherte Prozedur aufrufen, müssen wir noch den OUT
einschließen Parameter. Da wir jedoch ihren Wert nicht kennen (schließlich nennen wir sie deshalb — um ihren Wert herauszufinden!), müssen wir eine Variable verwenden. Dann können wir ein SELECT
verwenden -Anweisung, um seinen Wert herauszufinden.
So:
CALL spCheckFruitStockLevel(1, @stockLevel); select @stockLevel;
Ergebnis:
Parametermodi
Wir haben gerade zwei Parametermodi verwendet (IN
und OUT
). In MySQL gibt es drei Parametermodi, die mit gespeicherten Prozeduren verwendet werden können.
- EIN
- Wenn Sie diesen Parametermodus verwenden, müssen Sie (oder Ihre Anwendung) den Wert des Parameters übergeben, wenn Sie die gespeicherte Prozedur aufrufen. Diese Parameter sind geschützt. Daher wird sein ursprünglicher Wert beibehalten, nachdem die gespeicherte Prozedur ausgeführt wurde. Wenn die gespeicherte Prozedur den Wert ändert, tut sie dies nur für eine Kopie des Parameters.
Dieser Modus ist der Standardmodus. Wenn Sie den Parametermodus nicht angeben, ist er
IN
. - AUS
- Der Wert eines
OUT
Der Parameter kann sich innerhalb der gespeicherten Prozedur ändern, und sein Wert wird an die aufrufende Anwendung zurückgegeben. - INOUT
- Dieser Modus ist eine Kombination aus
IN
undOUT
Modi. Sie können den Anfangswert übergeben, die gespeicherte Prozedur kann ihn ändern und den neuen Wert an die aufrufende Anwendung zurückgeben.