mysql必知必會--學習筆記(18)-- 遊標

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 由於沒有更多的行供循環而不能繼
續時,出現這個條件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章