最近发现有张用户信息表中的性别字段 由于之前的问题 没有正确维护进数据库中 现在需要维护下 本想直接写个程序跑一下,想想用Mysql来实现应该会很有意思 所以决定用存储过程来完成字段的维护,顺便复习下存储过程的使用
什么是存储过程
存储过程(Stored Procedure) 是一组为了完成特定功能的 SQL 语句集合
它主要用来完成 CURD
操作 其中可以使用流程控制语句 来完成复杂的判断和 复杂的运算等
在经过编译后可以存储在数据库中 用户可以通过调用存储过程(传入相关参数[并不是必须]) 来调用它
存储过程和函数的区别
1.函数必须要有返回值, 而存储过程没有这个限制
2.函数只能返回一个变量, 而存储过程可以返回多个
3.函数的参数只有 in类的 就是输出参数, 而存储过程可以有 In Out Input 3种类型参数
4.函数中不能进行修改全局数据库状态的操作,而存储过程可以
5.函数可以做为查询语句的一部分来使用,而存储过程不可以
创建存储过程
先上个例子
DELIMITER // | |
CREATE PROCEDURE proc1(int s varchar(20),out ss int,input sss double) | |
BEGIN | |
SELECT COUNT(*) INTO s FROM user; | |
END // | |
DELIMITER ; |
讲解:
(1)这里需要注意的是DELIMITER//和DELIMITER;两句,DELIMITER是分割符的意思,因为MySQL默认以”;”为分隔 符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当 前段分隔符,这样MySQL才会将”;”当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。
(2)存储过程根据需要可能会有输入、输出、输入输出参数,这里有3个参数 第一个参数s 是输入参数 varchar类型, 第二个参数是ss 是输出参数 第三个参数sss 类型是输入输出参数, 你可以随便定义自己需要的参数 不要按照上面的顺序 上面例子参数不是必须的
存储过程的调用
call procedure_name(parame1,parame2,parame3);
存储过程完成表信息字段维护
回到开局问题 下面用存储过程来完成员工表中性别字段的维护
包含了mysql 的循环 条件判断 字符串函数截取等
# 删除存储过程 | |
drop procedure if exists emp_change; | |
delimiter // | |
# 创建一个存储过程 | |
create procedure emp_change() | |
begin | |
# 当前的记录id | |
declare this_id int; | |
# 声明待判断的身份证值 | |
declare curren_check int; | |
# 当前的gender | |
declare this_gender tinyint; | |
# 当前的身份证号 | |
declare this_card_no varchar(20); | |
# 声明一个是否执行完的标识 | |
declare done int default 0; | |
# 把查询结果设置到c1中 先简单的拿2条数据测试下 | |
declare c1 cursor for select id,card_no from employees where gender = 0; | |
# 声明一个异常 如果结果集遍历完 就把done标识设置为1 标识结束 | |
declare continue handler for sqlstate '02000' set done = 1; | |
open c1; | |
# 开启循环 | |
repeat | |
# 先设置一个默认值 | |
set this_gender = 0; | |
set curren_check = 0; | |
# 取出一条结果集 | |
fetch c1 into this_id, this_card_no; | |
# 如果done标识可以继续执行 | |
if not done then | |
# 如果是15位身份证号码 | |
if CHAR_LENGTH(this_card_no) = 15 then | |
# 截取第15位值 | |
set curren_check = right(this_card_no, 1); | |
if mod(curren_check,2) = 0 then | |
# 整除了 就是 女 | |
set this_gender = 2; | |
else | |
set this_gender = 1; | |
end if; | |
# 如果是18位身份证号码 | |
elseif CHAR_LENGTH(this_card_no) = 18 then | |
# 截取第17位 | |
set curren_check = substring(this_card_no, -2, 1); | |
if mod(curren_check,2) = 0 then | |
# 整除了 就是 女 | |
set this_gender = 2; | |
else | |
set this_gender = 1; | |
end if; | |
end if; | |
# 设置好gender了 然后开始变更sql | |
update employees set gender = this_gender where id = this_id; | |
end if; | |
until done end repeat; | |
# 关闭 | |
close c1; | |
end // | |
delimiter ; | |
# 执行 | |
# call emp_change(); |
关于存储过程的使用基本就这样了
参考文档:
www.jianshu.com/p/7b2d74701ccd