日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql游标的用法及作用_Mysql 游标的用法及其作用

發布時間:2025/3/12 数据库 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql游标的用法及作用_Mysql 游标的用法及其作用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

mysql 游標的用法和作用,話不多說,這個是網上看到的例子,簡答粗暴。

例子:

當前有三張表a、b、c其中a和b是一對多關系,b和c是一對多關系,現在需要將b中a表的主鍵存到c中;

常規思路就是將b中查詢出來然后通過一個update語句來更新c表就可以了,但是b表中有2000多條數據,

難道要執行2000多次?顯然是不現實的;最終找到寫一個存儲過程然后通過循環來更新c表,

然而存儲過程中的寫法用的就是游標的形式。

簡介

游標實際上是一種能從包括多條數據記錄的結果集中每次提取一條記錄的機制。

游標充當指針的作用。(有'C'的味道了)

盡管游標能遍歷結果中的所有行,但他一次只指向一行。

游標的作用就是用于對查詢數據庫所返回的記錄進行遍歷,以便進行相應的操作。

用法

一、聲明一個游標: declare 游標名稱 CURSOR for table;(這里的table可以是你查詢出來的任意集合)

二、打開定義的游標:open 游標名稱;

三、獲得下一行數據:FETCH 游標名稱 into testrangeid,versionid;

四、需要執行的語句(增刪 改查):這里視具體情況而定

五、釋放游標:CLOSE 游標名稱;

實例

-

BEGIN

--定義變量

declare?testrangeid?BIGINT;

declare?versionid?BIGINT;

declare?done?int;

--創建游標,并存儲數據

declare?cur_test?CURSOR?for

select?id?as?testrangeid,version_id?as?versionid?from?tp_testrange;

--游標中的內容執行完后將done設置為1

DECLARE?CONTINUE?HANDLER?FOR?NOT?FOUND?SET?done=1;

--打開游標

open?cur_test;

--執行循環

posLoop:LOOP

--判斷是否結束循環

IF?done=1?THEN

LEAVE?posLoop;

END?IF;

--取游標中的值

FETCH?cur_test?into?testrangeid,versionid;

--執行更新操作

update?tp_data_execute?set?version_id=versionid?where?testrange_id?=?testrangeid;

END?LOOP?posLoop;

--釋放游標

CLOSE?cur_test;

END

-

例子2:

--在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是獲取游標當前指向的數據行,并將指針指向下一行,當游標已經指向最后一行時繼續執行會造成游標溢出。

使用loop循環游標時,他本身是不會監控是否到最后一條數據了,像下面代碼這種寫法,就會造成死循環;

read_loop:loop

fetch?cur?into?n,c;

set?total?=?total+c;

end?loop;

在MySql中,造成游標溢出時會引發mysql預定義的NOT FOUND錯誤,所以在上面使用下面的代碼指定了當引發not found錯誤時定義一個continue 的事件,

指定這個事件發生時修改done變量的值。

declare?continue?HANDLER?for?not?found?set?done?=?true;

--判斷游標的循環是否結束

if?done?then

leave?read_loop;?--跳出游標循環

end?if;

如果done的值是true,就結束循環。繼續執行下面的代碼

使用方式

第一種就是上面的實現,使用loop循環;

第二種方式如下,使用while循環:

drop?procedure?if?exists?StatisticStore1;

CREATE?PROCEDURE?StatisticStore1()

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;

fetch?cur?into?n,c;

while(not?done)?do

set?total?=?total?+?c;

fetch?cur?into?n,c;

end?while;

close?cur;

select?total;

END;

call?StatisticStore1();

第三種方式是使用repeat執行:

drop?procedure?if?exists?StatisticStore2;

CREATE?PROCEDURE?StatisticStore2()

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;

repeat

fetch?cur?into?n,c;

if?not?done?then

set?total?=?total?+?c;

end?if;

until?done?end?repeat;

close?cur;

select?total;

END;

call?StatisticStore2();

游標嵌套

在mysql中,每個begin end 塊都是一個獨立的scope區域,由于MySql中同一個error的事件只能定義一次,如果多定義的話在編譯時會提示Duplicate handler declared in the same block。

drop?procedure?if?exists?StatisticStore3;

CREATE?PROCEDURE?StatisticStore3()

BEGIN

declare?_n?varchar(20);

declare?done?int?default?false;

declare?cur?cursor?for?select?name?from?store?group?by?name;

