MySQL 中的三中循環 while loop repeat 的基本用法


-- 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')

/* 創建游標和關閉游標的四個步驟
-- 1、創建游標  (cur_name 游標名字)
declare cur_name cursor for select 語句;
-- 2、打開游標
open cur_name;
-- 3、提取游標數據
fetch cur_name [into 變量1,變量2,、、、、、];
-- 4、關閉(釋放)游標
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);
-- 1、
declare student_cur1 CURSOR for
select sid,sname,sex,age,classno from student;
-- 2、
open student_cur1;
-- 3、
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;
-- 4、
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;
-- 1、
declare student_cur1 CURSOR for
select sid,sname,sex,age,classno from student;
-- 2、
open student_cur1;
-- 3、 最簡單的  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;
-- 4、
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; -- 定義表示用於判斷游標是否溢出
-- 1、
declare student_cur1 CURSOR for
select sid,sname,sex,age,classno from student;
-- 2、
open student_cur1;
-- 3、 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; -- 循環結束
-- 4、
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;
-- 1、
declare sex_cur cursor for select sid,sex from student;
-- 
declare CONTINUE HANDLER for not found set state=true;
-- 2、
open sex_cur;
-- 3、
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; -- 循環結束
-- 4、
close sex_cur;
END






-- 執行存儲過程
call proc4()
-- 刪除存儲過程
drop procedure if exists proc4





-- 表的查詢
select * from student

http://www.cnblogs.com/Lvhengshuai/category/997161.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM