MySQL——游標(cursor)

一、什么是游標?

游標(Cursor)?是MySQL中用于逐行處理查詢結果集的數據庫對象。它類似于指針,允許開發者在結果集中逐行移動,并對每一行數據進行特定操作。游標將傳統的集合操作轉換為面向過程的記錄處理方式,特別適用于需要逐行邏輯判斷或復雜計算的場景。

為什么需要游標?

  • 逐行處理:如根據每行數據動態生成計算結果或觸發業務邏輯。

  • 復雜邏輯:需要基于當前行數據狀態執行條件分支操作。

  • 個性化操作:不同記錄需要不同的處理策略(如生成定制化報告)。


二、游標的優缺點:權衡使用場景

優點

  1. 靈活性強:支持逐行數據訪問與操作。

  2. 內存高效:分批處理大型結果集,避免一次性加載內存溢出。

  3. 過程化控制:可在循環中結合條件判斷和變量計算。

缺點

  1. 性能開銷:比集合操作(如JOIN、子查詢)效率低。

  2. 資源消耗:占用數據庫連接資源,長時間未關閉可能導致阻塞。

  3. 復雜度高:代碼量增加,調試和維護難度大。


三、游標操作流程:五步掌握核心用法

1. 聲明游標

DECLARE cursor_name CURSOR FOR 
SELECT column1, column2 FROM table WHERE condition;
  • 作用:定義游標名稱和關聯的查詢,不執行查詢

2. 打開游標

OPEN cursor_name;
  • 作用:執行關聯的SELECT語句,生成結果集。

3. 獲取數據

FETCH cursor_name INTO var1, var2;
  • 作用:將當前行數據存入變量,游標下移一行。

4. 處理結束條件

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
  • 作用:當FETCH無更多數據時觸發,設置結束標志。

5. 關閉游標

CLOSE cursor_name;
  • 作用:釋放游標占用的資源,必須顯式調用


四、實戰案例:游標典型應用場景

案例1:生成學生成績評估報告

需求:為每個學生的每門課程生成等級和建議。

DELIMITER $$
CREATE PROCEDURE generate_grade_reports()
BEGINDECLARE v_sid INT;DECLARE v_score DECIMAL(5,2);DECLARE done INT DEFAULT 0;-- 聲明游標:獲取所有學生成績DECLARE grade_cursor CURSOR FORSELECT sid, score FROM t_score;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;OPEN grade_cursor;grade_loop: LOOPFETCH grade_cursor INTO v_sid, v_score;IF done THEN LEAVE grade_loop; END IF;-- 根據分數生成等級CASE WHEN v_score >= 90 THEN INSERT INTO t_report VALUES (v_sid, 'A', '優秀');WHEN v_score >= 80 THEN INSERT INTO t_report VALUES (v_sid, 'B', '良好');-- 更多條件...END CASE;END LOOP;CLOSE grade_cursor;
END $$
DELIMITER ;

案例2:統計學生總分與平均分

需求:逐學生計算總分、平均分并匯總。

DELIMITER $$
CREATE PROCEDURE calculate_student_stats()
BEGINDECLARE v_sid INT;DECLARE v_total, v_avg DECIMAL;DECLARE done INT DEFAULT 0;-- 聲明游標:遍歷學生DECLARE student_cursor CURSOR FORSELECT sid FROM t_student;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;OPEN student_cursor;student_loop: LOOPFETCH student_cursor INTO v_sid;IF done THEN LEAVE student_loop; END IF;-- 計算當前學生的統計值SELECT SUM(score), AVG(score) INTO v_total, v_avgFROM t_score WHERE sid = v_sid;INSERT INTO t_stats VALUES (v_sid, v_total, v_avg);END LOOP;CLOSE student_cursor;
END $$
DELIMITER ;

案例3:批量調整課程成績

需求:為某課程所有學生成績增加固定分值,不超過100分。

DELIMITER $$
CREATE PROCEDURE adjust_scores(IN course_id INT, IN adjust DECIMAL)
BEGINDECLARE v_sid INT;DECLARE v_old_score DECIMAL;DECLARE done INT DEFAULT 0;-- 聲明游標:獲取指定課程成績DECLARE score_cursor CURSOR FORSELECT sid, score FROM t_score WHERE cid = course_id;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;OPEN score_cursor;adjust_loop: LOOPFETCH score_cursor INTO v_sid, v_old_score;IF done THEN LEAVE adjust_loop; END IF;-- 計算新成績并更新UPDATE t_score SET score = LEAST(v_old_score + adjust, 100)WHERE sid = v_sid AND cid = course_id;END LOOP;CLOSE score_cursor;
END $$
DELIMITER ;