declare?continue?HANDLER?for?not?found?set?done?=?true;

open?cur;

read_loop:loop

fetch?cur?into?_n;

if?done?then

leave?read_loop;

end?if;

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;

iphone_loop:loop

fetch?cur?into?n,c;

if?done?then

leave?iphone_loop;

end?if;

set?total?=?total?+?c;

end?loop;

close?cur;

select?_n,n,total;

end;

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?=?'android';

declare?continue?HANDLER?for?not?found?set?done?=?true;

set?total?=?0;

open?cur;

android_loop:loop

fetch?cur?into?n,c;

if?done?then

leave?android_loop;

end?if;

set?total?=?total?+?c;

end?loop;

close?cur;

select?_n,n,total;

end;

begin

end;

end?loop;

close?cur;

END;

call?StatisticStore3();

動態SQL

Mysql 支持動態SQL的功能

set?@sqlStr='select?*?from?table?where?condition1?=??';

prepare?s1?for?@sqlStr;

--如果有多個參數用逗號分隔

execute?s1?using?@condition1;

--手工釋放,或者是?connection?關閉時,?server?自動回收

deallocate?prepare?s1;

總結

以上是生活随笔為你收集整理的mysql游标的用法及作用_Mysql 游标的用法及其作用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 中文字幕乱妇无码av在线 | 97国产一区 | www.亚洲| 国产欧美日韩成人 | 麻豆视频二区 | 深夜福利成人 | 亚洲欧美韩日 | 一边摸一边抽搐一进一出视频 | 黄色专区| 色婷婷av一区二区三区之红樱桃 | 欧美成人精品欧美一级 | 国产精品久久久久一区二区 | gai免费观看网站外网 | 成年视频在线观看 | 麻豆视频在线免费观看 | 日本视频免费观看 | a一级黄色 | 亚洲自拍色 | 天天色天天射天天干 | 男人的天堂在线视频 | 都市激情校园春色 | 女警白嫩翘臀呻吟迎合 | 97超碰导航| 私人av| 国产精品三级电影 | 麻豆视频免费在线 | 在线观看色网站 | 天堂资源在线 | 国产女教师一区二区三区 | 欧美z○zo重口另类黄 | 日韩精品一区二区三区在线播放 | 国产精品第一国产精品 | 99国产精品久久久久久久久久久 | 午夜成人免费视频 | 2019av视频| 有机z中国电影免费观看 | 久久香视频 | 日韩一级在线观看 | 国产综合欧美 | 日本欧美国产一区二区三区 | 免费99精品国产自在在线 | 网站久久久 | 日韩免费播放 | 国产精品88久久久久久妇女 | 欧美日在线 | 国产精品熟女视频 | 金8天国av| 特级西西444www高清大胆 | 后进极品白嫩翘臀在线视频 | 少妇无码一区二区三区 | 美女扒开内裤让男人捅 | 肉丝肉足丝袜一区二区三区 | 自拍偷拍亚洲 | 西西午夜| 天堂综合网久久 | 91av在线免费视频 | av日韩不卡 | 亚洲阿v天堂 | 99这里有精品 | 日本精品一区在线 | 成人免费大片黄在线播放 | 国产无遮挡裸体免费视频 | 最近中文字幕在线观看视频 | 日韩爱爱免费视频 | 免费吃奶摸下激烈视频 | 亚洲伦理一区 | 亚洲欧洲中文 | 久久精品福利视频 | 国产第一毛片 | 粉色视频网站 | 国产乱码久久久 | 国产精品综合久久久 | 中日韩免费视频 | 中文字幕+乱码+中文字幕一区 | 欧美精品四区 | 亚洲自拍偷拍第一页 | 欧美日韩色综合 | 人人插人人看 | 亚洲一区二区在线免费 | 日本中文字幕有码 | 国产精品精品视频 | 深夜激情影院 | 国产精品麻豆欧美日韩ww | www.亚洲天堂.com | 精品人妻一区二区三区四区久久 | 免费亚洲网站 | 久久久久中文字幕 | 久草久草| 少妇性l交大片7724com | 免费福利视频网站 | 欧美午夜精品久久久久久浪潮 | 日本黄色高清 | 99热99re6国产在线播放 | 美女毛片| 国产欧美一区二区三区在线看蜜臀 | 99热精品国产 | 久久久夜色精品亚洲 | 人妻换人妻a片爽麻豆 | 中国亚洲老头同性gay男男… |