Alle Zeilen einer MySQL-Tabelle durchlaufen
- Alle Zeilen einer MySQL-Tabelle durchlaufen
- 
          
            Verwenden Sie eine WHILE-Schleife in einer gespeicherten Prozedur, um alle Zeilen einer MySQL-Tabelle zu durchlaufen
- 
          
            Verwenden Sie CURSORin einer gespeicherten Prozedur, um alle Zeilen der MySQL-Tabelle zu durchlaufen
- 
          
            Vergleich der Verwendung von WHILEundCURSOR
 
Heute lernen wir die Verwendung von WHILE und CURSOR in einer gespeicherten Prozedur kennen, um alle Zeilen einer MySQL-Tabelle zu durchlaufen. Wir werden auch die Vor- und Nachteile jeder Technik untersuchen, um zu unterscheiden, welche in welcher Situation geeignet ist.
Alle Zeilen einer MySQL-Tabelle durchlaufen
Wir werden verschiedene Ansätze kennenlernen, mit denen wir alle Zeilen einer MySQL-Tabelle durchlaufen können, um Daten aus einer bestimmten oder mehreren Tabellen zu lesen/einzufügen. Lassen Sie uns jeden von ihnen anhand eines Codebeispiels lernen.
Zu diesem Zweck haben wir zwei Tabellen: Mitarbeiter und die andere ist emp_performance. Die Tabelle Mitarbeiter hat als Attribute (auch Spaltennamen genannt) EMP_ID, FIRSTNAME, LASTNAME, GENDER und AGE.
Die Tabelle emp_performance hat die Felder PERFORM_ID, FIRSTNAME, LASTNAME und PERFORMANCE, wobei FIRSTNAME und LASTNAME dieselben sind wie die Tabelle employees.
Stellen Sie sich vor, wir müssten VORNAME und NACHNAME aus der Tabelle Mitarbeiter kopieren und in die Tabelle Arbeitnehmer_Leistung einfügen, um jeden Monat die LEISTUNG für jeden Mitarbeiter zu berechnen.
Es muss eine Möglichkeit geben, die notwendigen Werte aus der Tabelle Mitarbeiter zu AUSWÄHLEN, in die Tabelle Arbeitnehmer_Leistung EINFÜGEN und später mit der LEISTUNG-Berechnung fortfahren. Sie können auch Mitarbeiter und Emp_Leistungen erstellen, um mit uns fortzufahren; der Code ist unten angegeben.
Beispielcode:
#create an `employees` table
CREATE TABLE employees (
  EMP_ID INT NOT NULL AUTO_INCREMENT,
  FIRSTNAME VARCHAR(45) NOT NULL,
  LASTNAME VARCHAR(45) NOT NULL,
  GENDER VARCHAR(45) NOT NULL,
  AGE INT NOT NULL,
  PRIMARY KEY (EMP_ID));
#insert data
INSERT INTO employees (FIRSTNAME, LASTNAME, GENDER, AGE) VALUES
('Mehvish','Ashiq', 'Female', 30),
('Thomas', 'Christopher', 'Male', 22),
('John', 'Daniel', 'Male', 34),
('Saira', 'James', 'Female', 27);
#create a `emp_performance` table
CREATE TABLE emp_performance (
  PERFORM_ID INT NOT NULL AUTO_INCREMENT,
  FIRSTNAME VARCHAR(45) NOT NULL,
  LASTNAME VARCHAR(45) NOT NULL,
  PERFORMANCE  VARCHAR(45) NULL,
  PRIMARY KEY (PERFORM_ID));
Wir können WHILE und CURSOR in einer gespeicherten Prozedur verwenden, um alle Zeilen der employees-Tabelle und INSERT in die emp_performance-Tabelle zu durchlaufen.
Verwenden Sie eine WHILE-Schleife in einer gespeicherten Prozedur, um alle Zeilen einer MySQL-Tabelle zu durchlaufen
Jetzt haben wir unsere Tische bereit. Wir können also die folgende Prozedur schreiben und ausführen, um den VORNAMEN und den NACHNAMEN aus der Tabelle Mitarbeiter zu AUSWÄHLEN und in die Tabelle Arbeitnehmer_Leistung zu EINFÜGEN.
Beispielcode:
DROP PROCEDURE IF EXISTS CALCPERFORMANCE;
DELIMITER ;;
CREATE PROCEDURE CALCPERFORMANCE()
BEGIN
DECLARE length INT DEFAULT 0;
DECLARE counter INT DEFAULT 0;
SELECT COUNT(*) FROM employees INTO length;
SET counter=0;
WHILE counter<length DO
  INSERT INTO emp_performance(FIRSTNAME, LASTNAME)
  SELECT FIRSTNAME, LASTNAME FROM employees LIMIT counter,1;
  SET counter = counter + 1;
END WHILE;
End;
;;
DELIMITER ;
CALL CALCPERFORMANCE();
Verwenden Sie nach dem Einfügen der Datensätze den Befehl SELECT, um die Ausgabe von emp_performance anzuzeigen.
SELECT * from emp_performance;
Ausgabe (emp_performance-Tabelle mit WHILE-Schleife):
| PERORM_ID | FIRSTNAME | LASTNAME | PERFORMANCE | 
|---|---|---|---|
| 1 | Mehvisch | Aschiq | NULL | 
| 2 | Thomas | Christoph | NULL | 
| 3 | John | Daniel | NULL | 
| 4 | Saira | James | NULL | 
Sobald Sie die gespeicherte Prozedur CALCPERFORMANCE ausführen, werden nur PERFORM_ID, FIRSTNAME und LASTNAME ausgefüllt.
Code-Erklärung mit Zeilennummern
- Zeile 1 löscht alle bereits erstellten Prozeduren mit dem Namen CALCPERFORMANCE.
- Zeile 2 ändert den Standardwert Trennzeichen in ;;. Auf diese Weise führt das SQL nicht jede Zeile aus, da wir versuchen, eine Prozedur zu schreiben, um eine bestimmte Aufgabe zu erfüllen.
- Zeile 4 erstellt die Prozedur unter Verwendung des bereitgestellten Prozedurnamens.
- Alle notwendigen Anweisungen für dieses Verfahren würden zwischen Zeile 5 und 15 geschrieben werden.
- Zeile 5 beginnt mit der Prozedur.
- Zeile 6 und 7 deklarieren eine Variable namens lengthundcountervom TypINT, derenDEFAULT-Wert 0 bzw. 0 ist.
- In Zeile 8 WÄHLENwir die Anzahl aus der TabelleMitarbeiteraus und weisen diesen Wert der VariablenLängezu.
- Zeile 9 setzt den Zählerauf 0.
- Wir haben eine WHILE-Schleife von den Zeilen 10-14, die denFIRSTNAMEundLASTNAMEaus deremployees-TabelleSELECTundINSERTin dieemp_performance-Tabelle. Denken Sie daran, dass bei jeder Iteration nur ein Datensatz ausgewählt und eingefügt wird.
- Zeile 18 setzt das Trennzeichen wieder auf seinen Standardwert zurück, der ;ist.
- Zeile 19 ruft die Prozedur auf.
Ebenso können wir CURSOR verwenden, um alle Tabellenzeilen in MySQL zu durchlaufen. Sehen wir uns den folgenden Abschnitt an.
Verwenden Sie CURSOR in einer gespeicherten Prozedur, um alle Zeilen der MySQL-Tabelle zu durchlaufen
Wir verwenden einen CURSOR, um die Ergebnismenge in einer gespeicherten Prozedur zu behandeln. Es lässt uns eine Reihe von Datensätzen (Zeilen) durchlaufen, die von einer Abfrage zurückgegeben werden, und jede Zeile einzeln verarbeiten.
Man muss die folgenden Eigenschaften von CURSOR haben, während man es benutzt.
- Der CURSORist empfindlich; es ist unnötig, dass der Server auch die Kopie der Ergebnistabelle erstellt.
- Der CURSORist nicht aktualisierbar, da er schreibgeschützt ist.
- Der CURSORist nicht scrollbar. Wir können es nur in eine Richtung durchlaufen, ohne Datensätze (Zeilen) in einer Ergebnismenge zu überspringen und zu springen.
Beispielcode:
DROP PROCEDURE IF EXISTS cursor_CALCPERFORMANCE;
DELIMITER ;;
CREATE PROCEDURE cursor_CALCPERFORMANCE()
BEGIN
DECLARE cursor_FIRSTNAME VARCHAR(45) DEFAULT "";
DECLARE cursor_LASTNAME VARCHAR(45) DEFAULT "";
DECLARE done INT DEFAULT FALSE;
DECLARE cursor_e CURSOR FOR SELECT FIRSTNAME,LASTNAME FROM employees;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cursor_e;
read_loop: LOOP
  FETCH cursor_e INTO cursor_FIRSTNAME, cursor_LASTNAME;
  IF done THEN
    LEAVE read_loop;
  END IF;
  INSERT INTO emp_performance (FIRSTNAME,LASTNAME)
  VALUES (cursor_FIRSTNAME, cursor_LASTNAME);
END LOOP;
CLOSE cursor_e;
END;
;;
DELIMITER ;
CALL cursor_CALCPERFORMANCE();
Verwenden Sie nach dem Einfügen der Datensätze den Befehl SELECT, um die Ausgabe von emp_performance anzuzeigen.
SELECT * from emp_performance;
Ausgabe (Tabelle emp_performance mit CURSOR):
| PERORM_ID | FIRSTNAME | LASTNAME | PERFORMANCE | 
|---|---|---|---|
| 1 | Mehvisch | Aschiq | NULL | 
| 2 | Thomas | Christoph | NULL | 
| 3 | John | Daniel | NULL | 
| 4 | Saira | James | NULL | 
Code-Erklärung mit Zeilennummern
- Zeile 1 löscht die bestehende gleichnamige Prozedur.
- Zeile 2 ändert das Trennzeichen in ;;.
- Zeile 4 erstellt die Prozedur unter Verwendung des angegebenen Prozedurnamens.
- Alle erforderlichen Anweisungen werden zwischen Zeile 5 und 21 geschrieben.
- Zeile 5 beginnt mit der Prozedur.
- Zeile 6, 7 und 8 deklariert eine Variable namens cursor_FIRSTNAME,cursor_LASTNAMEunddonevom TypVARCHAR(45),VARCHAR(45)undINT, derenDEFAULT-Werte sind"",""bzw.FALSE.
- Zeile 9 deklariert einen CURSOR, der derSELECT-Anweisung zugeordnet ist.
- Zeile 10 deklariert den Handler NOT FOUND, wo die Variablefinishedverwendet wird, um anzuzeigen, dass derCURSORdas Ende der Ergebnismenge erreicht hat.
- Zeile 11 öffnet den CURSOR.
- In Zeile 12-19 iterieren wir über die Liste von FIRSTNAMEundLASTNAMEbisINSERTin die Tabelleemp_performance.
- Zeile 20 beendet den CURSOR, während Zeile 21 die gespeicherte Prozedur beendet.
- Zeile 24 setzt das Trennzeichen wieder auf seinen Standard zurück, der ;ist.
- Zeile 25 ruft die Prozedur auf.
Vergleich der Verwendung von WHILE und CURSOR
Wir müssen die Vor- und Nachteile jedes Ansatzes kennen, wenn wir mehrere Möglichkeiten haben, eine Sache zu erreichen.
Vor- und Nachteile der WHILE-Schleife:
| VORTEILE | NACHTEILE | 
|---|---|
| Es ist schneller und verwendet minimale Sperren als der CURSOR. | Es ist schwierig, sich vorwärts und rückwärts zu bewegen. | 
| Sie erstellen keine Kopie der Daten in der tempdb. | Bei unsachgemäßer Handhabung besteht die Gefahr der Endlosschleife. | 
Vor- und Nachteile des CURSOR:
| VORTEILE | NACHTEILE | 
|---|---|
| Wir können Cursor an die gespeicherten Prozeduren übergeben. | Die Leistung nimmt im Vergleich zur Verwendung von CTE oder der WHILE-Schleife ab. | 
| Cursor benötigen keine Bedingung, und wir können uns im CURSORvor- und zurückbewegen. | Das Vorhandensein globaler Cursor im Code kann zu einem Fehlerrisiko führen. Wie? Der CURSORkann durch eine im Code verschachtelte gespeicherte Prozedur geschlossen werden. | 
