(1). 变量作用域
内部的变量在其作用域范围内享有更高的优先权,当执行到end。变量时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储
过程外再也不能找到这个申明的变量,但是你可以通过out参数或者将其值指派
给会话变量来保存其值。
1. mysql > DELIMITER //
2. mysql > CREATE PROCEDURE proc3()
3. -> begin
4. -> declare x1 varchar(5) default 'outer';
5. -> begin
6. -> declare x1 varchar(5) default 'inner';
7. -> select x1;
8. -> end;
9. -> select x1;
10. -> end;
11. -> //
12. mysql > DELIMITER ;
(2). 条件语句
Ⅰ. if-then -else语句
1. mysql > DELIMITER // 2. mysql > CREATE PROCEDURE proc2(IN parameter int) 3. -> begin 4. -> declare var int; 5. -> set var=parameter+1; 6. -> if var=0 then 7. -> insert into t values(17); 8. -> end if; 9. -> if parameter=0 then 10. -> update t set s1=s1+1; 11. -> else 12. -> update t set s1=s1+2; 13. -> end if; 14. -> end; 15. -> // 16. mysql > DELIMITER ;
Ⅱ. case语句:
1. mysql > DELIMITER // 2. mysql > CREATE PROCEDURE proc3 (in parameter int) 3. -> begin 4. -> declare var int; 5. -> set var=parameter+1; 6. -> case var 7. -> when 0 then 8. -> insert into t values(17); 9. -> when 1 then 10. -> insert into t values(18); 11. -> else 12. -> insert into t values(19); 13. -> end case; 14. -> end; 15. -> // 16. mysql > DELIMITER ;
case when var=0 then insert into t values(30); when var>0 then when var<0 then else end case
(3). 循环语句
Ⅰ. while ···· end while:
1. mysql > DELIMITER // 2. mysql > CREATE PROCEDURE proc4() 3. -> begin 4. -> declare var int; 5. -> set var=0; 6. -> while var<6 do 7. -> insert into t values(var); 8. -> set var=var+1; 9. -> end while; 10. -> end; 11. -> // 12. mysql > DELIMITER ;
while 条件 do
--循环体
end while
Ⅱ. repeat···· end repeat:
它在执行操作后检查结果,而while则是执行前进行检查。
1. mysql > DELIMITER // 2. mysql > CREATE PROCEDURE proc5 () 3. -> begin 4. -> declare v int; 5. -> set v=0; 6. -> repeat 7. -> insert into t values(v); 8. -> set v=v+1; 9. -> until v>=5 10. -> end repeat; 11. -> end; 12. -> // 13. mysql > DELIMITER ;
repeat
--循环体
until 循环条件
end repeat;
Ⅲ. loop ·····end loop:
loop循环不需要初始条件,这点和while 循环相似,同时和repeat循环一样不需要结束条件, leave语句的意义是离开循环。
1. mysql > DELIMITER // 2. mysql > CREATE PROCEDURE proc6 () 3. -> begin 4. -> declare v int; 5. -> set v=0; 6. -> LOOP_LABLE:loop 7. -> insert into t values(v); 8. -> set v=v+1; 9. -> if v >=5 then 10. -> leave LOOP_LABLE; 11. -> end if; 12. -> end loop; 13. -> end; 14. -> // 15. mysql > DELIMITER ;
Ⅳ. LABLES 标号:
标号可以用在begin repeat while 或者loop 语句前,语句标号只能在合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步。
(4). ITERATE迭代
Ⅰ. ITERATE:
1. 通过引用复合语句的标号,来从新开始复合语句
2. mysql > DELIMITER // 3. mysql > CREATE PROCEDURE proc10 () 4. -> begin 5. -> declare v int; 6. -> set v=0; 7. -> LOOP_LABLE:loop 8. -> if v=3 then 9. -> set v=v+1; 10. -> ITERATE LOOP_LABLE; 11. -> end if; 12. -> insert into t values(v); 13. -> set v=v+1; 14. -> if v>=5 then 15. -> leave LOOP_LABLE; 16. -> end if; 17. -> end loop; 18. -> end; 19. -> // 20. mysql > DELIMITER ;