Heim > Datenbank > MySQL-Tutorial > Beispiel-Tutorial für MySQL mit Cursordaten

Beispiel-Tutorial für MySQL mit Cursordaten

巴扎黑
Freigeben: 2017-05-18 14:35:12
Original
2014 Leute haben es durchsucht

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;
Nach dem Login kopieren

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;
Nach dem Login kopieren

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;
Nach dem Login kopieren

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;
Nach dem Login kopieren
Analyse: In diesem Beispiel haben wir eine weitere Variable namens t hinzugefügt (um die Gesamtsumme für jede Bestellung zu speichern). Diese gespeicherte Prozedur erstellt auch spontan eine neue Tabelle (falls noch nicht vorhanden) mit dem Namen ordertotals . Diese Tabelle enthält die von der gespeicherten Prozedur generierten Ergebnisse. FETCH nimmt jede order_num wie zuvor und verwendet dann CALL, um eine weitere gespeicherte Prozedur (die wir im vorherigen Kapitel erstellt haben) auszuführen, um die besteuerte Gesamtsumme für jede Bestellung zu berechnen (das Ergebnis wird in t gespeichert). Abschließend verwenden Sie INSERT, um die Bestellnummer und die Gesamtsumme für jede Bestellung zu speichern.

Diese gespeicherte Prozedur gibt keine Daten zurück, kann aber eine andere Tabelle erstellen und füllen, die mit einer einfachen SELECT-Anweisung angezeigt werden kann:

Eingabe:

select * from ordertotals;
Nach dem Login kopieren
Ausgabe:

Beispiel-Tutorial für MySQL mit Cursordaten

Auf diese Weise erhalten wir ein vollständiges Arbeitsbeispiel für gespeicherte Prozeduren, Cursor, zeilenweise Verarbeitung und gespeicherte Prozeduren, die andere gespeicherte Prozeduren aufrufen.

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage