-- MySQL中的三中循環 while 、 loop 、repeat 求 1-n 的和 -- 第一種 while 循環 -- 求 1-n 的和 /* while循環語法: while 條件 DO 循環體; end while; */ -- 實例: create procedure sum1(a int) begin declare sum int default 0; -- default 是指定該變量的默認值 declare i int default 1; while i<=a DO -- 循環開始 set sum=sum+i; set i=i+1; end while; -- 循環結束 select sum; -- 輸出結果 end -- 執行存儲過程 call sum1(100); -- 刪除存儲過程 drop procedure if exists sum1 -- 第二種 loop 循環 /*loop 循環語法: loop_name:loop if 條件 THEN -- 知足條件時離開循環 leave loop_name; -- 和 break 差很少都是結束訓話 end if; end loop; */ -- 實例: create procedure sum2(a int) begin declare sum int default 0; declare i int default 1; loop_name:loop -- 循環開始 if i>a then leave loop_name; -- 判斷條件成立則結束循環 比如java中的 boeak end if; set sum=sum+i; set i=i+1; end loop; -- 循環結束 select sum; -- 輸出結果 end -- 執行存儲過程 call sum2(100); -- 刪除存儲過程 drop procedure if exists sum2 -- 第三種 repeat 循環 /*repeat 循環語法 repeat 循環體 until 條件 end repeat; */ -- 實例; create procedure sum3(a int) begin declare sum int default 0; declare i int default 1; repeat -- 循環開始 set sum=sum+i; set i=i+1; until i>a end repeat; -- 循環結束 select sum; -- 輸出結果 end -- 執行存儲過程 call sum3(100); -- 刪除存儲過程 drop procedure if exists sum3
-- 存儲過程 加 遊標 -- 建表 create table student( sid varchar(8) primary key, sname varchar(10), sex varchar(2), age int, classno varchar(6) ); -- 表中的數據 insert into student values ('20170101','張石瑞','男','19','201701'), ('20170201','李佛','女','20','201702'), ('20170202','王法無','男','19','201702') /* 建立遊標和關閉遊標的四個步驟 -- 一、建立遊標 (cur_name 遊標名字) declare cur_name cursor for select 語句; -- 二、打開遊標 open cur_name; -- 三、提取遊標數據 fetch cur_name [into 變量1,變量2,、、、、、]; -- 四、關閉(釋放)遊標 close cur_name; */ -- 遊標的基本提取操做 create PROCEDURE proc1() BEGIN declare cur_sid varchar(20); declare cur_sname varchar(20); declare cur_sex varchar(20); declare cur_age varchar(20); declare cur_classno varchar(20); -- 一、 declare student_cur1 CURSOR for select sid,sname,sex,age,classno from student; -- 二、 open student_cur1; -- 三、 fetch student_cur1 into cur_sid,cur_sname,cur_sex,cur_age,cur_classno; select cur_sid,cur_sname,cur_sex,cur_age,cur_classno; -- 四、 close student_cur1; END -- 執行存儲過程 call proc1(); -- 刪除存儲過程 drop procedure if exists proc1 -- 遊標的循環遍歷‘ create PROCEDURE proc2() BEGIN declare cur_sid varchar(20); declare cur_sname varchar(20); declare cur_sex varchar(20); declare cur_age varchar(20); declare cur_classno varchar(20); declare sum int default 0; declare i int default 0; -- 一、 declare student_cur1 CURSOR for select sid,sname,sex,age,classno from student; -- 二、 open student_cur1; -- 三、 最簡單的 while 遍歷方法 select count(sid) into sum from student; while i<sum DO fetch student_cur1 into cur_sid,cur_sname,cur_sex,cur_age,cur_classno; select cur_sid,cur_sname,cur_sex,cur_age,cur_classno; set i=i+1; end while; -- 四、 close student_cur1; END -- 執行存儲過程 call proc2(); -- 刪除存儲過程 drop procedure if exists proc2 -- 使用 loop 遍歷遊標 create PROCEDURE proc3() BEGIN declare cur_sid varchar(20); declare cur_sname varchar(20); declare cur_sex varchar(20); declare cur_age varchar(20); declare cur_classno varchar(20); declare state int default false; -- 定義表示用於判斷遊標是否溢出 -- 一、 declare student_cur1 CURSOR for select sid,sname,sex,age,classno from student; -- 二、 open student_cur1; -- 三、 loop 遍歷遊標 cur_loop:loop -- 循環開始 -- 循環開始的時候提取一次 fetch student_cur1 into cur_sid,cur_sname,cur_sex,cur_age,cur_classno; select cur_sid,cur_sname,cur_sex,cur_age,cur_classno; if state then leave cur_loop; end if; end loop; -- 循環結束 -- 四、 close student_cur1; END -- 執行存儲過程 call proc3() -- 刪除存儲過程 drop procedure if exists proc3 /* 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; 也有這樣寫的 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' set done = true; 因此在循環時加上了下面這句代碼: --判斷遊標的循環是否結束 if done then leave read_loop; --跳出遊標循環 end if; 若是done的值是true,就結束循環。繼續執行下面的代碼。 */ -- 性別翻轉 create PROCEDURE proc4() BEGIN declare cur_sid int; declare cur_sex varchar(1); declare state int default false; -- 一、 declare sex_cur cursor for select sid,sex from student; -- declare CONTINUE HANDLER for not found set state=true; -- 二、 open sex_cur; -- 三、 sex_loop:LOOP -- 循環開始 fetch sex_cur into cur_sid,cur_sex; if state then leave sex_loop; end if; if cur_sex='男' then update student set sex='女' where sid=cur_sid; end if; if cur_sex='女' then update student set sex='男' where sid=cur_sid; end if; end loop; -- 循環結束 -- 四、 close sex_cur; END -- 執行存儲過程 call proc4() -- 刪除存儲過程 drop procedure if exists proc4 -- 表的查詢 select * from student