首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 游標完整教學:宣告、開啟、擷取、關閉與 NOT FOUND 處理

     編輯:MySQL 綜合教學

游標特性

  • 唯讀:無法透過游標更新底層資料表。
  • 不可捲動:僅能按 SELECT 順序向前擷取,不可倒序、跳過或定位特定行。
  • 敏感型:指向實際資料而非複本,效能優於非敏感游標,但其他連線修改會影響游標可見資料。

游標操作四步驟

  1. 宣告:DECLARE cursor_name CURSOR FOR SELECT_statement;
    必須在變數宣告之後,且固定綁定一個 SELECT。
  2. 開啟:OPEN cursor_name;
    初始化結果集,必須在 FETCH 前呼叫。
  3. 擷取:FETCH cursor_name INTO var_list;
    取得下一行並移動游標指標。
  4. 關閉:CLOSE cursor_name;
    釋放記憶體,用畢即關。

NOT FOUND 處理器(必要)

當 FETCH 到達結果集末尾,會拋出條件,需宣告處理器避免程序終止:

DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
  • 宣告順序:變數 → 游標 → 處理器。
  • finished 為旗標變數,供迴圈判斷離開條件。

流程圖解

完整範例:建立員工信箱清單

DELIMITER $$
CREATE PROCEDURE build_email_list (INOUT email_list VARCHAR(4000))
BEGIN
    DECLARE v_finished INTEGER DEFAULT 0;
    DECLARE v_email VARCHAR(100) DEFAULT "";
    
    -- 宣告游標
    DECLARE email_cursor CURSOR FOR 
        SELECT email FROM employees;
    
    -- 宣告 NOT FOUND 處理器
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1;
    
    OPEN email_cursor;
    
    get_email: LOOP
        FETCH email_cursor INTO v_email;
        IF v_finished = 1 THEN
            LEAVE get_email;
        END IF;
        -- 串接信箱,分號分隔
        SET email_list = CONCAT(v_email, ";", email_list);
    END LOOP get_email;
    
    CLOSE email_cursor;
END$$
DELIMITER ;

測試呼叫

SET @email_list = "";
CALL build_email_list(@email_list);
SELECT @email_list;

適用場景

  • 預存程序/函數/觸發器中逐行處理邏輯。
  • 需將客戶端 SELECT → 迴圈處理 下推至伺服器端,減少網路往返。
  • 複雜統計、報表彙總等無法單純 SQL 完成的運算。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved