首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > Mysql >

Mysql 存储过程二

2013-09-04 
Mysql 存储过程24,if 多条件分支? select * from customer? mysql select * from customer+----+-------

Mysql 存储过程2

4,if 多条件分支

? select * from customer;

? mysql> select * from customer

+----+--------+----------+

| id | name ? | password |

+----+--------+----------+

| ?2 | lijuan | lijuan ? |

| ?3 | 陈超阳 | 陈超阳 ? |

| ?4 | 张三 ? | 张三 ? ? |

| ?5 | 张三 ? | 张三 ? ? |

| ?6 | 李四 ? | 李四 ? ? |

+----+--------+----------+

5 rows in set (0.04 sec)

? create procedure sp_search_customer6(in mycondition int)

? begin

? ? ?if mycondition > 0 then

? ? ? ? ?select * from customer where name = '陈超阳';

? ? ?elseif mycondition > 1 ? ?then

? ? ? ? ?select * from customer where name = '张三';

? ? ?elseif mycondition > 2 ?then

? ? ? ? ?select * from customer where name = '李四';

? ? ?else

? ? ? ? ?select * from customer;

? ? ?end if;

? end

? call sp_search_customer(2);

? 结果:

? ? mysql> call sp_search_customer6(3);

+----+--------+----------+

| id | name ? | password |

+----+--------+----------+

| ?3 | 陈超阳 | 陈超阳 ? |

+----+--------+----------+

1 row in set (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

? 注意点:1,在多个条件下,如果给出的条件满足多个分支,那么只执行最前面

? ? ? ? ? 的那个条件。上述存储过程只要给出大于0的数结果总是陈超阳。

?说明了那个问题。

?2,elseif 是合体,不能分开。

?3,end if是分体,并且需要跟上分号。

2013/8/19 2258 ?131

?

?

5,mysql中case分支语句。

? create procedure sp_search_cusomer7(in mycondition int)

begin

? case mycondition

? ? ? when 1 then

? ? ? ? ? select * from customer where name = '陈超阳';

? ? ? when 2 then?

? ? ? ? ? select * from customer where name = '张三';

? ? ? when 3 then?

? ? ? ? ? select * from customer where name = '李四';

? ? ? when 4 then

? ? ? ? ? select * from customer where name = '王五';

? ? ? else

? ? ? ? ? select * from customer;

? end case;

end

call sp_search_cusomer7(7);

?

6,本地变量(也叫局部变量

? ?在上一个例子中我们可以看到有很多相似的代码,我们可以吧相似的代码

? ?放在判断条件之外,让可变的地方以变量来表示。对上个存储过程我们

? ?修改为如下结构。

? ?create procedure sp_search_customer8(in mycondition int)

begin?

? ? DECLARE tmp varchar(20);

? ? case mycondition

? ? ? ?when ?1 then

? ? ? ? ?set ?tmp = '陈超阳';

? ? ? ?when ?2 then

? ? ? ? ?set ?tmp = '张三';

? ? ? ?when ? ?3 ? ? then

? ? ? ? ?set ?tmp = '李四';

? ? ? ?when ?4 ? ? ? then

? ? ? ? ?set ?tmp = '王五';

? ? ? ?else

? ? ? ? ?set ?tmp = ''; ? ?

? ? ?end case;

? ? ?select * from customer where name = tmp;

end

call sp_search_customer8(9);

注意:1,定义变量 ?declare tmp varchar(20) '陈超阳';

? ? ? ? ?上面定义的时候直接赋予变量初始值了。

? ? ? 2,该变量赋值:set tmp = '陈超阳';

? ? ? 3,本地变量也叫做局部变量,只能使用在存储过程中用于保存存储过程中

? ? ? ? ?的临时值。

? ? ? 4,变量一定要事先声明才能使用,否则不能直接直接使用。

?

7,使用循环语句。

? ?两种循环语句,while 和 repeat

? ?实例1:编写存储过程计算n的阶乘。

? ? create procedure sp_factorial(in p_num int,out p_result int)

? ? begin

? ? ? ? set p_result = 1;

? ? ? ? while p_num > 1 do

? ? ? ? ? ?set p_result = p_result * p_num;

? ? ? ? ? ?set p_num = p_num-1;

? ? ? ? end while; ? ??

? ? end

? ? call sp_factorial(2,@jiecheng);

? ? select @jiecheng;

?

? ? 实例2,用repear实现阶乘功能

? ? create procedure sp_factorial2(in p_num int,p_result int)

? ? begin

? ? ? ?set p_num = 1;

? ? ? ?repeat

? ? ? ? ? set p_result = p_result * p_num;

? ? ? ? ? set p_num = p_num-1;

? ? ? ?until p_num <=1?

? ? ? ?end repeat;

? ? end

? ? 注意:repeat结果至少要执行一次循环,而while至少可以不执行。

?

?

实例:

? ? ? 有两张表一张是收入表,一张是开支表,每个人的收入和开支分别存储上这两张表中,分别编写存储过程和函数实现功能:输入一个人的名字,得到该人的余额。

收入表:

??| income | CREATE TABLE `income` (

? `id` int(11) NOT NULL AUTO_INCREMENT,

? `username` varchar(6) DEFAULT NULL,

? `income` int(11) DEFAULT NULL,

? PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 |

支出表:

| outcome | CREATE TABLE `outcome` (

? `id` int(11) NOT NULL AUTO_INCREMENT,

? `username` varchar(6) DEFAULT NULL,

? `outcome` int(11) DEFAULT NULL,

? PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 |

?

存储过程:

create procedure balance(in myname varchar(20),out balance int)

begin

? declare sumincome int;

? declare sumoutcome int;

? select sum(income) into sumincome ?from income where username = myname;

? select sum(outcome) into sumcome from outcome where username = myname;

? set balance = sumincome - sumoutcome;

end

测试:

? call balance('supan',@supanBalance);

? select @supanBalance;

?

函数:

? create function balance(myname varchar(20)) returns int

begin

? declare sumincome int;

? declare sumoutcome int;

? select sum(income) into sumincome from income where username = myname;

? select sum(outcome) into sumoutcome from outcome where username = myname;

? return sumincome - sumoutcome;

end

测试:

? ? ?select balance('supan');

?

?Over

NOte:上面程序没有测试,可能有误,不过大致思想就是那样。

?

?

?

?

?

?

?

?

热点排行