Cursordaten verwenden
Nachdem ein Cursor geöffnet wurde, können Sie mit der FETCH-Anweisung separat auf jede seiner Zeilen zugreifen. FETCH gibt an, welche Daten (erforderliche Spalten) abgerufen werden sollen und wo die abgerufenen Daten gespeichert werden. Außerdem wird der interne Zeilenzeiger im Cursor vorwärts bewegt, sodass die nächste FETCH-Anweisung die nächste Zeile abruft (ohne dieselbe Zeile wiederholt zu lesen).
Das erste Beispiel ruft eine einzelne Zeile (die erste Zeile) vom Cursor ab:
Eingabe:
create procedure processorders() BEGIN -- declare local variables declare o int; -- declare the cursor declare ordernumbers cursor for select order_num from orders: -- open the cursor open ordernumbers; -- get order number fetch ordernumbers into o; -- close the cursor close ordernumbers; end;
Analyse: wobei FETCH verwendet wird, um die order_num von abzurufen die aktuellen Zeilenspalten (die automatisch bei der ersten Zeile beginnen) in eine lokal deklarierte Variable mit dem Namen o. Es erfolgt keine Verarbeitung der abgerufenen Daten.
Im nächsten Beispiel werden die Daten in einer Schleife von der ersten bis zur letzten Zeile abgerufen:
Eingabe:
create procedure processorders() BEGIN -- declare local variables declare done boolean default 0; declare o int; -- declare the cursor declare ordernumbers cursor for select order_num from orders: --declare continue handler declare continue handler for sqlstate '02000' set done = 1; -- open the cursor open ordernumbers; --loop through all rows repeat -- get order number fetch ordernumbers into o; -- end of loop until done end repeat; -- close the cursor close ordernumbers; end;
Analyse: Wie beim vorherigen Beispiel, dieses Beispiel Verwenden Sie FETCH, um die aktuelle order_num in die deklarierte Variable mit dem Namen o abzurufen. Aber im Gegensatz zum vorherigen Beispiel befindet sich FETCH in diesem Beispiel innerhalb eines REPEAT, sodass es wiederholt ausgeführt wird, bis done wahr ist (wie durch UNTILdone END REPEAT; angegeben). Damit dies funktioniert, definieren Sie die Variable done mit DEFAULT 0 (false, nicht abgeschlossen). Wie kann es also am Ende auf „true“ gesetzt werden? Die Antwort besteht darin, die folgende Anweisung zu verwenden:
declare continue handler for sqlstate '02000' set done = 1;
Diese Anweisung definiert einen CONTINUE HANDLER, bei dem es sich um Code handelt, der ausgeführt wird, wenn die Bedingung auftritt. Hier heißt es, dass SET done=1 gilt, wenn SQLSTATE „02000“ auftritt. SQLSTATE „02000“ ist ein „Nicht gefunden“-Zustand, der auftritt, wenn REPEAT nicht fortgesetzt werden kann, weil keine weiteren Zeilen für die Schleife vorhanden sind.
MySQL-Fehlercodes Eine Liste der von MySQL 5 verwendeten MySQL-Fehlercodes finden Sie unter http://dev.mysql.com/doc/mysql/en/error-handling.html.
Reihenfolge der DECLARE-Anweisungen Es gibt eine bestimmte Reihenfolge, in der DECLARE-Anweisungen ausgegeben werden. Mit der DECLARE-Anweisung definierte lokale Variablen müssen definiert werden, bevor ein Cursor oder Handle definiert wird, und Handles müssen nach dem Cursor definiert werden. Bei Nichtbeachtung dieser Reihenfolge wird eine Fehlermeldung angezeigt.
Wenn diese gespeicherte Prozedur aufgerufen wird, definiert sie mehrere Variablen und einen CONTINUE-HANDLER, definiert und öffnet einen Cursor, liest wiederholt alle Zeilen und schließt dann den Cursor. Wenn alles einwandfrei funktioniert, können Sie alle erforderlichen Verarbeitungen in die Schleife einfügen (nach der FETCH-Anweisung, aber bevor die Schleife endet).
Wiederholung oder Schleife? Neben der hier verwendeten REPEAT-Anweisung unterstützt MySQL auch Schleifenanweisungen, mit denen Code wiederholt ausgeführt werden kann, bis er manuell mit der LEAVE-Anweisung beendet wird. Im Allgemeinen eignet sich die REPEAT-Anweisung aufgrund ihrer Syntax besser zum Durchlaufen von Cursorn.
Um dies zu organisieren, finden Sie hier eine weitere modifizierte Version unseres Beispiels für eine gespeicherte Cursorprozedur, die dieses Mal eine tatsächliche Verarbeitung der abgerufenen Daten durchführt: Eingabe:create procedure processorders() BEGIN -- declare local variables declare done boolean default 0; declare o int; declare t decimal(8,2); -- declare the cursor declare ordernumbers cursor for select order_num from orders; -- declare continue handler declare continue handler for sqlstate '02000' set done = 1; -- create a table to store the results create table if not exists ordertotals (order_num int, total decimal(8,2)); -- open the cursor open ordernumbers; -- loop through all rows repeat -- get order number fetch ordernumbers into o; -- get the total for this order call ordertotal(o,1,t); -- insert order and total into ordertotals insert into ordertotals(order_num,total) values(o,t); -- end of loop until done end repeat; -- close the cursor close ordernumbers; END;
select * from ordertotals;
Das obige ist der detaillierte Inhalt vonBeispiel-Tutorial für MySQL mit Cursordaten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!