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

Detaillierte Erklärung des JavaScript-Stacks und der Kopie

Inhaltsverzeichnis 1. Definition des Stapels 2. J...

MySQL-Gruppierungsabfragen und Aggregatfunktionen

Überblick Ich glaube, dass wir häufig auf solche ...

Vue-Anpassungsmethode für Großbildschirme

In diesem Artikelbeispiel wird der spezifische Co...

Javascript Frontend Optimierungscode

Inhaltsverzeichnis Optimierung der if-Beurteilung...

So führen Sie mehrere MySQL-Instanzen unter Windows aus

Vorwort Unter Windows können Sie mehrere MySQL-In...

So ändern Sie das MySQL-Tabellenpartitionierungsprogramm

So ändern Sie das MySQL-Tabellenpartitionierungsp...

Detaillierte Erklärung der Rolle statischer Variablen in MySQL

Detaillierte Erklärung der Rolle statischer Varia...

Acht Regeln für effektive Webformulare

Wenn Sie Informationen von Ihren Benutzern sammel...

Sperrt Mysql ALTER TABLE die Tabelle beim Hinzufügen von Feldern?

Inhaltsverzeichnis Vor MySQL 5.6 Nach MySQL 5.6 Z...

Detaillierte Erklärung zur Verwendung des Linux-Befehls Traceroute

Mithilfe von Traceroute können wir den Pfad ermit...

Implementierung der vertikalen Zentrierung mit unbekannter Höhe in CSS

Dieser Artikel stellt hauptsächlich die Implement...