Detaillierte Erläuterung der gespeicherten Prozeduren, Cursor und Transaktionsbeispiele von MySQL

Detaillierte Erläuterung der gespeicherten Prozeduren, Cursor und Transaktionsbeispiele von MySQL

Detaillierte Erläuterung der gespeicherten Prozeduren, Cursor und Transaktionsbeispiele von MySQL

Das Folgende ist eine gespeicherte Prozedur für MySQL-Datenbanken, die ich geschrieben habe. Ich behalte sie zur Archivierung und verwende sie in Zukunft als Referenz.

Darunter sind gespeicherte Prozeduren, Cursor (Doppelschleifen) und Transaktionen.

[Anmerkung]: Die Kommentare im Code beziehen sich nur auf das aktuelle Geschäft und können ignoriert werden.

Der Code lautet wie folgt:

TRENNUNGSZEICHEN $$
DROP-PROZEDUR, WENN `transferEmailTempData`$$ VORHANDEN IST

ERSTELLEN SIE DAS VERFAHREN „transferEmailTempData“ (IN jobId VARCHAR (24))
BEGINNEN
  DECLARE idval VARCHAR(24) DEFAULT '';
  DECLARE taskIdval VARCHAR(24) DEFAULT '';
  DECLARE groupIdval VARCHAR(24) DEFAULT '';
  DECLARE emailval VARCHAR(50) DEFAULT '';
  
  /*Identifizieren Sie, ob die Daten in der formalen Tabelle identisch sind, d. h., ob die Gruppen-ID und die E-Mail-Adresse identisch sind*/
  DECLARE infoId VARCHAR(24) DEFAULT '';
  
  /*Transaktionsfehler*/
  DECLARE err INT DEFAULT 0;
  
  /*Absenden, wenn eine bestimmte Zahl erreicht ist, Zähler*/
  DECLARE zählt INT DEFAULT 0;
  
  /*Identifizieren Sie, ob ein Rollback durchgeführt wurde*/
  DECLARE isrollback INT DEFAULT 0;
  
  /*Wenn der Cursor durchlaufen wird, wird er als Markierung verwendet, um zu bestimmen, ob alle Datensätze durchlaufen wurden*/
  DECLARE fertig INTEGER DEFAULT 0;
  
  /*Daten der Aufgabe in die temporäre Tabelle holen*/
  DECLARE cur CURSOR FÜR SELECT id, taskId, groupId, email FROM `t_email_data_temp` WHERE taskId=jobId;
  
  /*Abfrage, ob identische Datensätze basierend auf Gruppen-ID und E-Mail vorhanden sind*/
  DECLARE cur2 CURSOR FOR SELECT id FROM `t_email_info` e, wobei e. `group_id` = groupIdval UND e. `email_address` = emailval ist; 
  
  /* Es tritt ein Fehler auf, wird auf 1 gesetzt, Rollback solange eine Ausnahme auftritt*/
  DECLARE CONTINUE HANDLER FÜR SQLEXCEPTION SET err=1;
  
  /*Deklarieren Sie, dass die Flag-Variable auf einen bestimmten Wert gesetzt wird, wenn der Cursor alle Datensätze durchläuft*/
  DECLARE CONTINUE HANDLER FÜR NICHT GEFUNDEN
  SET fertig=1;
  
  /*Transaktion starten*/
  TRANSAKTION STARTEN;
  
  /*Cursor öffnen*/
  ÖFFNEN aktuell;
  
  /*Verwenden Sie LOOP zum Durchlaufen*/
  out_loop:SCHLEIFE
  
    /*Weisen Sie der Variablen den dem jeweiligen Ergebnis entsprechenden Feldwert zu*/
    FETCH aktuell INTO idval, taskIdval, groupIdval, emailval;
    WENN fertig = 1 DANN
      Verlassen Sie out_loop;
    ENDE, WENN;
    
    /*Öffne den zweiten Cursor*/
    ÖFFNEN cur2;
      SET fertig = 0;
      Hole cur2 in infoId;
      
      /*Wenn die offizielle Tabelle nicht dieselbe Gruppen-ID und denselben E-Mail-Datensatz hat, fügen Sie sie der offiziellen Tabelle hinzu*/
      WENN fertig = 1 DANN
      
        /*In die formale Tabelle einfügen*/
        INSERT INTO `t_email_info` VALUES(idval,emailval,groupIdval,0,'',JETZT(),'admin',JETZT(),'admin');
        
        /*Temporäre Daten löschen*/
        LÖSCHEN AUS `t_email_data_temp`, WO id = idval;
        
        /*Zähler, alle 1000 Einträge übermitteln*/
        SET Zählungen = Zählungen + 1;
        
        /*Ausnahme aufgetreten, Rollback*/
        WENN err=1 DANN
          SETZEN Sie isrollback=1;
          ROLLBACK;
        ANDERS
          WENN Anzahl = 1000, DANN
            BEGEHEN;
            /*Nach Erreichen von 1000 Einsendungen den Zähler zurücksetzen*/
            SETZE die Anzahl = 0;
          ENDE, WENN;
        ENDE, WENN;
      ANDERS
        /*Wenn der gleiche Datensatz bereits existiert, löschen Sie ihn*/
        WENN fertig=0 DANN
          LÖSCHEN AUS `t_email_data_temp`, WO id = idval;
        ENDE, WENN;
      ENDE, WENN;
      Hole cur2 in infoId;
    SCHLIESSEN cur2;
    
    /*Kontrolliere die externe Schleife. Dieser Schritt darf nicht fehlen, sonst endet er nach nur einer Schleife*/
    SET fertig=0;
    
  ENDE DER SCHLEIFE out_loop;
  SCHLIESSEN aktuell;
  
  /*Wenn kein Rollback-Ereignis aufgetreten ist, aktualisieren Sie den Aufgabenstatus*/
  /*Wenn die Aufgabe zurückgesetzt wird und der Aufgabenstatus nicht aktualisiert wird, werden die verbleibenden nicht festgeschriebenen Daten bei der nächsten Ausführung der Aufgabe erneut zur formalen Tabelle hinzugefügt*/
  WENN isrollback=0 DANN
    UPDATE `t_email_task` t SET t.`if_finish` = 1 WHERE t.`id`=jobId;
  ENDE, WENN;
  
  ENDE$$

TRENNUNGSZEICHEN ;

Oben finden Sie eine Erklärung zu gespeicherten Prozeduren, Cursorn und Transaktionen in MySQL. Wenn Sie Fragen haben, hinterlassen Sie bitte eine Nachricht oder diskutieren Sie in der Community dieser Site. Vielen Dank fürs Lesen und ich hoffe, es kann Ihnen helfen. Vielen Dank für Ihre Unterstützung dieser Site!

Das könnte Sie auch interessieren:
  • Einführung in die Verwendung der Cursorschleife für gespeicherte Prozeduren in MySQL
  • Beispiel für das Verlassen und Fortsetzen der Cursorschleife in gespeicherten MySQL-Prozeduren
  • Verschachtelte Schleife einer gespeicherten MySQL-Prozedur mit Cursor-Beispielcode
  • Beispiel für die Verwendung des Cursors in einer gespeicherten MySQL-Prozedur
  • Dynamisches MySQL-Cursor-Lernen (MySQL-Cursor für gespeicherte Prozeduren)
  • Detaillierte Erklärung des Prinzips und der Verwendung des Cursors (DECLARE) in der gespeicherten MySQL-Prozedur
  • Beispiel für die Verwendung des Cursors in einer gespeicherten MySQL-Prozedur
  • Verwenden einer Cursorschleife zum Lesen temporärer Tabellen in gespeicherten MySQL-Prozeduren
  • Beispiele für die Verwendung von gespeicherten MySql-Prozeduren und Cursorn

<<:  Zusammenfassung der Lösungen für allgemeine Linux-Probleme

>>:  Benutzerdefiniertes JavaScript-Plug-In zum Implementieren der Tab-Umschaltfunktion

Artikel empfehlen

Ausführliches Installationstutorial für MySQL Installer Community 5.7.16

Dieser Artikel zeichnet das ausführliche Tutorial...

Vue implementiert bidirektionale Datenbindung

In diesem Artikelbeispiel wird der spezifische Co...

Vue2.x - Beispiel für die Verwendung von Anti-Shake und Throttling

Inhaltsverzeichnis Dienstprogramme: Verwendung in...

Detaillierte Erklärung zum Ändern des Standardports von nginx

Finden Sie zunächst heraus, wo sich die Konfigura...

Beispiele für MySQL-Batch-Hinzufügungs- und Speichermethoden

Beim Anmelden am Stresstest sind viele verschiede...

Regeln für die Verwendung gemeinsamer MySQL-Indizes

Ein gemeinsamer Index wird auch als zusammengeset...

Detailliertes Installationstutorial von Docker unter CentOS

Docker ist in CE und EE unterteilt. Die CE-Versio...

Ungewöhnliche, aber nützliche Tags in Xhtml

Xhtml hat viele Tags, die nicht häufig verwendet w...

Eine kurze Erläuterung zur Verwendung von Slots in Vue

Definition und Verwendung: Verwenden Sie die Slot...

Unterschied zwischen varchar- und char-Typen in MySQL

Inhaltsverzeichnis vorgenannt VARCHAR-Typ VARCHAR...

Zusammenfassung der MySQL-Entwicklungsstandards und -Nutzungskenntnisse

1. Namenskonventionen 1. Datenbanknamen, Tabellen...