1、創建遊標
mysql中游標只能在存儲過程和函數中使用。
CREATE PROCEDURE processorders()
BEGIN
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
END;
2、打開和關閉遊標
OPEN ordernumbers;
CLOSE ordernumbers;
3、使用遊標數據
CREATE PROCEDURE processorders()
BEGIN
DECLARE o INT;
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
OPEN ordernumbers;
FETCH ordernumbers INTO o;
SELECT o;
CLOSE ordernumbers;
END;
其中 FETCH 用來檢索當前行的 order_num 列(將自動從第一行開始)到一個名爲 o 的局部聲明的變量中。對檢索出的數據不做
任何處理。
4、循環檢索數據
CREATE PROCEDURE processorder()
BEGIN
DECLARE done BOOLEAN DEFAULT 0;
DECLARE o INT;
DECLARE t DECIMAL(8,2);
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
CREATE TABLE IF NOT EXISTS ordertotals(order_num INT,
total DECIMAL(8,2));
OPEN ordernumbers;
REPEAT
FETCH ordernumbers INTO o;
IF NOT done THEN
SELECT o;
CALL ordertotal1(o, 1,t);
INSERT INTO ordertotals(order_num, total) VALUES(o,t);
END IF;
UNTIL done END REPEAT;
CLOSE ordernumbers;
END;
和教材中的不同,由於repeat 和do while 想用,會多執行一次操作,使用IF語句判斷是否結束。藍色部分:
這條語句定義了一個 CONTINUE HANDLER ,它是在條件出現時被執行
的代碼。這裏,它指出當 SQLSTATE '02000' 出現時, SET done=1。SQLSTATE
'02000' 是一個未找到條件,當 REPEAT 由於沒有更多的行供循環而不能繼
續時,出現這個條件。