首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 游標完整使用指南與實戰範例

     編輯:MySQL 資料庫相關知識

MySQL 游標是儲存程序中處理結果集的重要機制,允許逐行讀取查詢結果。完整的游標生命週期包含四個步驟:

游標操作四步驟

  1. 宣告游標:定義查詢語句
  2. 開啟游標:執行查詢並建立結果集
  3. 提取資料:逐行讀取資料到變數
  4. 關閉游標:釋放資源

語法範例

-- 1. 宣告游標
DECLARE calc_bonus CURSOR FOR SELECT id, salary, commission FROM employees;

-- 2. 開啟游標
OPEN calc_bonus;

-- 3. 使用游標(迴圈讀取)
FETCH calc_bonus INTO var_id, var_salary, var_comm;

-- 4. 關閉游標
CLOSE calc_bonus;

完整實戰範例:帶異常處理的游標迴圈

BEGIN
    DECLARE temp_user_id INT DEFAULT NULL;
    DECLARE done INT DEFAULT 0;
    
    -- 宣告游標
    DECLARE temp_cur CURSOR FOR 
        SELECT f_user_id FROM table_test WHERE f_user_id = 1;
    
    -- 宣告 NOT FOUND 異常處理器(游標讀完時觸發)
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
    
    OPEN temp_cur;
    
    -- 讀取第一行
    FETCH temp_cur INTO temp_user_id;
    
    -- 迴圈處理
    WHILE done <> 1 DO
        -- 這裡處理每一行資料的業務邏輯
        -- 例如:UPDATE、INSERT 等操作
        
        -- 讀取下一行
        FETCH temp_cur INTO temp_user_id;
    END WHILE;
    
    CLOSE temp_cur;
END

關鍵點解析

  • SQLSTATE '02000':標準 SQL 狀態碼,代表「無資料」(NOT FOUND),游標讀取完畢時會觸發。
  • CONTINUE HANDLER:發生指定條件時繼續執行後續邏輯,而非終止程序。
  • 變數宣告順序:必須先宣告變數、再宣告游標、最後宣告處理器。
  • 游標特性:唯讀、單向、不可捲動,適合逐行處理邏輯複雜的資料。

最佳實踐建議

雖然游標功能強大,但在 MySQL 中效率較集合操作(SET-based operations)低。能用單一 SQL 解決的盡量避免使用游標。若必須使用,建議:

  1. 儘量縮小結果集範圍
  2. 避免在游標迴圈中執行複雜查詢
  3. 考慮使用暫存表配合集合操作替代
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved