同编写程序类似,存储过程中也有对应的条件判断,功能类似于if、switch。在MySql里面对应的是IF和CASE
1、IF判断
IF判断的格式是这样的:
- IF expression THEN commands
- [ELSEIF expression THEN commands]
- [ELSE commands]
- END IF;
然后下面是我们的存储过程:
存储过程的话有两个输入参数,第一个isTaxed表示是不是要带税价格,第二个是产品的名称;在存储过程里面定义了两个变量,finalPrice用来保存价格,而taxRate表示税率。这里代码比较简单,就是判断下如果是要加税,就把原来的价格乘上税率。下面是测试结果:
true的情况表示是带税的价格。好了这个是使用IF的一个例子,下面看看CASE;
2、CASE的使用
同编程里面的那个switch ....case.....类似,使用CASE同编程一样也是当判断比较多时便于阅读和维护,我们也来看下CASE的语法:
下面我们假设不同类型的商品对应的税收税率是不一样的情况来看个例子,这里假设甜点的税率是0.05,奶制品的是0.1,家具类的是0.2:,下面是存储过程:
上面增加了一个保存产品类型的一个变量proType,用来保存商品类型。然后使用CASE来进行判断来设置税率,下面是测试的部分:
可以看到沙发的价格是1250*1.2=1500,而蛋糕的价格是10*1.05 = 10.5
在MySql的存储过程中可使用的循环有三种:WHILE、REPEAT、LOOP
1、WHILE
WHILE的格式是这样的:
- WHILE expression DO
- Statements
- END WHILE
- DELIMITER $$
- DROP PROCEDURE IF EXISTS `test`.`WhileLoopProc` $$
- CREATE PROCEDURE `test`.`WhileLoopProc` ()
- BEGIN
- DECLARE x INT;
- DECLARE str VARCHAR(255);
- SET x = 1;
- SET str = '';
- WHILE x <= 5 DO
- SET str = CONCAT(str,x,',');
- SET x = x + 1;
- END WHILE;
- SELECT str;
- END $$
- DELIMITER ;
2、REPEAT
REPEAT的格式是这样的:
- REPEAT
- Statements;
- UNTIL expression
- END REPEAT
3、LOOP 及 LEAVE、ITERATE
这里LOOP用来标记循环;而LEAVE表示离开循环,好比编程里面的break一样;ITERATE则继续循环,类型与编程里面的continue。
- DELIMITER $$
- DROP PROCEDURE IF EXISTS `test`.`LoopProc` $$
- CREATE PROCEDURE `test`.`LoopProc` ()
- BEGIN
- DECLARE x INT;
- DECLARE str VARCHAR(255);
- SET x = 1;
- SET str = '';
- loop_label: LOOP
- IF x > 10 THEN
- LEAVE loop_label;
- END IF;
- SET x = x + 1;
- IF (x mod 2) THEN
- ITERATE loop_label;
- ELSE
- SET str = CONCAT(str,x,',');
- END IF;
- END LOOP;
- SELECT str;
- END $$
- DELIMITER ;