创建存储过程:
/*删除存储过程proc1*/
DROP PROCEDURE IF EXISTS proc1;
/*s删除id=6的记录*/
DELETE FROM t_user WHERE id=6;
/*声明结束符为$*/
DELIMITER $
/*创建存储过程proc1*/
CREATE PROCEDURE proc1(id int,sex_str varchar(8),name varchar(16))
BEGIN
/*声明变量v_sex⽤于存放性别*/
DECLARE v_sex TINYINT UNSIGNED;
/*根据sex_str的值来设置性别*/
CASE sex_str
when '男' THEN
SET v_sex = 1;
WHEN '⼥' THEN
SET v_sex = 2;
END CASE ; /*插⼊数据*/
INSERT INTO t_user VALUES (id,v_sex,name);
END $
/*结束符置为;*/
DELIMITER ;
调⽤存储过程:
CALL proc1(6,'男','郭富城');
查看效果:
mysql> select * from t_user;
+----+-----+---------------+
| id | sex | name |
+----+-----+---------------+
| 1 | 1 | 路⼈甲Java |
| 2 | 1 | 张学友 |
| 3 | 2 | 王祖贤 |
| 4 | 1 | 郭富城 |
| 5 | 2 | 李嘉欣 |
| 6 | 1 | 郭富城 |
+----+-----+---------------+
6 rows in set (0.00 sec)
示例3:函数中使⽤
需求:写⼀个函数,根据t_user表sex的值,返回男⼥
创建函数:
/*删除存储过程proc1*/
DROP FUNCTION IF EXISTS fun1;
/*声明结束符为$*/
DELIMITER $
/*创建存储过程proc1*/
CREATE FUNCTION fun1(sex TINYINT UNSIGNED)
RETURNS varchar(8)
BEGIN
/*声明变量v_sex⽤于存放性别*/ DECLARE v_sex VARCHAR(8);
CASE sex
WHEN 1 THEN
SET v_sex:='男';
ELSE
SET v_sex:='⼥';
END CASE;
RETURN v_sex;
END $
/*结束符置为;*/
DELIMITER ;
看⼀下效果:
mysql> select sex, fun1(sex) 性别,name FROM t_user;
+-----+--------+---------------+
| sex | 性别 | name |
+-----+--------+---------------+
| 1 | 男 | 路⼈甲Java |
| 1 | 男 | 张学友 |
| 2 | ⼥ | 王祖贤 |
| 1 | 男 | 郭富城 |
| 2 | ⼥ | 李嘉欣 |
| 1 | 男 | 郭富城 |
+-----+--------+---------------+
6 rows in set (0.00 sec)
第2种⽤法
类似于java中多重if语句。
case
when 条件1 then 结果1或者语句1(如果是语句需要加分号)
when 条件2 then 结果2或者语句2
...
else 结果n或者语句nend [case] (如果是放在begin end之间需要加case,如果是在select后⾯case可以省
略)
这种写法和1中的类似,⼤家⽤上⾯这种语法实现第1中⽤法中的3个⽰例,贴在留⾔中。
if结构
if结构类似于java中的 if..else if...else的语法,如下:
if 条件语句1 then 语句1;
elseif 条件语句2 then 语句2;
...
else 语句n;
end if;
只能使⽤在begin end之间。
示例
写⼀个存储过程,实现⽤户数据的插⼊和新增,如果id存在,则修改,不存在则
新增,并返回结果
/*删除id=7的记录*/
DELETE FROM t_user WHERE id=7;
/*删除存储过程*/
DROP PROCEDURE IF EXISTS proc2;
/*声明结束符为$*/
DELIMITER $
/*创建存储过程*/
CREATE PROCEDURE proc2(v_id int,v_sex varchar(8),v_name
varchar(16),OUT result TINYINT)
BEGIN
DECLARE v_count TINYINT DEFAULT 0;/*⽤来保存user记录的数量*/
/*根据v_id查询数据放⼊v_count中*/
select count(id) into v_count from t_user where id = v_id;
/*v_count>0表⽰数据存在,则修改,否则新增*/
if v_count>0 THEN
BEGIN DECLARE lsex TINYINT;
select if(lsex='男',1,2) into lsex;
update t_user set sex = lsex,name = v_name where id = v_id;
/*获取update影响⾏数*/
select ROW_COUNT() INTO result;
END;
else
BEGIN
DECLARE lsex TINYINT;
select if(lsex='男',1,2) into lsex;
insert into t_user VALUES (v_id,lsex,v_name);
select 0 into result;
END;
END IF;
END $
/*结束符置为;*/
DELIMITER ;
看效果:
mysql> SELECT * FROM t_user;
+----+-----+---------------+
| id | sex | name |
+----+-----+---------------+
| 1 | 1 | 路⼈甲Java |
| 2 | 1 | 张学友 |
| 3 | 2 | 王祖贤 |
| 4 | 1 | 郭富城 |
| 5 | 2 | 李嘉欣 |
| 6 | 1 | 郭富城 |
+----+-----+---------------+
6 rows in set (0.00 sec)
mysql> CALL proc2(7,'男','黎明',@result);
Query OK, 1 row affected (0.00 sec)
mysql> SELECT @result;
+---------+
| @result |+---------+
| 0 |
+---------+
1 row in set (0.00 sec)
mysql> SELECT * FROM t_user;
+----+-----+---------------+
| id | sex | name |
+----+-----+---------------+
| 1 | 1 | 路⼈甲Java |
| 2 | 1 | 张学友 |
| 3 | 2 | 王祖贤 |
| 4 | 1 | 郭富城 |
| 5 | 2 | 李嘉欣 |
| 6 | 1 | 郭富城 |
| 7 | 2 | 黎明 |
+----+-----+---------------+
7 rows in set (0.00 sec)
mysql> CALL proc2(7,'男','梁朝伟',@result);
Query OK, 1 row affected (0.00 sec)
mysql> SELECT @result;
+---------+
| @result |
+---------+
| 1 |
+---------+
1 row in set (0.00 sec)
mysql> SELECT * FROM t_user;
+----+-----+---------------+
| id | sex | name |
+----+-----+---------------+
| 1 | 1 | 路⼈甲Java |
| 2 | 1 | 张学友 |
| 3 | 2 | 王祖贤 |
| 4 | 1 | 郭富城 | | 5 | 2 | 李嘉欣 |
| 6 | 1 | 郭富城 |
| 7 | 2 | 梁朝伟 |
+----+-----+---------------+
7 rows in set (0.00 sec)