Gespeicherte Prozeduren sind benutzerdefinierte SQL-Anweisungen, die in einer MySQL-Datenbank gespeichert und bei Bedarf ausgeführt werden, um eine bestimmte Datenbankoperation auszuführen. Diese vordefinierten Subroutinen helfen beim Verschieben der Geschäftslogik in die Datenbank, was einige Vorteile bietet:
- Roundtrips zum Datenbankserver durch eine Anwendung werden minimiert.
- Die Code-Wartbarkeit wurde verbessert, da verschiedene Anwendungen die gespeicherte Prozedur gemeinsam nutzen können.
- Die Datenbankleistung wird verbessert, da gespeicherte Prozeduren einmal kompiliert und sehr schnell und effizient ausgeführt werden.
In diesem Handbuch werden Sie:
-
Lernen Sie die Syntax zum Erstellen gespeicherter Prozeduren und deklarieren Sie Ihre erste Prozedur.
-
Führen Sie die Beispielprozedur aus, nachdem Sie sie deklariert haben.
-
Erfahren Sie, wie Sie eine Prozedur löschen, wenn Sie sie nicht mehr benötigen.
Bevor Sie beginnen
Stellen Sie sicher, dass Sie Folgendes haben:
-
Wenn Sie dies noch nicht getan haben, erstellen Sie ein Linode-Konto und eine Compute-Instanz. Sehen Sie sich unsere Leitfäden Erste Schritte mit Linode und Erstellen einer Compute-Instanz an.
-
Folgen Sie unserem Leitfaden zum Einrichten und Sichern einer Compute-Instanz, um Ihr System zu aktualisieren. Möglicherweise möchten Sie auch die Zeitzone festlegen, Ihren Hostnamen konfigurieren, ein eingeschränktes Benutzerkonto erstellen und den SSH-Zugriff sichern.
-
Ein MySQL-Server und -Client, der auf dem Linode-Server installiert ist. Installationsanleitungen für MySQL sind für verschiedene Distributionen in unserem MySQL-Bereich verfügbar.
Datenbank vorbereiten
Sie beginnen mit dem Erstellen einer Beispieldatenbank, einer Tabelle und eines Benutzers für den Zugriff auf die Datenbank. Sie werden die Tabelle auch zu Testzwecken mit Beispieldaten füllen.
Erstellen der Datenbank, der Tabelle und des Benutzers
-
Melden Sie sich beim MySQL-Server an:
mysql -u root -p
Sie werden aufgefordert, das Root-Passwort Ihrer MySQL-Datenbank einzugeben. Drücken Sie dann Enter um fortzufahren.
-
Als nächstes sehen Sie eine MySQL-Eingabeaufforderung ähnlich der unten gezeigten.
mysql >
-
Geben Sie den folgenden Befehl ein, um eine
test_db
zu erstellen Datenbank:CREATE DATABASE test_db;
Ausgabe:
Query OK, 1 row affected (0.01 sec)
-
Erstellen Sie einen Datenbankbenutzer und gewähren Sie vollen Zugriff auf
test_db
Datenbank. Ersetzen SiePASSWORD
mit einem komplexen und eindeutigen Wert, der den Richtlinien für MySQL-Passwörter entspricht:CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';
Ausgabe:
Query OK, 1 row affected (0.01 sec)
-
Gewähren Sie
test_user
volle Privilegien für dietest_db
Datenbank;GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'localhost';
Ausgabe:
Query OK, 1 row affected (0.01 sec)
-
Flush-Privilegien:
FLUSH PRIVILEGES;
Ausgabe:
Query OK, 0 rows affected (0.01 sec)
Befüllen Sie die Datenbank
-
Wechseln Sie als Nächstes zur Datenbank test_db:
USE test_db;
Ausgabe:
Database changed
-
Erstellen Sie ein
products
Tabelle zum Speichern von Beispieldatensätzen:CREATE TABLE products(product_id BIGINT PRIMARY KEY, product_name VARCHAR(50), category_name VARCHAR(50) ) ENGINE=INNODB;
Ausgabe:
Query OK, 0 rows affected (0.01 sec)
-
Sie können nun einige Produkte zur Produkttabelle hinzufügen, indem Sie die folgenden Befehle nacheinander ausführen:
INSERT INTO products (product_id, product_name, category_name) VALUES ('1', 'GAMING KEYBOARD', 'COMPUTER ACCESSORIES'); INSERT INTO products (product_id, product_name, category_name) VALUES ('2', 'OPTICAL MOUSE', 'COMPUTER ACCESSORIES'); INSERT INTO products (product_id, product_name, category_name) VALUES ('3', 'MOUSE PAD', 'COMPUTER ACCESSORIES'); INSERT INTO products (product_id, product_name, category_name) VALUES ('4', 'STEREO SYSTEM', 'ELECTRONICS'); INSERT INTO products (product_id, product_name, category_name) VALUES ('5', '32 INCH TV', 'ELECTRONICS'); INSERT INTO products (product_id, product_name, category_name) VALUES ('6', 'DVB-T2 RECEIVER', 'ELECTRONICS');
Sie sollten die folgende Ausgabe erhalten, nachdem Sie jedes
Insert
ausgeführt haben Aussage:Query OK, 1 row affected (0.00 sec)
-
Nächste. Bestätigen Sie, ob die Beispielprodukte erfolgreich in die Datenbank eingefügt wurden, indem Sie
Select
ausführen Befehl unten:SELECT * FROM products;
Ihre Beispielprodukte sollten wie unten gezeigt aufgelistet sein:
+------------+-----------------+----------------------+ | product_id | product_name | category_name | +------------+-----------------+----------------------+ | 1 | GAMING KEYBOARD | COMPUTER ACCESSORIES | | 2 | OPTICAL MOUSE | COMPUTER ACCESSORIES | | 3 | MOUSE PAD | COMPUTER ACCESSORIES | | 4 | STEREO SYSTEM | ELECTRONICS | | 5 | 32 INCH TV | ELECTRONICS | | 6 | DVB-T2 RECEIVER | ELECTRONICS | +------------+-----------------+----------------------+ 6 rows in set (0.00 sec)
-
Beenden Sie den MySQL-Server.
QUIT;
Ausgabe:
Bye!
-
Nachdem Sie eine
test_db
erstellt haben Datenbank,products
Tabelle, eintest_user
, und einige Beispielprodukte hinzugefügt haben, können Sie jetzt mit dem Erstellen der ersten gespeicherten Prozedur fortfahren.
Erstellen einer gespeicherten Prozedur
Syntax für gespeicherte Prozeduren
Die grundlegende Syntax zum Erstellen einer gespeicherten Prozedur in einer MySQL-Datenbank ist unten dargestellt:
DELIMITER &&
CREATE PROCEDURE PROCEDURE_NAME (PARAMETER_1, PARAMETER_2, PARAMETER_N...)
BEGIN
[SQL STATEMENT]
END &&
DELIMITER ;
-
Das
DELIMITER &&
Zeile am Anfang weist den MySQL-Server an, die folgenden SQL-Anweisungen als einzelne Anweisung zu behandeln, anstatt sie einzeln auszuführen. Noch ein&&
wird in einer späteren Zeile eingefügt, um das Ende dieser Anweisung zu markieren. -
PROCEDURE_NAME
Hier wird der Name Ihrer gespeicherten Prozedur deklariert. -
Auf den Prozedurnamen folgt eine Reihe von Klammern, die die Parameter Ihrer Prozedur einschließen. Gespeicherte Prozeduren unterstützen durch Kommas getrennte Parameter, und diese Funktion macht sie flexibler. Weitere Einzelheiten finden Sie im Parameterabschnitt.
-
Das
BEGIN...END
Befehle schließen die SQL-Anweisung ein, die von der gespeicherten Prozedur ausgeführt werden soll. -
Am Ende steht die Anweisung
DELIMITER ;
wird erneut ausgegeben, um das Trennzeichen wieder auf den Standardwert von;
zu ändern
Parameter gespeicherter Prozeduren
Jeder Parameter für eine Prozedur hat einen Typ, einen Namen und einen Datentyp, getrennt durch Leerzeichen:
PARAMETER_TYPE PARAMETER_NAME DATA_TYPE
Zum Beispiel, um einen Parameter vom Typ IN
zu erstellen , benannt category
, mit dem VARCHAR
Datentyp, der eine Länge von 50 hat Zeichen verwenden Sie diese Syntax:
IN category VARCHAR(50)
MySQL unterstützt drei Arten von Parametern:
-
IN
:Der Wert des Parameters muss vom aufrufenden Client angegeben werden. Dieser Wert kann von der gespeicherten Prozedur nicht geändert werden .Zum Beispiel, wenn Sie eine MySQL-Sitzungsvariable als
IN
übergeben Parameter zu einer Prozedur, und die Prozedur ändert diesen Wert in ihren Anweisungen, bleibt Ihre Sitzungsvariable unverändert, nachdem die Prozedur beendet wird. -
OUT
:Dieser Parametertyp wird auch vom aufrufenden Programm angegeben, aber sein Wert kann von der gespeicherten Prozedur geändert und vom aufrufenden Programm abgerufen werden.Beachten Sie, dass die gespeicherte Prozedur nicht auf den Anfangswert einer Variablen zugreifen kann, die als
OUT
übergeben wird Parameter. -
INOUT
:Ein Parameter dieses Typs kombiniert die Verhaltensweisen vonIN
undOUT
Parameter:-
Die gespeicherte Prozedur kann den Anfangswert des Parameters lesen.
-
Der Parameter kann während der Ausführung der gespeicherten Prozedur geändert werden.
-
Der geänderte Wert kann an das aufrufende Programm zurückgegeben werden, wenn das aufrufende Programm eine Variable als Parameter übergeben hat.
-
Eine gespeicherte Beispielprozedur
Nachdem Sie die grundlegende Syntax verstanden haben, erstellen wir eine einfache gespeicherte Prozedur, um Produkte nach Kategorienamen zu filtern. Der Kategoriename wird als IN
angegeben Parameter.
-
Melden Sie sich mit dem
test_user
beim MySQL-Server an Anmeldeinformationen von , die Sie beim Vorbereiten der Datenbank erstellt haben:mysql -u test_user -p
-
Geben Sie das Passwort des
test_user
ein und drücken Sie Enter um fortzufahren. -
Sie erhalten einen
mysql >
prompt. Fahren Sie fort, indem Sietest_db
auswählen :USE test_db;
Ausgabe:
Database changed.
-
Geben Sie dann die folgenden SQL-Befehle ein, um einen
filter_by_category
zu erstellen gespeicherte Prozedur:DELIMITER && CREATE PROCEDURE filter_by_category (IN category VARCHAR(50)) BEGIN SELECT * FROM products WHERE category_name=category; END &&
Ausgabe:
Query OK, 0 rows affected (0.00 sec)
-
Ändern Sie das
DELIMITER
zurück zu;
DELIMITER ;
-
Wenn der Code zum Erstellen der gespeicherten Prozedur erfolgreich ausgeführt wurde, können Sie jetzt mit der Ausführung der gespeicherten Prozedur fortfahren.
Ausführen einer gespeicherten Prozedur
In diesem Schritt rufen wir die gespeicherte Prozedur auf, die wir oben erstellt haben. Wir werden dieser grundlegenden Syntax folgen:
CALL PROCEDURE_NAME (COMMA-SEPARATED PARAMETER VALUES);
-
Um den
filter_by_category
auszuführen gespeicherte Prozedur, die wir oben erstellt haben, geben Sie den folgenden Befehl ein:CALL filter_by_category('COMPUTER ACCESSORIES');
Die Stored Procedure sollte nun alle Produkte im
COMPUTER ACCESSORIES
ausgeben Kategorie, da wirCOMPUTER ACCESSORIES
angegeben haben als Parameter:+------------+-----------------+----------------------+ | product_id | product_name | category_name | +------------+-----------------+----------------------+ | 1 | GAMING KEYBOARD | COMPUTER ACCESSORIES | | 2 | OPTICAL MOUSE | COMPUTER ACCESSORIES | | 3 | MOUSE PAD | COMPUTER ACCESSORIES | +------------+-----------------+----------------------+ 3 rows in set (0.00 sec) Query OK, 0 rows affected (0.01 sec)
-
Ebenso können Sie eine Liste aller Produkte aus der
ELECTRONICS
abrufen Kategorie, indem Sie den folgenden Befehl ausführen.CALL filter_by_category('ELECTRONICS') ;
Ausgabe:
+------------+-----------------+---------------+ | product_id | product_name | category_name | +------------+-----------------+---------------+ | 4 | STEREO SYSTEM | ELECTRONICS | | 5 | 32 INCH TV | ELECTRONICS | | 6 | DVB-T2 RECEIVER | ELECTRONICS | +------------+-----------------+---------------+ 3 rows in set (0.00 sec) Query OK, 0 rows affected (0.01 sec)
Unsere gespeicherte Prozedur funktionierte wie erwartet. Als Nächstes lernen wir, wie die gespeicherten Prozeduren gelöscht werden, wenn wir nicht mehr möchten, dass sie erneut ausgeführt werden.
Löschen gespeicherter Prozeduren
Sie können eine gespeicherte MySQL-Prozedur löschen, wenn Sie sie nicht mehr verwenden oder von Grund auf neu erstellen möchten. Die grundlegende Syntax zum Löschen der gespeicherten Prozedur ist unten dargestellt:
DROP PROCEDURE IF EXISTS PROCEDURE_NAME;
Zum Beispiel, um unseren filter_by_category
zu löschen gespeicherten Prozedur führen Sie den folgenden MySQL-Befehl aus:
DROP PROCEDURE IF EXISTS filter_by_category;
Wenn die gespeicherte Prozedur vorhanden ist, erhalten Sie die unten gezeigte Ausgabe:
Query OK, 0 rows affected (0.00 sec)
Das ist alles, wenn es darum geht, gespeicherte MySQL-Prozeduren zu erstellen, zu verwenden und zu löschen.
Weitere Informationen
Weitere Informationen zu diesem Thema finden Sie in den folgenden Ressourcen. Obwohl diese in der Hoffnung bereitgestellt werden, dass sie nützlich sind, beachten Sie bitte, dass wir nicht für die Genauigkeit oder Aktualität extern gehosteter Materialien garantieren können.
- Arbeiten mit gespeicherten MySQL-Prozeduren