五、常見問題與解決方案

問題1:游標死循環

  • 現象:存儲過程無法退出循環。

  • 原因:未正確處理NOT FOUND條件。

  • 解決:確保聲明CONTINUE HANDLER并設置終止標志。

問題2:游標性能低下

  • 現象:處理速度慢,數據庫負載高。

  • 原因:循環內執行復雜查詢或大量計算。

  • 解決:預先計算中間結果,使用臨時表存儲數據。

問題3:資源泄漏

  • 現象:連接數異常增長,數據庫響應變慢。

  • 原因:未顯式關閉游標。

  • 解決:在結束處理后務必執行CLOSE


六、最佳實踐與優化建議

  1. 限制使用場景:優先使用集合操作,僅在必須逐行處理時使用游標。

  2. 優化查詢語句:游標關聯的SELECT語句需高效,避免全表掃描。

  3. 批量提交事務:在循環內定期COMMIT,減少鎖競爭。

  4. 資源及時釋放:處理完成后立即關閉游標。

  5. 監控性能:使用EXPLAIN分析查詢計劃,檢查執行時間。


七、總結

適用場景

  • 逐行數據校驗(如格式檢查)

  • 動態生成報告(如個性化評價)

  • 級聯更新/刪除(如歷史數據遷移)

慎用場景

  • 大數據量處理(性能敏感)

  • 高并發業務(資源競爭激烈)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79384.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79384.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79384.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

異步編程——微信小程序

1. 前言 引用來自:微信小程序開發中的多線程處理與異步編程_微信小程序 多線程-CSDN博客 微信小程序是基于JavaScript開發的,與瀏覽器JavaScript不同,小程序運行在WebView內部,沒有多線程的概念。小程序的 JavaScript 是單線程的…

HarmonyOS-ArkUI V2狀態-PersistenceV2:持久化存儲UI狀態

PersistenceV2類是一個與AppStorageV2類用法非常相似的類。因為它倆是子類和父類的關系。如果不了解AppStorageV2,可以先跳轉至了解一下這個類。 HarmonyOS-ArkUI V2工具類:AppStorageV2:應用全局UI狀態存儲-CSDN博客 PersistenceV2相比于其父類AppStorageV2而言,它存儲的…

《Mycat核心技術》第22章:搭建Mycat+Zookeeper+HAProxy+Keepalived+MySQL高可用架構

作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章匯總:https://binghe.gitcode.host/md/all/all.html 星球項目地址:https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀&#xff0c…

Aosp13 文件應用點擊apk無反應的處理

最近遇到一個問題,在A13上,打開文件管理應用時,點擊apk 無反應或者啟動安裝進程后安裝完成或取消安裝進程,再次點擊apk 無反應。在此記錄該問題。 做一下修改:root/package/ providers/DownloadProvider/下 jenkinsdel…

SQL刷題記錄貼

1.題目:現在運營想要對用戶的年齡分布開展分析,在分析時想要剔除沒有獲取到年齡的用戶,請你取出所有年齡值不為空的用戶的設備ID,性別,年齡,學校的信息。 錯誤:select device_id,gender,age,un…

【Windows本地部署n8n工作流自動平臺結合內網穿透遠程在線訪問】

💝💝💝歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

python爬蟲降低IP封禁,python爬蟲除了使用代理IP和降低請求頻率,還有哪些方法可以應對IP封禁?

文章目錄 前言1. 利用 CDN 節點2. 模擬真實用戶行為3. 使用 IP 池輪換策略4. 處理 Cookie 和會話信息5. 分布式爬蟲 前言 除了使用代理 IP 和降低請求頻率,以下這些方法也能應對 IP 封禁: Python 3.13.2安裝教程(附安裝包)Python…

光譜相機的成像方式

光譜相機的成像方式決定了其如何獲取物體的空間與光譜信息,核心在于分光技術與掃描模式的結合。以下是主要成像方式的分類解析: ?一、濾光片切換型? ?1. 濾光片輪(Filter Wheel)? ?原理?:通過旋轉裝有多個窄帶…

