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

Die 10 klassischen Optimierungsfälle und -szenarien von MySQL

Inhaltsverzeichnis 1. Allgemeine Schritte zur SQL...

Wie werden Vue-Komponenten analysiert und gerendert?

Vorwort In diesem Artikel wird erklärt, wie Vue-K...

Datenbankabfrage, welches Objekt welches Feld enthält, Methodenanweisung

Die Datenbank fragt ab, welches Objekt welche Fel...

Zusammenfassung gängiger Docker-Befehle

Docker-Installation 1. Anforderungen: Linux-Kerne...

Implementierung einer zirkulären Scroll-Listenfunktion basierend auf Vue

Hinweis: Sie müssen dem übergeordneten Container ...

MySQL-Datenbanktabelle und Datenbankpartitionierungsstrategie

Lassen Sie uns zunächst darüber sprechen, warum w...

So verwalten Sie Benutzer und Gruppen beim Ausführen von Docker

Docker ist ein Verwaltungstool, das Prozesse als ...

So lassen Sie eine Remoteverbindung in MySql zu

So lassen Sie eine Remoteverbindung in MySql zu U...