這裏的例子是僅在mysql中執行的,跟任何框架框架都沒有關係mysql
遊標的使用案例
當前有三張表A、B、C其中A和B是一對多關係,B和C是一對多關係,如今須要將B中A表的主鍵存到C中;
常規思路就是將B中查詢出來而後經過一個update語句來更新C表就能夠了,可是B表中有2000多條數據,
難道要執行2000屢次?顯然是不現實的;最終找到寫一個存儲過程而後經過循環來更新C表,
然而存儲過程當中的寫法用的就是遊標的形式。sql
我的理解:遊標能夠存儲一個結果集,可是在mysql中只有遊標能夠存儲,設置變量是存儲不了的。那麼在數據量大的時候就須要使用循環來操做,全部這裏就只能使用遊標來獲取字段值進行循環,遊標一次能夠獲取一行值數據庫
簡介
遊標其實是一種能從包括多條數據記錄的結果集中每次提取一條記錄的機制。
遊標充當指針的做用。
儘管遊標能遍歷結果中的全部行,但他一次只指向一行。
遊標的做用就是用於對查詢數據庫所返回的記錄進行遍歷,以便進行相應的操做。框架
用法
1、聲明一個遊標: declare 遊標名稱 CURSOR for table;(這裏的table能夠是你查詢出來的任意集合)
2、打開定義的遊標:open 遊標名稱;
3、得到下一行數據:FETCH 遊標名稱 into testrangeid,versionid;
4、須要執行的語句(增刪改查):這裏視具體狀況而定
5、釋放遊標:CLOSE 遊標名稱;
注:mysql存儲過程每一句後面必須用;結尾,使用的臨時字段須要在定義遊標以前進行聲明。oop
實例
create procedure user_data(out count int) begin declare user_id int default 1; -- 遊標標識 declare blag int default 1; -- 遊標 declare user_cursor cursor for select data.user_id from mac_user as data; -- 處理not fount的異常 declare continue handler for not found set blag = 0; set count := 0; -- 打開遊標 open user_cursor; -- 執行循環 read_loop:loop -- 獲取遊標中的值 fetch user_cursor into user_id; -- 檢測循環是否 if blag = 0 then -- 跳出循環 leave read_loop; end if; -- if user_id = 1 then set count = count + user_id; -- end if; end loop read_loop; -- 關閉遊標 close cur; end; call user_data(@count); select @count;