概念遊標(Cursor)它使使用者可逐行訪問由SQLServer返回的結果集。使用遊標(cursor)的一個主要的原因就是把集合操作轉換成單個記錄處理方式。用SQL語言從資料庫中檢索資料後
2021-07-22 03:02:18
遊標(Cursor)它使使用者可逐行訪問由SQLServer返回的結果集。
使用遊標(cursor)的一個主要的原因就是把集合操作轉換成單個記錄處理方式。
用SQL語言從資料庫中檢索資料後,結果放在記憶體的一塊區域中,且結果往往是一個含有多個記錄的集合。
遊標機制允許使用者在SQLserver內逐行地訪問這些記錄,按照使用者自己的意願來顯示和處理這些記錄。
1、允許程式對由查詢語句select返回的行集合中的每一行執行相同或不同的操作,而不是對整個行集合執行同一個操作。
2、提供對基於遊標位置的表中的行進行刪除和更新的能力。
3、遊標實際上作為面向集合的資料庫管理系統(RDBMS)和麵向行的程式設計之間的橋樑,使這兩種處理方式通過遊標溝通起來。
1.1 如果你前面看過mysql函數,會發現無法使用返回多行結果的語句。但如果你又確實想要使用時,就需要使用到遊標,遊標可以幫你選擇出某個結果(這樣就可以做到返回單個結果)。
1.2 使用遊標也可以輕易的取出在檢索出來的行中前進或後退一行或多行的結果。
1.3 遊標可以遍歷返回的多行結果。
1.4 Mysql中游標只適用於儲存過程以及函數。
1.定義遊標:declare 遊標名 cursor for select語句;
2.開啟遊標:open 遊標名;
獲取結果:fetch 遊標名 into 變數名[,變數名];
關閉遊標:close 遊標名;
--在windows系統中寫儲存過程時,如果需要使用declare聲明變數,需要新增這個關鍵字,否則會報錯。
delimiter //
drop procedure if exists StatisticStore;
CREATE PROCEDURE StatisticStore()
BEGIN
--創建接收遊標資料的變數
declare c int;
declare n varchar(20);
--創建總數變數
declare total int default 0;
--創建結束標誌變數
declare done int default false;
--創建遊標
declare cur cursor for select name,count from store where name = 'iphone';
--指定遊標迴圈結束時的返回值
declare continue HANDLER for not found set done = true;
--設定初始值
set total = 0;
--開啟遊標
open cur;
--開始循環遊標裡的資料
read_loop:loop
--根據遊標當前指向的一條資料
fetch cur into n,c;
--判斷遊標的迴圈是否結束
if done then
leave read_loop; --跳出遊標迴圈
end if;
--獲取一條資料時,將count值進行累加操作,這裡可以做任意你想做的操作,
set total = total + c;
--結束遊標迴圈
end loop;
--關閉遊標
close cur;
--輸出結果
select total;
END;
--呼叫儲存過程
call StatisticStore();
fetch是獲取遊標當前指向的資料行,並將指針指向下一行,當遊標已經指向最後一行時繼續執行會造成遊標溢位,可以定義一個變數來控制越界。如:
declare continue handler
例項:
declare continue handler for NOT FOUND statement;
遊標迴圈例項:
首先應該創建遊標,然後開啟遊標後,應先手動進行fetch操作獲取到一行資料,然後再通過迴圈,在迴圈裡先做處理內容,後進行fetch操作。這樣如果在手動獲取資料的期間就沒有獲得到資料的話,就會執行have = 0,如果是repeat迴圈,然後進入repeat迴圈,先輸出null資料,最後有進行獲取,這樣運行到until時就會退出迴圈;如果是while迴圈,壓根就不進去while迴圈裡,就不會有任何1行輸出。
repeat迴圈:
create procedure p17()
begin
declare row_gid int;
declare row_name varchar(20);
declare row_num int;
declare have int default 1;
declare getgoods cursor for select gid,name,num from goods where 0;
declare continue handler for NOT FOUND set have:= 0;
open getgoods;
fetch getgoods into row_gid,row_name,row_num;
repeat
select row_name,row_num;
fetch getgoods into row_gid,row_name,row_num;
until have = 0 end repeat;
close getgoods;
end$
while迴圈:
create procedure p18()
begin
declare row_gid int;
declare row_name varchar(20);
declare row_num int;
declare have int default 1;
declare getgoods cursor for select gid,name,num from goods where 0;
declare continue handler for NOT FOUND set have:= 0;
open getgoods;
fetch getgoods into row_gid,row_name,row_num;
while have = 1 do
select row_name,row_num;
fetch getgoods into row_gid,row_name,row_num;
end while;
close getgoods;
end$
好了,關於Mysql遊標的定義與使用就給大家介紹這麼多,希望對大家有所幫助!
相關文章
概念遊標(Cursor)它使使用者可逐行訪問由SQLServer返回的結果集。使用遊標(cursor)的一個主要的原因就是把集合操作轉換成單個記錄處理方式。用SQL語言從資料庫中檢索資料後
2021-07-22 03:02:18
iOS14.7 漏洞蘋果昨天釋出了 iOS14.7 正式版之後,有使用者發現自己的 iPhone 無法正常解鎖 Apple Watch 了。在之前,Apple Watch 設定了密碼之後,使用者是可以通過 iPhone 解鎖
2021-07-22 03:02:12
今天realme釋出了真我GT大師版和GT大師探索版,售價是2399元起步,而真我GT大師探索版價格稍微貴一些,首發價2799元起,價效比還是不錯的。在釋出會上,realme CMO徐起表示,realme全球
2021-07-22 03:02:05
【7月21日訊】相信大家都知道,自從華為遭受到「晶片禁令」以後,也是讓華為海思晶片、手機業務遭受到了重創,同時還限制了華為採購第三方晶片產品,直接導致華為多款旗艦機型因為
2021-07-22 03:01:56
蘋果近日悄無聲息地上架了一款「MagSafe 外接電池」,售價 749 人民幣。教授仔細查看了相關參數,發現了這款新品的亮點和槽點都著實不小。下面就讓教授細細講來~先來講講,為什麼
2021-07-22 03:01:45
特粉之家專注於分享特斯拉相關資訊,敬請關注!近日,特斯拉執行長埃隆馬斯克在其個人社交平臺上發文稱:今年晚些時候,特斯拉將計劃向其他電動汽車開放超級充電網路。隨後他還補充道
2021-07-22 03:01:38