一.对待存储过程和函数的态度
优点:
1.存储过程只在创建时进行编译,sql语句则每次执行都需要编译。能提高数据库执行速度。
2.简单复杂操作结合事物一起封装。
3.复用性高。
4.安全性高,可指定存储过程的使用权。
在实际项目中应该尽量少用存储过程和函数,理由如下:
1.移植性差,在MySQL中的存储过程移植到sqlsever上就不一定可以用了。
2.调试麻烦,在db中报一个错误和在应用层报一个错误不是一个概念,那将是毁灭性打击,直接一个error:1045什么的更本毫无头绪。
3.扩展性不高。
所以在互联网时代大型项目应该尽量少使用(不使用)存储过程和函数。
二.创建存储过程
2.1什么是存储过程?
存储过程和存储函数都是一组sql语句的集合。这些语句集合被当做一个整体存入数据库中。
2.2创建存储过程的语法:
create procedure 存储过程名(参数列表)
sql语句
例子:
delimiter //
create procedure pro()
reads sql data
begin
select * from stu;
end
那么我们现在就有一个存储过程pro了,但是这个存储过程他是没有参数的,他只是执行一次查询操作。
我们现在来讲解一下这个存储过程的结构:
delimiter // 是将分号转化为// 因为在sql执行时当他遇到分号 ; 时他就讲停止所以我们必须将其转化为 //直到最后一行才会停止执行。
reads sql data 解释characteristic的状态在这里是只读模式,其他的模式还有:no sql 没有sql语句 , ins sql 不包含读和写的语句 , modifies sql data 包含写入数据的语句等等。
begin /***/ end 在存储过程中当有多条语句集合时我们必须使用begin和end
// 结束整个存储过程
2.3使用存储过程
在只是创建了一个存储过程,那么我们怎么来使用这个存储过程呢?
语法:call 存储过程名()
将上一个存储过程pro使用的例子:
call pro();
2.4创建一个带参数的存储过程
参数列表:存储过程的参数有三种类型:in,out,inout 分别表示传入参数和传出参数,和即传入也传出参数。
例子:首先我们来创建两张表:课程表是学生表的从表
create tablestu(
stu_idbigint primary keyauto_increment,#学号
stu_namevarchar(10) not null,#姓名
stu_majorint not null,#专业号
stu_sexchar,#性别
stu_in date,#入学日期
stu_birth date,#出生日期foreign key (stu_major) referencesmajor(ma_id)#专业外键设置
);create tablemajor(
ma_idint primary key,
ma_namevarchar(15),
ma_bossvarchar(10)
);insert into major values(1,"信管","张三");insert into major values(2,"电子商务","李四");insert into stu values(1,"小明",1,"男","2017-09-01","1998-12-23");insert into stu values(2,"小高",1,"男","2017-09-01","1998-05-01");insert into stu values(3,"小李",2,"男","2017-09-01","1999-04-01");
我们再来创建一个带有参数的存储过程找到学生的主修课的名字,代码如下:
delimiter //
create procedure pro1(in sname varchar(10),out ma varchar(10))
reads sql databegin
select ma_name into ma from major where ma_id = (select stu_major from stu where stu_name=sname);end
//
使用这个存储过程:代码如下:
set @ma="没查询之前";
call pro1("小李",@m