AI在市場營銷分析中的核心應用及價值,分場景詳細說明

以下是 AI在市場營銷分析中的核心應用及價值,分場景詳細說明: 1. 客戶行為分析與細分 AI技術應用: 機器學習:分析用戶點擊、購買、瀏覽等行為數據,識別消費模式(如高頻購買時段、偏好品類)。聚…

潯川AI翻譯v7.0更新預告

親愛的潯川AI翻譯用戶: 感謝您一直以來的支持!潯川AI翻譯自推出以來,已迭代6個版本,其中**v2.0和v4.0因技術問題(翻譯結果顯示異常、注冊失敗、密碼找回功能失效等)**被迫下架。我們深知這些問題影響了您…

LabVIEW中二維數組轉換為彩色圖

在 LabVIEW 編程環境下,有用戶想把二維數組轉化為彩色圖片。通過附件的程序示例,給出了具體實現方法,包括對數據的處理以及顏色映射的設置等內容,還涉及解決數據范圍與顏色映射不匹配等問題。公司官網有源碼 程序功能及細節 功能&…

【模型常見評價指標(分類)】

目錄 常見指標 其他的評估指標 3.1 BLEU 3.2 ROUGE 3.3 困惑度PPL(perplexity) 常見指標 其他的評估指標 3.1 BLEU BLEU(Bilingual Evaluation Understudy,雙語評估替補)分數是評估一種語言翻譯成另一種語言的文本質量的指標。它將“質…

期貨數據API對接實戰指南

一、期貨數據接口概述 StockTV提供全球主要期貨市場的實時行情與歷史數據接口,覆蓋以下品種: 商品期貨:原油、黃金、白銀、銅、天然氣、農產品等金融期貨:股指期貨、國債期貨特色品種:馬棕油、鐵礦石等區域特色期貨 …

TCP連接建立:為什么是三次握手?

接下來,以三個方面分析三次握手的原因: 1、三次握手才可以阻止重復歷史連接的初始化(主要原因) 2、三次握手才可以同步雙方的初始化序列號 3、三次握手才可以避免資源浪費 原因一:避免歷史連接 簡單來說&#xff0…

Table類型的表單

形如下面的圖片 1 label與prop屬性 const columns[{label: "文件名",prop: "fileName",scopedSlots: "fileName",},{ label: "刪除時間",prop: "recoveryTime",width: "200",},{ label: "大小",prop:…

Cesium 加載 本地 b3dm 格式文件 并且 獲取鼠標點擊處經緯度 (親測可用)

很奇怪cesium 里面只支持 相對路徑 不支持絕對路徑 我把 模型放在 /***/Cesium-1.128/Apps/SampleData/Cesium3DTiles/Tilesets 下面 "../../SampleData/Cesium3DTiles/Tilesets/terra_b3dms/tileset.json",所有源碼 const viewer new Cesium.Viewer("cesiu…

Spring AI核心之“ChatClient”-來自DeepSeek

在 Spring AI 生態中,ChatClient 是一個面向開發者設計的高層抽象接口,它簡化了與大型語言模型(LLMs)的交互流程,尤其適用于需要快速構建端到端 AI 應用(如聊天機器人、RAG 問答系統等)的場景。…

購買電腦時,主要需要關注以下核心配置,它們直接影響性能、使用體驗和價格。根據需求(辦公、游戲、設計、編程等),側重點會有所不同。看看Deepseek的建議

1. 處理器(CPU) 作用:電腦的“大腦”,影響整體運算速度和多任務處理能力。關鍵參數: 品牌與型號:Intel(酷睿i3/i5/i7/i9)或 AMD(銳龍R3/R5/R7/R9)。核心/線程…

408數據結構緒論刷題001

答案:D 解析: ? A選項:數據元素是組成數據對象的基本單位 ,它只是數據的基本個體,不能完整定義數據結構,所以A選項錯誤。 ? B選項:數據對象是性質相同的數據元素的集合,僅僅描述…

c++STL——vector的使用和模擬實現

文章目錄 vector的使用和模擬實現vector的使用vector介紹重點接口的講解迭代器部分默認成員函數空間操作增刪查改操作迭代器失效問題(重要)調整迭代器 vector的模擬實現實現的版本模擬實現結構預先處理的函數尾插函數push_backswap函數賦值重載size函數reserve函數 迭代器默認成…