同编写程序类似,存储过程中也有对应的条件判断,功能类似于if、switch。在MySql里面对应的是IF和CASE

1、IF判断

IF判断的格式是这样的:

1. IF expression THEN commands  
2. THEN commands]  
3. ELSE commands]  
4. END IF;


这里expression是我们的判断表达式;ELSE IF 和ELSE都是可选的;command就是当条件为真(true为1,false为0)时执行的命令。比如我们设计一个存储过程用于返回商品的价格,这里价格通过传入的参数来判断是要带税收的价格还是没有带税收的价格。先看看表的数据:

mysql 存储过程 判断时间 mysql存储过程条件判断_条件判断

然后下面是我们的存储过程:

mysql 存储过程 判断时间 mysql存储过程条件判断_条件判断_02

存储过程的话有两个输入参数,第一个isTaxed表示是不是要带税价格,第二个是产品的名称;在存储过程里面定义了两个变量,finalPrice用来保存价格,而taxRate表示税率。这里代码比较简单,就是判断下如果是要加税,就把原来的价格乘上税率。下面是测试结果:


mysql 存储过程 判断时间 mysql存储过程条件判断_mysql 存储过程 判断时间_03

mysql 存储过程 判断时间 mysql存储过程条件判断_存储过程_04

true的情况表示是带税的价格。好了这个是使用IF的一个例子,下面看看CASE;

2、CASE的使用

同编程里面的那个switch ....case.....类似,使用CASE同编程一样也是当判断比较多时便于阅读和维护,我们也来看下CASE的语法:

下面我们假设不同类型的商品对应的税收税率是不一样的情况来看个例子,这里假设甜点的税率是0.05,奶制品的是0.1,家具类的是0.2:,下面是存储过程:

mysql 存储过程 判断时间 mysql存储过程条件判断_存储过程_05


 

上面增加了一个保存产品类型的一个变量proType,用来保存商品类型。然后使用CASE来进行判断来设置税率,下面是测试的部分:

可以看到沙发的价格是1250*1.2=1500,而蛋糕的价格是10*1.05 = 10.5

mysql 存储过程 判断时间 mysql存储过程条件判断_mysql 存储过程 判断时间_06


mysql 存储过程 判断时间 mysql存储过程条件判断_条件判断_07


在MySql的存储过程中可使用的循环有三种:WHILE、REPEAT、LOOP

1、WHILE

WHILE的格式是这样的:

1. WHILE expression DO  
2.    Statements  
3. END WHILE

下面是个例子

1. DELIMITER $$  
2.   
3. DROP PROCEDURE IF EXISTS `test`.`WhileLoopProc` $$  
4. CREATE PROCEDURE `test`.`WhileLoopProc` ()  
5. BEGIN  
6. DECLARE x  INT;  
7. DECLARE str  VARCHAR(255);  
8. SET x = 1;  
9. SET str =  '';  
10.  WHILE x  <= 5 DO  
11. SET  str = CONCAT(str,x,',');  
12. SET  x = x + 1;  
13. END WHILE;  
14. SELECT str;  
15. END $$  
16.   
17. DELIMITER ;

上面的例子最后输出“1,2,3,4,5,”这样的字符。


2、REPEAT

REPEAT的格式是这样的:

1. REPEAT  
2. Statements;  
3. UNTIL expression  
4. END REPEAT

REPEAT好比我们编程里面的do...while一样。这边例子就不举了,同上面的类似。


3、LOOP 及 LEAVE、ITERATE

这里LOOP用来标记循环;而LEAVE表示离开循环,好比编程里面的break一样;ITERATE则继续循环,类型与编程里面的continue。

1. DELIMITER $$  
2.   
3. DROP PROCEDURE IF EXISTS `test`.`LoopProc` $$  
4. CREATE PROCEDURE `test`.`LoopProc` ()  
5. BEGIN  
6. DECLARE x  INT;  
7. DECLARE str  VARCHAR(255);  
8. SET x = 1;  
9. SET str =  '';  
10. loop_label:  LOOP  
11. THEN  
12.    LEAVE  loop_label;  
13. END  IF;  
14. SET  x = x + 1;  
15. THEN  
16.    ITERATE  loop_label;  
17. ELSE  
18. SET  str = CONCAT(str,x,',');  
19. END  IF;  
20.   
21. END LOOP;  
22. SELECT str;  
23. END $$  
24.   
25. DELIMITER ;

上面代码输出10以内的偶数,用逗号分隔。这里注意到x>10的时候就LEAVE掉,如果遇到奇数则ITERATE,奇数对2取模为1,表示true