使用游標(biāo)(cursor)
成都創(chuàng)新互聯(lián)公司是專業(yè)的鄂溫克網(wǎng)站建設(shè)公司,鄂溫克接單;提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行鄂溫克網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
1.聲明游標(biāo)
DECLARE cursor_name CURSOR FOR select_statement
這個語句聲明一個游標(biāo)。也可以在子程序中定義多個游標(biāo),但是一個塊中的每一個游標(biāo)必須有唯一的名字。聲明游標(biāo)后也是單條操作的,但是不能用SELECT語句不能有INTO子句。
2. 游標(biāo)OPEN語句
OPEN cursor_name
這個語句打開先前聲明的游標(biāo)。
3. 游標(biāo)FETCH語句
FETCH cursor_name INTO var_name [, var_name] ...
這個語句用指定的打開游標(biāo)讀取下一行(如果有下一行的話),并且前進(jìn)游標(biāo)指針。
4. 游標(biāo)CLOSE語句
CLOSE cursor_name
這個語句關(guān)閉先前打開的游標(biāo)。
寫之前查了好多資料但是總是執(zhí)行不了,后來自琢磨了一下,寫了個例子,經(jīng)過測試完全正確。
下面是創(chuàng)建存儲過程,使用游標(biāo)循環(huán)更新操作的例子:
?
CREATE PROCEDURE `my`()
BEGIN
? ? /*局部變量的定義 declare*/
? declare aid bigint default 0 ;
? declare mdsl bigint default 0;
? declare stop int default 0;
? declare cur CURSOR FOR (select? count(area_tb.id)? as mdsl, area_tb.id as aid from area_tb right join subbranch_tb on subbranch_tb.i_subbran_area=area_tb.id
where area_tb.i_record_status=0 and subbranch_tb.i_record_status=0 group by area_tb.id);
?
?declare CONTINUE HANDLER FOR SQLSTATE '02000' SET stop = null;
? /*開游標(biāo)*/
OPEN cur;
/*游標(biāo)向下走一步,將查詢出來的兩個值付給定義的兩個變量*/
FETCH cur INTO mdsl,aid;
/* 循環(huán)體 這很明顯 把游標(biāo)查詢出的 name 都加起并用 ; 號隔開 */
WHILE ( stop is not null) DO
update area_tb set? i_subbran_count=mdsl where id = aid ;
/*游標(biāo)向下走一步*/
FETCH cur INTO mdsl,aid;
END WHILE;
CLOSE cur;
END;
最后別忘了:給連接數(shù)據(jù)庫的用戶授予執(zhí)行存儲過程的權(quán)限
grant execute on procedure yunzuche.myupdate to '用戶名'@'%';
歡迎工作一到五年的Java工程師朋友們加入Java技術(shù)交流群:659270626
群內(nèi)提供免費(fèi)的Java架構(gòu)學(xué)習(xí)資料(里面有高可用、高并發(fā)、高性能及分布式、Jvm性能調(diào)優(yōu)、Spring源碼,MyBatis,Netty,redis,Kafka,MySQL,Zookeeper,Tomcat,Docker,Dubbo,Nginx和大數(shù)據(jù)等多個知識點(diǎn)的架構(gòu)資料)合理利用自己每一分每一秒的時間來學(xué)習(xí)提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!
?