Was ist eine gespeicherte Prozedur? Einfach ausgedrückt handelt es sich um eine Reihe leistungsstarker SQL-Anweisungen, die einige relativ komplexe logische Funktionen implementieren können, ähnlich den Methoden in der JAVA-Sprache. PS: Gespeicherte Prozeduren sind Triggern etwas ähnlich, beide sind eine Reihe von SQL-Sets, aber gespeicherte Prozeduren werden aktiv aufgerufen und sind leistungsfähiger als Trigger. Trigger werden automatisch aufgerufen, nachdem etwas ausgelöst wurde; Was sind die Eigenschaften Es gibt Eingabe- und Ausgabeparameter, Variablen können deklariert werden und es gibt Steueranweisungen wie if/else, case, while usw. Durch das Schreiben gespeicherter Prozeduren können komplexe logische Funktionen implementiert werden. Gemeinsame Merkmale von Funktionen: Modularität, Kapselung und Code-Wiederverwendung; Schnelle Geschwindigkeit, nur die erste Ausführung muss die Kompilierungs- und Optimierungsschritte durchlaufen und nachfolgende Aufrufe können direkt ausgeführt werden, wodurch die oben genannten Schritte entfallen. Erstellen einer gespeicherten MySQL-Prozedur Grammatik CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [merkmal ...] routine_body CREATE PROCEDURE Prozedurname([[IN|OUT|INOUT] Parametername Datentyp[,[IN|OUT|INOUT] Parametername Datentyp…]]) [Eigenschaften…] Prozedurkörper TRENNUNGSZEICHEN // PROZEDUR ERSTELLEN myproc(OUT s int) BEGINNEN Wählen Sie COUNT(*) INTO s FROM Studenten; ENDE // TRENNUNGSZEICHEN ; Trennzeichen MySQL verwendet standardmäßig ";" als Trennzeichen. Wenn kein Trennzeichen deklariert ist, behandelt der Compiler die gespeicherte Prozedur als SQL-Anweisung, sodass der Kompilierungsprozess einen Fehler meldet. Daher müssen Sie "DELIMITER //" verwenden, um das Trennzeichen für das aktuelle Segment im Voraus zu deklarieren, damit der Compiler den Inhalt zwischen den beiden "//" als Code der gespeicherten Prozedur behandelt und diesen Code nicht ausführt; "DELIMITER ;" bedeutet, das Trennzeichen wiederherzustellen. Parameter Eine gespeicherte Prozedur kann nach Bedarf Eingabe-, Ausgabe- und Eingabe-/Ausgabeparameter haben. Wenn mehrere Parameter vorhanden sind, trennen Sie diese durch ",". MySQL-Stored-Procedure-Parameter werden bei der Definition von Stored Procedures verwendet. Es gibt drei Typen von Parametern: IN, OUT und INOUT:
Unter diesen ist der Parameter sp_name der Name der gespeicherten Prozedur; proc_parameter stellt die Parameterliste der gespeicherten Prozedur dar; der Parameter characteristics gibt die Merkmale der gespeicherten Prozedur an; der Parameter routine_body ist der Inhalt des SQL-Codes und BEGIN…END kann verwendet werden, um den Anfang und das Ende des SQL-Codes zu markieren. Jeder Parameter in proc_parameter besteht aus 3 Teilen. Diese drei Teile sind Eingabe- und Ausgabetypen, Parameternamen und Parametertypen. Seine Form ist wie folgt: [ IN | OUT | INOUT ] Parametername Typ Dabei steht IN für Eingabeparameter; OUT für Ausgabeparameter; INOUT bedeutet, dass es sowohl Eingabe als auch Ausgabe sein kann; der Parameter param_name ist der Parametername der gespeicherten Prozedur; der Parameter type gibt den Parametertyp der gespeicherten Prozedur an, der jeder beliebige Datentyp der MySQL-Datenbank sein kann. Der charakteristische Parameter hat mehrere Werte. Die Werte lauten wie folgt: SPRACHE SQL: Gibt an, dass der Teil routine_body aus Anweisungen in der SQL-Sprache besteht, die auch die Standardsprache des Datenbanksystems ist. [NICHT] DETERMINISTISCH: Gibt an, ob das Ausführungsergebnis der gespeicherten Prozedur deterministisch ist. DETERMINISTISCH bedeutet, dass das Ergebnis sicher ist. Jedes Mal, wenn Sie eine gespeicherte Prozedur ausführen, führt dieselbe Eingabe zur selben Ausgabe. NICHT DETERMINISTISCH bedeutet, dass das Ergebnis nicht deterministisch ist und dieselben Eingaben unterschiedliche Ausgaben erzeugen können. Standardmäßig sind die Ergebnisse nicht deterministisch. { ENTHÄLT SQL | KEIN SQL | LIEST SQL-DATEN | ÄNDERT SQL-DATEN }: Gibt Einschränkungen für die Verwendung von SQL-Anweisungen durch die Subroutine an. CONTAINS SQL bedeutet, dass das Unterprogramm SQL-Anweisungen enthält, jedoch keine Anweisungen zum Lesen oder Schreiben von Daten; NO SQL bedeutet, dass das Unterprogramm keine SQL-Anweisungen enthält; READS SQL DATA bedeutet, dass das Unterprogramm Anweisungen zum Lesen von Daten enthält; MODIFIES SQL DATA bedeutet, dass das Unterprogramm Anweisungen zum Schreiben von Daten enthält. Standardmäßig ist CONTAINS SQL angegeben. SQL-SICHERHEIT { DEFINER | INVOKER }: Gibt an, wer die Ausführungsberechtigung hat. DEFINER bedeutet, dass nur der Definierer es ausführen kann; INVOKER bedeutet, dass der Anrufer es ausführen kann. Standardmäßig lautet das vom System zugewiesene Privileg DEFINER. COMMENT 'Zeichenfolge': Kommentarinformationen. Tipp: Beim Erstellen einer gespeicherten Prozedur gibt das System standardmäßig CONTAINS SQL an und weist damit darauf hin, dass in der gespeicherten Prozedur SQL-Anweisungen verwendet werden. Wenn in der gespeicherten Prozedur jedoch keine SQL-Anweisungen verwendet werden, ist es am besten, sie auf NO SQL zu setzen. Darüber hinaus empfiehlt es sich, im Abschnitt COMMENT einfache Kommentare zur gespeicherten Prozedur hinzuzufügen, um das spätere Lesen des Codes der gespeicherten Prozedur zu erleichtern. [Beispiel 1] Im Folgenden wird eine gespeicherte Prozedur mit dem Namen num_from_employee erstellt. Der Code lautet wie folgt: PROZEDUR ERSTELLEN: Anzahl_von_Mitarbeitern (IN emp_id INT, OUT count_num INT) Liest SQL-Daten BEGINNEN SELECT COUNT(*) INTO Anzahl VON Mitarbeiter WO d_id=emp_id; ENDE Im obigen Code ist der Name der gespeicherten Prozedur „num_from_employee“, die Eingabevariable ist „emp_id“ und die Ausgabevariable ist „count_num“. Die SELECT-Anweisung fragt die Mitarbeitertabelle nach Datensätzen ab, deren d_id-Wert gleich emp_id ist, berechnet mit COUNT(*) die Anzahl der Datensätze mit demselben d_id-Wert und speichert das Berechnungsergebnis schließlich in count_num. Die Ausführungsergebnisse des Codes sind wie folgt: mysql> TRENNUNGSZEICHEN && mysql> CREATE PROCEDURE Anzahl_von_Mitarbeitern (IN emp_id INT, OUT Anzahl INT) -> LIEST SQL-DATEN -> BEGIN -> SELECT COUNT(*) INTO Anzahl -> VON Mitarbeiter -> WO d_id=emp_id; -> ENDE && Abfrage OK, 0 Zeilen betroffen (0,09 Sek.) mysql> TRENNUNGSZEICHEN ; Wenn nach der Ausführung des Codes keine Fehlermeldung gemeldet wird, bedeutet dies, dass die Speicherfunktion erfolgreich erstellt wurde. Sie können diese gespeicherte Prozedur in Zukunft aufrufen und die SQL-Anweisungen in der gespeicherten Prozedur werden in der Datenbank ausgeführt. Hinweis: Das Standard-Anweisungsabschlusszeichen in MySQL ist ein Semikolon (;). SQL-Anweisungen in gespeicherten Prozeduren müssen durch ein Semikolon beendet werden. Um Konflikte zu vermeiden, setzen Sie zunächst den MySQL-Terminator mit „DELIMITER &&“ auf &&. Verwenden Sie abschließend „DELIMITER ;“, um das Endzeichen wieder auf ein Semikolon zu setzen. Dies ist dasselbe wie beim Erstellen eines Triggers. Funktion In MySQL sieht die Erstellung einer gespeicherten Funktion grundsätzlich wie folgt aus: CREATE FUNCTION sp_name ([func_parameter[,...]]) GIBT Typ [Merkmal ...] Routinenkörper zurück func_parameter kann aus mehreren Parametern bestehen, die jeweils aus einem Parameternamen und einem Parametertyp in der folgenden Form bestehen: param_name Typ Der Parameter param_name ist der Parametername der gespeicherten Funktion; der Parameter type gibt den Parametertyp der gespeicherten Funktion an, der jeder beliebige Datentyp der MySQL-Datenbank sein kann. [Beispiel 2] Das Folgende erstellt eine gespeicherte Funktion mit dem Namen name_from_employee. Der Code lautet wie folgt: CREATE FUNCTION Name_vom_Mitarbeiter (emp_id INT) Gibt VARCHAR(20) zurück. BEGINNEN RETURN (Name auswählen VON Mitarbeiter WO num=emp_id ); ENDE Im obigen Code ist der Name der gespeicherten Funktion name_from_employee, der Parameter der Funktion ist emp_id und der Rückgabewert ist vom Typ VARCHAR. Die SELECT-Anweisung fragt die Mitarbeitertabelle nach dem Datensatz ab, dessen Num-Wert gleich emp_id ist, und gibt den Wert des Namensfelds des Datensatzes zurück. Die Ausführungsergebnisse des Codes sind wie folgt: mysql> TRENNUNGSZEICHEN && mysql> CREATE FUNCTION Name_vom_Mitarbeiter (emp_id INT ) -> GIBT VARCHAR(20) ZURÜCK -> BEGIN -> ZURÜCK (Name auswählen -> VON Mitarbeiter -> WO num=emp_id ); -> ENDE&& Abfrage OK, 0 Zeilen betroffen (0,00 Sek.) mysql> TRENNUNGSZEICHEN ; Das Ergebnis zeigt, dass die gespeicherte Funktion erfolgreich erstellt wurde. Die Verwendung dieser Funktion ist dieselbe wie die der internen MySQL-Funktionen. Verwenden von Variablen In gespeicherten Prozeduren und Funktionen können Sie Variablen definieren und verwenden. Benutzer können das Schlüsselwort DECLARE verwenden, um Variablen zu definieren. Anschließend können Sie den Variablen Werte zuweisen. Der Gültigkeitsbereich dieser Variablen ist der Programmabschnitt BEGIN...END. In diesem Abschnitt wird erläutert, wie Variablen definiert und ihnen Werte zugewiesen werden. 1. Definieren von Variablen In MySQL können Sie das Schlüsselwort DECLARE verwenden, um Variablen zu definieren. Die grundlegende Syntax zum Definieren einer Variablen lautet wie folgt:
Unter ihnen wird das Schlüsselwort DECLARE zum Deklarieren von Variablen verwendet; der Parameter var_name ist der Name der Variablen, und hier können mehrere Variablen gleichzeitig definiert werden; der Parameter type wird zum Angeben des Typs der Variablen verwendet; die DEFAULT-Wertklausel legt den Standardwert der Variablen auf value fest. Wenn die DEFAULT-Klausel nicht verwendet wird, ist der Standardwert NULL. [Beispiel 3] Das Folgende definiert die Variable my_sql mit dem Datentyp INT und einem Standardwert von 10. Der Code lautet wie folgt:
2. Zuweisen von Werten zu Variablen In MySQL können Sie das Schlüsselwort SET verwenden, um Variablen Werte zuzuweisen. Die grundlegende Syntax der SET-Anweisung lautet wie folgt:
Unter diesen wird das Schlüsselwort SET verwendet, um Variablen Werte zuzuweisen, der Parameter var_name ist der Name der Variablen und der Parameter expr ist der Zuweisungsausdruck. Eine SET-Anweisung kann mehreren Variablen gleichzeitig Werte zuweisen, und die Zuweisungsanweisungen für jede Variable werden durch Kommas getrennt. [Beispiel 4] Im Folgenden wird der Variable my_sql der Wert 30 zugewiesen. Der Code lautet wie folgt:
In MySQL können Sie Variablen auch mit der Anweisung SELECT...INTO Werte zuweisen. Die grundlegende Syntax lautet wie folgt: SELECT col_name[,…] INTO var_name[,…] FROM table_name WEHRE Bedingung [Beispiel 5] Die folgende Abfrage wird für den Datensatz mit der ID 2 aus der Mitarbeitertabelle durchgeführt und der d_id-Wert des Datensatzes wird der Variablen my_sql zugewiesen. Der Code lautet wie folgt:
Definieren von Bedingungen und Handlern Durch das Definieren von Bedingungen und Handlern werden die Probleme, die bei der Programmausführung auftreten können, im Voraus ermittelt. Und Lösungen für diese Probleme können im Handler definiert werden. Mit diesem Ansatz können mögliche Probleme im Voraus vorhergesehen und Lösungen vorgeschlagen werden. Dadurch kann die Fähigkeit des Programms zur Problembehandlung verbessert und abnormale Programmstopps vermieden werden. In MySQL werden Bedingungen und Handler mit dem Schlüsselwort DECLARE definiert. In diesem Abschnitt wird ausführlich erläutert, wie Bedingungen und Handler definiert werden. 1. Definieren Sie die Bedingungen In MySQL können Sie das Schlüsselwort DECLARE verwenden, um Bedingungen zu definieren. Die grundlegende Syntax lautet wie folgt: DECLARE Bedingungsname BEDINGUNG FOR Bedingungswert Bedingungswert: SQLSTATE [WERT] sqlstate_value | mysql_fehlercode Der Parameter condition_name gibt den Namen der Bedingung an, der Parameter condition_value den Typ der Bedingung und die Parameter sqlstate_value und mysql_error_code geben beide MySQL-Fehler an. Beispielsweise beträgt bei ERROR 1146 (42S02) der sqlstate_value-Wert 42S02 und der mysql_error_code-Wert 1146. [Beispiel 6] Im Folgenden wird der Fehler „ERROR 1146 (42S02)“ definiert und mit dem Namen „kann_nicht_gefunden_werden“ bezeichnet. Es kann auf zwei verschiedene Arten definiert werden, der Code lautet wie folgt: //Methode 1: Verwenden Sie sqlstate_value DECLARE kann_nicht_finden BEDINGUNG FÜR SQLSTATE '42S02'; //Methode 2: Verwenden Sie mysql_error_code DECLARE kann_nicht_finden BEDINGUNG FÜR 1146; 2. Definieren von Handlern In MySQL können Sie das Schlüsselwort DECLARE verwenden, um Handler zu definieren. Die grundlegende Syntax lautet wie folgt: DECLARE handler_type HANDLER FÜR Bedingungswert[,...] sp_statement handler_typ: WEITER | BEENDEN | RÜCKGÄNGIG MACHEN Bedingungswert: SQLSTATE [WERT] sqlstate_wert | Bedingungsname | SQLWARNING | NICHT GEFUNDEN | SQLEXCEPTION | mysql_error_code Der Parameter handler_type gibt an, wie Fehler behandelt werden, und hat drei mögliche Werte. Die drei Werte sind CONTINUE, EXIT und UNDO. CONTINUE bedeutet, dass im Fehlerfall keine Verarbeitung erfolgt und die Ausführung fortgesetzt wird; EXIT bedeutet, dass die Ausführung im Fehlerfall sofort beendet wird; UNDO bedeutet, dass im Fehlerfall die vorherige Operation zurückgenommen wird. MySQL unterstützt diese Verarbeitungsmethode derzeit nicht. Hinweis: Normalerweise sollten Sie, wenn während der Ausführung ein Fehler auftritt, die Ausführung der folgenden Anweisungen sofort abbrechen und die vorherigen Vorgänge rückgängig machen. MySQL unterstützt derzeit jedoch keine UNDO-Operationen. Daher ist es am besten, beim Auftreten eines Fehlers eine EXIT-Aktion auszuführen. Wenn der Fehlertyp im Voraus vorhergesagt und entsprechend behandelt werden kann, kann der CONTINUE-Vorgang ausgeführt werden. Der Parameter condition_value gibt den Fehlertyp an und hat sechs mögliche Werte. sqlstate_value und mysql_error_code haben dieselbe Bedeutung wie in der Bedingungsdefinition. condition_name ist der Name der durch DECLARE definierten Bedingung. SQLWARNING repräsentiert alle sqlstate_value-Werte, die mit 01 beginnen. NOT FOUND steht für alle sqlstate_value-Werte, die mit 02 beginnen. SQLEXCEPTION stellt alle sqlstate_value-Werte dar, die nicht von SQLWARNING oder NOT FOUND erfasst werden. sp_statement stellt die Ausführungsanweisungen einiger gespeicherter Prozeduren oder Funktionen dar. [Beispiel 7] Nachfolgend finden Sie mehrere Möglichkeiten zum Definieren von Handlern. Der Code lautet wie folgt: //Methode 1: Erfassen Sie sqlstate_value DECLARE CONTINUE HANDLER FÜR SQLSTATE '42S02' SET @info='KANN NICHT FINDEN'; //Methode 2: Erfassen Sie mysql_error_code DECLARE CONTINUE HANDLER FÜR 1146 SET @info='KANN NICHT GEFUNDEN WERDEN'; //Methode 3: Definieren Sie zuerst die Bedingung und rufen Sie dann DECLARE can_not_find CONDITION FOR 1146 auf. DECLARE CONTINUE HANDLER FÜR can_not_find SET @info='NICHT FINDEN'; //Methode 4: SQLWARNING verwenden DECLARE EXIT HANDLER FÜR SQLWARNING SET @info='ERROR'; //Methode 5: Verwenden Sie NOT FOUND DECLARE EXIT HANDLER FÜR NICHT GEFUNDENEN SET @info='NICHT GEFUNDEN'; //Methode 6: SQLEXCEPTION verwenden DECLARE EXIT HANDLER FÜR SQLEXCEPTION SET @info='ERROR'; Der obige Code zeigt 6 Möglichkeiten zum Definieren von Handlern. Die erste Methode besteht darin, den sqlstate_value-Wert zu erfassen. Wenn der SQLstate_Value 42S02 ist, wird die CONTINUE-Operation ausgeführt und die Meldung „CAN NOT FIND“ ausgegeben. Die zweite Methode besteht darin, den mysql_error_code-Wert zu erfassen. Wenn der mysql_error_code-Wert 1146 ist, wird die CONTINUE-Operation ausgeführt und die Meldung „CAN NOT FIND“ ausgegeben. Die dritte Methode besteht darin, zuerst die Bedingung zu definieren und sie dann aufzurufen. Hier definieren wir zuerst die Bedingung „can_not_find“ und führen die Operation „CONTINUE“ aus, wenn ein Fehler 1146 auftritt. Die vierte Methode ist die Verwendung von SQLWARNING. SQLWARNING erfasst alle sqlstate_value-Werte, die mit 01 beginnen, führt dann die EXIT-Operation aus und gibt die Meldung „ERROR“ aus. Die fünfte Methode ist die Verwendung von NOT FOUND. NOT FOUND erfasst alle sqlstate_value-Werte, die mit 02 beginnen, führt dann die EXIT-Operation aus und gibt die Meldung „CAN NOT FIND“ aus. Die sechste Methode ist die Verwendung von SQLEXCEPTION. SQLEXCEPTION erfasst alle sqlstate_value-Werte, die nicht von SQLWARNING oder NOT FOUND erfasst werden, führt dann eine EXIT-Operation aus und gibt eine „ERROR“-Meldung aus. Zusammenfassung zum Schreiben gespeicherter MySQL-Prozeduren 1. Erstellen Sie eine gespeicherte Prozedur ohne Parameter. Prozedur „product()“ erstellen beginnen wähle * vom Benutzer; Ende; Eine einfache Anweisung zum Erstellen einer gespeicherten Prozedur. Die aufrufende Anweisung lautet: ##Beachten Sie, dass diese Schreibweise zu einem Syntaxfehler führt, wenn Sie es in der Befehlszeile schreiben. Wählen Sie also diesen Satz zum Beenden aus Trennzeichen // Prozedur „product()“ erstellen beginnen wähle * vom Benutzer; Ende // Ändere es endlich wieder 2. Erstellen Sie eine gespeicherte Prozedur mit Parametern Der Speicher mit Parametern umfasst zwei Parameter: Prozedur erstellen Prozedur2( aus p1 dezimal(8,2), aus p2 dezimal(8,2), in p3 int ) beginnen Wählen Sie Summe(UID) in P1 vom Benutzer, wobei Auftragsname = P3 ist. Wählen Sie avg(uid) in p2 vom Benutzer aus; Ende ; Aus den obigen SQL-Anweisungen können wir ersehen, dass p1 und p2 zum Abrufen und Ausgeben von Werten verwendet werden, während für den Aufruf von p3 ein bestimmter Wert übergeben werden muss.
Wenn diese aufgebraucht sind, können die Werte von userSum und userAvg direkt abgefragt werden:
Die Ergebnisse sind wie folgt: +----------+----------+ 3. Löschen Sie die gespeicherte Prozedur Eine Anweisung: 4. Ein vollständiges Beispiel für eine gespeicherte Prozedur: -- Name: drdertotal -- Parameter: onumber = Bestellnummer -- steuerpflichtig = 0 wenn nicht steuerpflichtig, 1 wenn steuerpflichtig --ototal = Bestellsummenvariable Prozedur „ordertotal“ erstellen ( in onumber int, in steuerpflichtigem Booleschen Wert, out ototal dezimal(8,2) ) commit 'Bestellsumme abrufen, optional mit Mehrwertsteuer' beginnen -- Variable für Gesamtsumme deklarieren Deklariere die Summe als Dezimalzahl (8,2); -- Steuersatz angeben Deklarieren Sie den Steuersatz int als Standardwert 6; --Erhalten Sie den Bestellwert Wählen Sie Summe (Artikelpreis * Menge) von Bestellartikeln wobei order_num = onumber ins Gesamte; --Ist das steuerpflichtig? wenn steuerpflichtig dann --Ja, also addieren Sie den Steuersatz zum Gesamtbetrag Wählen Sie Gesamtsumme + (Gesamtsumme/100*Steuersatz) in Gesamtsumme; Ende wenn; --Fügen Sie abschließend „Speichern in der Out-Variable“ hinzu Wählen Sie „Gesamt“ in „Ototal“ aus. Ende; Die obige gespeicherte Prozedur ähnelt der Geschäftsverarbeitung in höheren Programmiersprachen. Sie ist nicht schwer zu verstehen. Achten Sie auf die Einzelheiten beim Schreiben. Commit-Schlüsselwort: Es ist nicht erforderlich, wird aber, wenn es angegeben wird, in den Ergebnissen zum Anzeigen des Prozedurstatus angezeigt. if-Anweisung: Dieses Beispiel zeigt die grundlegende Verwendung der mysqlif-Anweisung. Die if-Anweisung unterstützt auch elseif- und else-Klauseln. Mit show procedure status können Sie alle gespeicherten Prozeduren detailliert auflisten und einen Gefällt mir+Geben Sie den zu filternden Filtermodus an. Das könnte Sie auch interessieren:
|
<<: Das WeChat-Applet implementiert die Aufnahmefunktion
>>: So passen Sie geplante AT- und Cron-Aufgaben in Linux an
In diesem Artikelbeispiel wird der spezifische Co...
Die Verwendung der ElementUI-Paging-Komponente Pa...
Ich habe erst vor ein paar Tagen mit der Arbeit b...
Frage Als ich heute eine Projektfunktion schrieb,...
Erstellen Sie zunächst ein spezielles Projektverz...
Inhaltsverzeichnis Das Verfahren Im Objekt Verste...
In der Open-Source-Umfrage von Black Duck aus dem...
Wir, die bescheidenen Programmierer, müssen immer...
<br />Vorheriger Artikel: Webdesign-Tutorial...
Grundlegendes dreispaltiges Layout .Container{ An...
Inhaltsverzeichnis Docker-Maven-Plugin Schritte z...
Es gibt ein Unternehmen, das die 5 zuletzt überpr...
Problembeschreibung: Der Benutzer hat die Anforde...
Inhaltsverzeichnis 1. Grundlegendes Verständnis v...
Vorwort Die Schlafsystemfunktion in MySQL hat nur...