国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

mysql存儲過程 游標 循環使用介紹

2024-07-24 12:48:58
字體:
來源:轉載
供稿:網友
Mysql的存儲過程是從版本5才開始支持的,所以目前一般使用的都可以用到存儲過程。今天分享下自己對于Mysql存儲過程的認識與了解。

一些簡單的調用以及語法規則這里就不在贅述,網上有許多例子。這里主要說說大家常用的游標加循環的嵌套使用。
首先先介紹循環的分類:
(1)WHILE ... END WHILE
(2)LOOP ... END LOOP
(3)REPEAT ... END REPEAT
(4)GOTO
這里有三種標準的循環方式:WHILE循環,LOOP循環以及REPEAT循環。還有一種非標準的循環方式:GOTO(不做介紹)。
(1)WHILE ... END WHILE
復制代碼 代碼如下:

CREATE PROCEDURE p14()
BEGIN
DECLARE v INT;
SET v = 0;
WHILE v < 5 DO
INSERT INTO t VALUES (v);
SET v = v + 1;
END WHILE;
END;

這是WHILE循環的方式。它跟IF語句相似,使用"SET v = 0;"語句使為了防止一個常見的錯誤,如果沒有初始化,默認變量值為NULL,而NULL和任何值操作結果都為NULL。
(2)REPEAT ... END REPEAT
復制代碼 代碼如下:

CREATE PROCEDURE p15 ()
BEGIN
DECLARE v INT;
SET v = 0;
REPEAT
INSERT INTO t VALUES (v);
SET v = v + 1;
UNTIL v >= 5
END REPEAT;
END;

這是REPEAT循環的例子,功能和前面WHILE循環一樣。區別在于它在執行后檢查結果,而WHILE則是執行前檢查。類似于do while語句。注意到UNTIL語句后面沒有分號,在這里可以不寫分號,當然你加上額外的分號更好。
(3)LOOP ... END LOOP
復制代碼 代碼如下:

CREATE PROCEDURE p16 ()
BEGIN
DECLARE v INT;
SET v = 0;
loop_label: LOOP
INSERT INTO t VALUES (v);
SET v = v + 1;
IF v >= 5 THEN
LEAVE loop_label;
END IF;
END LOOP;
END;

以上是LOOP循環的例子。LOOP循環不需要初始條件,這點和WHILE循環相似,同時它又和REPEAT循環一樣也不需要結束條件。
ITERATE 迭代
如果目標是ITERATE(迭代)語句的話,就必須用到LEAVE語句
復制代碼 代碼如下:

CREATE PROCEDURE p20 ()
BEGIN
DECLARE v INT;
SET v = 0;
loop_label: LOOP
IF v = 3 THEN
SET v = v + 1;
ITERATE loop_label;
END IF;
INSERT INTO t VALUES (v);
SET v = v + 1;
IF v >= 5 THEN
LEAVE loop_label;
END IF;
END LOOP;
END;

ITERATE(迭代)語句和LEAVE語句一樣也是在循環內部的循環引用, 它有點像C語言中 的“Continue”,同樣它可以出現在復合語句中,引用復合語句標號,ITERATE(迭代)意思 是重新開始復合語句。
以上是對于循環的幾種情況的介紹。接著就是介紹一個帶游標的例子來詳細解釋。
復制代碼 代碼如下:

begin
declare p_feeCode varchar(20);
declare p_feeName varchar(20);
declare p_billMoney float(12);
declare p_schemeMoney float(12);
declare allMoney float(10);
declare allUsedMoney float(10);
declare p_year varchar(50);
declare p_totalCompeleteRate float(12);
declare done int(10);
declare flag int(2);
declare feeCodeCursor cursor for select feeCode from fee;//申明一個游標變量
declare continue handler for not found set done=1;//申明循環結束的標志位
set done=0;
select date_format(now(),'%Y') into p_year;
open feeCodeCursor;//打開游標
loop_label:LOOP
fetch feeCodeCursor into p_feeCode;//將游標插入申明的變量
if done = 1 then
leave loop_label;
else
set flag = 0;
end if;
set p_schemeMoney=0;
set p_billMoney = 0;
select feeName into p_feeName from fee where feeCode=p_feeCode;
select sum(billMoney) into p_billMoney from bill_data where feeCode=p_feeCode and billDate like Concat(p_year, '%');
select schemeMoney into p_schemeMoney from total_scheme where feeCode=p_feeCode and schemeDate like Concat(p_year, '%') limit 1;
if flag = 0 then
set done = 0;
end if;
if p_schemeMoney=0 then
set p_totalCompeleteRate=-1.0;
else
set p_totalCompeleteRate=(1.0*p_billMoney)/p_schemeMoney;
end if;
insert into total_summary values(p_feeCode,p_feeName,p_year,p_billMoney,p_totalCompeleteRate);
commit;
end LOOP;
close feeCodeCursor;//循環結束后需要關閉游標
end
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 辽宁省| 徐州市| 连平县| 新疆| 洪江市| 阿克苏市| 灌阳县| 林甸县| 波密县| 彭州市| 介休市| 大埔县| 安龙县| 龙山县| 宁乡县| 永丰县| 卓资县| 中山市| 延安市| 屯昌县| 禄劝| 荣成市| 迁西县| 云梦县| 阿坝县| 平凉市| 平陆县| 明星| 无为县| 黄龙县| 巩义市| 巴彦淖尔市| 湘阴县| 玉山县| 贺兰县| 洮南市| 赣榆县| 阳山县| 胶南市| 于都县| 饶河县|