Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Gespeicherte MySQL-Prozeduren

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 und OUT Modi. Sie können den Anfangswert übergeben, die gespeicherte Prozedur kann ihn ändern und den neuen Wert an die aufrufende Anwendung zurückgeben.