一些簡單的調用以及語法規則這里就不在贅述,網上有許多例子。這里主要說說大家常用的游標加循環的嵌套使用。 首先先介紹循環的分類: (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;
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;
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