Dieser Artikel veranschaulicht anhand von Beispielen die Fehlerzustände (SIGNAL- und RESIGNAL-Anweisungen), die MySQL in gespeicherten Prozeduren verursacht. Teilen Sie uns die Einzelheiten zu Ihrer Information mit: In MySQL können wir SIGNAL- und RESIGNAL-Anweisungen verwenden, um Fehlerzustände in gespeicherten Prozeduren auszulösen. Sehen wir uns zuerst die SIGNAL-Anweisung an. Normalerweise verwenden wir die SIGNAL-Anweisung, um dem Aufrufer in einem gespeicherten Programm, beispielsweise einer gespeicherten Prozedur, einer gespeicherten Funktion, einem Trigger oder einem Ereignis, einen Fehler- oder Warnzustand zurückzugeben. Die SIGNAL-Anweisung ermöglicht die Kontrolle über die zurückgegebenen Informationen (wie etwa den Wert und die Nachricht SQLSTATE). Werfen wir einen Blick auf die grammatikalische Struktur: SIGNAL SQLSTATE | Bedingungsname; SET Bedingungsinformationselementname_1 = Wert_1, Zustandsinformation_Artikelname_1 = Wert_2 usw.; Das Schlüsselwort SIGNAL ist ein SQLSTATE-Wert oder ein Bedingungsname, der durch die Anweisung DECLARE CONDITION deklariert wird. Beachten Sie jedoch, dass die SIGNAL-Anweisung immer einen SQLSTATE-Wert oder eine benannte Bedingung angeben muss, die mit einem SQLSTATE-Wert definiert ist. Wenn wir dem Anrufer Informationen bereitstellen möchten, müssen wir die SET-Klausel verwenden. Wenn wir mehrere Bedingungsinformationselementnamen mithilfe von Werten zurückgeben möchten, müssen wir jedes Name/Wert-Paar durch ein Komma trennen. Im obigen SQL kann condition_information_item_name MESSAGE_TEXT, MYSQL_ERRORNO, CURSOR_NAME usw. sein. Sehen wir uns eine gespeicherte Prozedur an, die einem vorhandenen Verkaufsauftrag eine Auftragsposition hinzufügt und eine Fehlermeldung ausgibt, wenn die Auftragsnummer nicht existiert: TRENNUNGSZEICHEN $$ PROZEDUR ERSTELLEN AddOrderItem(in orderNo int, in productCode varchar(45), in Menge int, in Preis double, in Zeilennr. int ) BEGINNEN Erklären Sie C INT; SELECT COUNT(Bestellnummer) INTO C Von Bestellungen WO Bestellnummer = Bestellnr; -- prüfen, ob Bestellnummer vorhanden ist WENN(C != 1) DANN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Bestellnummer nicht in der Bestelltabelle gefunden'; ENDE, WENN; -- mehr Code unten -- ... ENDE $$ TRENNUNGSZEICHEN ; Zunächst zählt es die Bestellungen anhand der an die gespeicherte Prozedur übergebenen Eingabebestellnummer. Wenn die Anzahl der Bestellungen dann ungleich 1 ist, wird ein SQLSTATE-45000-Fehler zusammen mit einer Fehlermeldung ausgelöst, dass die Bestellnummer in der Auftragstabelle nicht vorhanden ist. Wobei 45000 ein allgemeiner SQLSTATE-Wert ist, der verwendet wird, um eine nicht behandelte benutzerdefinierte Ausnahme anzuzeigen. Rufen wir die gespeicherte Prozedur AddOrderItem() auf, übergeben aber eine nicht vorhandene Bestellnummer, und wir erhalten eine Fehlermeldung: Rufen Sie AddOrderItem(10,'S10_1678',1,95.7,1) auf; Führen Sie den obigen Code aus und erhalten Sie die folgenden Ergebnisse: mysql> CALL AddOrderItem(10,'S10_1678',1,95.7,1); 1644 - Bestellnummer nicht in der Bestelltabelle gefunden MySQL> Schauen wir uns die RESIGNAL-Anweisung noch einmal an. Es ähnelt in Funktion und Syntax der SIGNAL-Anweisung, weist jedoch folgende Unterschiede auf:
Wenn die RESIGNAL-Anweisung allein verwendet wird, sind alle Attribute dieselben, die an den Bedingungshandler übergeben werden. Schauen wir uns eine gespeicherte Prozedur an, die die Fehlermeldung ändert, bevor sie an den Anrufer gesendet wird: TRENNUNGSZEICHEN $$ CREATE PROCEDURE Divide(IN Zähler INT, IN Nenner INT, OUT Ergebnis double) BEGINNEN DECLARE division_by_zero BEDINGUNG FÜR SQLSTATE '22012'; DECLARE CONTINUE HANDLER FÜR Division durch Null RESIGNAL SET MESSAGE_TEXT = 'Division durch Null / Nenner darf nicht Null sein'; -- WENN Nenner = 0 DANN SIGNAL Division durch Null; ANDERS SET-Ergebnis := Zähler / Nenner; ENDE, WENN; ENDE $$ TRENNUNGSZEICHEN ; Versuchen wir dann, Folgendes aufzurufen: mysql> CALL Divide(10,0,@Ergebnis); 1644 - Division durch Null / Nenner kann nicht Null sein Nun, dieser Bericht endet hier. Ich frage mich, ob Sie etwas daraus gelernt haben. Leser, die an weiteren MySQL-bezogenen Inhalten interessiert sind, können sich die folgenden Themen auf dieser Site ansehen: „Kenntnisse zu gespeicherten MySQL-Prozeduren“, „Zusammenfassung der allgemeinen MySQL-Funktionen“, „Kenntnisse zu MySQL-Protokollvorgängen“, „Zusammenfassung der Kenntnisse zu MySQL-Transaktionsvorgängen“ und „Zusammenfassung der Kenntnisse zu MySQL-Datenbanksperren“. Ich hoffe, dass dieser Artikel für jedermann beim Entwurf einer MySQL-Datenbank hilfreich ist. Das könnte Sie auch interessieren:
|
>>: Lassen Sie uns ausführlich über den Symboldatentyp in ES6 sprechen
Ich bin kürzlich auf das Audiovisual Linux Projec...
Einführung MySQL 5.7 soll der sicherste MySQL-Ser...
Inhaltsverzeichnis 1. Fehlermeldung 2. Fehlerursa...
Umweltbeschreibung: Es gibt eine laufende MySQL-U...
In MySQL verwenden wir normalerweise ein Limit, u...
Detaillierte Erklärung der MySQL-Anzahl Die Funkt...
Wir schreiben bereits das Jahr 2020. Hungrige Men...
1. Ziehen Sie das Bild Docker-Pull-Registrierung....
1. Verstehen Sie zunächst das Overflow-Wrap-Attri...
1. Zunächst müssen wir zwischen der Tomcat-Protok...
Inhaltsverzeichnis 0x01 Das Treibermodul konnte n...
In diesem Artikelbeispiel wird der spezifische JS...
Problembeschreibung Nach der Installation von Qt5...
Probleme, die bei der Optimierung auftreten könne...
<br />In meiner jahrelangen professionellen ...