国产探花免费观看_亚洲丰满少妇自慰呻吟_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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 巴青县| 柘荣县| 博兴县| 平昌县| 吉首市| 黑山县| 措勤县| 玉树县| 荣昌县| 古交市| 平潭县| 姜堰市| 南丰县| 日照市| 沧州市| 高密市| 克山县| 曲阜市| 桐梓县| 武义县| 河北区| 临邑县| 五家渠市| 宁城县| 寿阳县| 鹤山市| 阿拉尔市| 玉龙| 碌曲县| 绍兴市| 云和县| 嵊州市| 黔西| 昭觉县| 达州市| 柳江县| 新疆| 上虞市| 台山市| 营山县| 洛浦县|