Beispielanalyse von gespeicherten MySQL-Prozeduren, die Fehlerbedingungen in gespeicherten Prozeduren auslösen (SIGNAL- und RESIGNAL-Anweisungen)

Beispielanalyse von gespeicherten MySQL-Prozeduren, die Fehlerbedingungen in gespeicherten Prozeduren auslösen (SIGNAL- und RESIGNAL-Anweisungen)

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:

  • Sie müssen die RESIGNAL-Anweisung in einem Fehler- oder Warnungshandler verwenden. Andernfalls erhalten Sie die Fehlermeldung „ RESIGNAL, wenn Handler nicht aktiv ist “. Beachten Sie, dass Sie die SIGNAL-Anweisung überall in einer gespeicherten Prozedur verwenden können.
  • Alle Attribute der RESIGNAL-Anweisung können weggelassen werden, sogar der SQLSTATE-Wert.

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:
  • Zusammenfassung der if- und case-Anweisungen in MySQL
  • Detaillierte Erklärung des Prinzips und der Verwendung des Cursors (DECLARE) in der gespeicherten MySQL-Prozedur
  • Beispiel für eine gespeicherte MySQL-Prozedurmethode zum Zurückgeben mehrerer Werte
  • So erstellen (CREATE PROCEDURE) und rufen (CALL) Sie eine gespeicherte MySQL-Prozedur auf und so erstellen (DECLARE) und weisen (SET) Sie eine Variable zu
  • Detaillierte Erläuterung von Beispielen zur Fehlerbehandlung in gespeicherten MySQL-Prozeduren
  • Detaillierte Erläuterung der Prinzipien und der Verwendung von gespeicherten MySQL-Prozeduren
  • Definition und Zuweisung von Variablen in gespeicherten MySQL-Prozeduren
  • Einführung in die Verwendung der Cursorschleife für gespeicherte Prozeduren in MySQL
  • Beispiel für eine gespeicherte MySQL-Prozedur (einschließlich Transaktionen, Ausgabeparameter, verschachtelte Aufrufe)
  • Detaillierte Erläuterung der gespeicherten Prozeduren und Funktionen von MySql
  • Detailliertes Beispiel für die Verwendung der if-Anweisung in einer gespeicherten MySQL-Prozedur

<<:  Eine kurze Analyse der SpringBoot-Verpackung und des Hochladens in Docker sowie der Implementierung der Bereitstellung mehrerer Instanzen (IDEA-Version)

>>:  Lassen Sie uns ausführlich über den Symboldatentyp in ES6 sprechen

Artikel empfehlen

Eine audiovisuelle Linux-Distribution, die Audiophile anspricht

Ich bin kürzlich auf das Audiovisual Linux Projec...

Wartungsmethode für den Innodb-Systemtabellenbereich

Umweltbeschreibung: Es gibt eine laufende MySQL-U...

MySQL count: ausführliche Erklärung und Funktionsbeispielcode

Detaillierte Erklärung der MySQL-Anzahl Die Funkt...

CSS-Overflow-Wrap – Verwendung neuer Eigenschaftswerte überall

1. Verstehen Sie zunächst das Overflow-Wrap-Attri...

Lösung für den Fehler von 6ull beim Laden des Linux-Treibermoduls

Inhaltsverzeichnis 0x01 Das Treibermodul konnte n...

js zur Realisierung der Web-Message-Board-Funktion

In diesem Artikelbeispiel wird der spezifische JS...

Referenz zur MySQL-Optimierungslösung

Probleme, die bei der Optimierung auftreten könne...

Design: Ein eigenwilliger Designer

<br />In meiner jahrelangen professionellen ...