12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
ADADADADAD
mysql数据库 时间:2024-12-25 09:57:37
作者:文/会员上传
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
一.对待存储过程和函数的态度在实际项目中应该尽量少用存储过程和函数,理由如下:1.移植性差,在MySQL中的存储过程移植到sqlsever上就不一定可以用了。2.调试麻烦,在db中报一个错
以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。
一.对待存储过程和函数的态度
在实际项目中应该尽量少用存储过程和函数,理由如下:
1.移植性差,在MySQL中的存储过程移植到sqlsever上就不一定可以用了。
2.调试麻烦,在db中报一个错误和在应用层报一个错误不是一个概念,那将是毁灭性打击,直接一个error:1045什么的更本毫无头绪。
3.扩展性不高。
所以在互联网时代大型项目应该尽量少使用(不使用)存储过程和函数!!!
二.创建存储过程
2.1什么是存储过程?
存储过程和存储函数都是一组sql语句的集合。这些语句集合被当做一个整体存入数据库中。
2.2创建存储过程的语法:
createprocedure存储过程名(参数列表)
sql语句
.示例1:
delimiter//
createprocedurepro()readssqldatabeginselect*fromstu;end
//
那么我们现在就有一个存储过程pro了,但是这个存储过程他是没有参数的,他只是执行一次查询操作。
我们现在来讲解一下这个存储过程的结构:
delimiter//是将分号转化为//因为在sql执行时当他遇到分号;时他就讲停止所以我们必须将其转化为//直到最后一行才会停止执行。
readssqldata解释characteristic的状态在这里是只读模式,其他的模式还有:nosql没有sql语句,inssql不包含读和写的语句,modifiessqldata包含写入数据的语句等等。
begin/***/end在存储过程中当有多条语句集合时我们必须使用begin和end。
//结束整个存储过程
2.3使用存储过程
现在只是创建了一个存储过程,那么我们怎么来使用这个存储过程呢?
语法:call存储过程名()
将上一个存储过程pro使用的例子:
callpro();
2.4创建一个带参数的存储过程
参数列表:存储过程的参数有三种类型:in,out,inout分别表示传入参数和传出参数,和既传入也传出参数。
例子:首先我们来创建两张表:课程表是学生表的从表。
createtablestu(
stu_idbigintprimarykeyauto_increment,#学号
stu_namevarchar(10)notnull,#姓名
stu_majorintnotnull,#专业号
stu_sexchar,#性别
stu_indate,#入学日期
stu_birthdate,#出生日期
foreignkey(stu_major)referencesmajor(ma_id)#专业外键设置
);
createtablemajor(
ma_idintprimarykey,
ma_namevarchar(15),
ma_bossvarchar(10)
);
insertintomajorvalues(1,"信管","张三");
insertintomajorvalues(2,"电子商务","李四");
insertintostuvalues(1,"小明",1,"男","2017-09-01","1998-12-23");
insertintostuvalues(2,"小高",1,"男","2017-09-01","1998-05-01");
insertintostuvalues(3,"小李",2,"男","2017-09-01","1999-04-01");
我们再来创建一个带有参数的存储过程找到学生的主修课的名字,代码如下:
delimiter//
createprocedurepro1(insnamevarchar(10),outmavarchar(10))
readssqldata
begin
selectma_nameintomafrommajorwherema_id=(selectstu_majorfromstuwherestu_name=sname);
end
//
使用这个存储过程:代码如下:
set@ma="没查询之前";
callpro1("小李",@ma);
select@ma;
解释一下代码:首先使用set@ma定义一个全局变量,然后在使用call存储过程名语法调用存储过程,同时全局变量ma的值也改变了。
三.创建一个存储函数
3.1存储过程和存储函数的不同。
1.在函数中必须要有return返回值
2.在存储过程中参数有inoutinout三种,默认为in类型,但是在函数中只有一种in类型。
3.2创建一个函数
语法:createfunction函数名()
return返回类型
sql语句集合
示例2:
delimiter//
createfunctionfun1(numint)
returnsint
begin
returnnum+1000;
end
//
显然函数与存储过程的最大的区别就是在于return
3.3调用函数
使用语法不在使用关键字call,而是关键字select,select函数名
例子:
selectfun1(100);
四.删除存储函数和存储过程
语法:dropprocedure|function存储过程名或者是函数名
例子:
dropprocedurepro;
注意:此时的存储过程或者函数名称是不带括号的!!!
五.在存储过程和存储函数中使用游标
5.1为什么需要游标?
当我们在使用存储过程的时候可能用到多条数据,那么我们就需要用到游标来存放多条数据。
5.2使用游标的注意点
游标不能单独存在,必须在存储过程或者是存储函数中使用。
5.3使用游标
语法:
1.创建游标:declare游标名cursorforselect语句
2.打开游标:open游标名
3.使用游标:fetch游标名into变量名
4.关闭光标:close游标名
示例3:
delimiter//
createfunctionfun3(idint)
returnsintreadssqldata
Begin
declarecurcursorforselectstu_idfromstu;
opencur;
fetchcurintoid;
closecur;
returnid;
End
//
使用
set@id=0;
selectfun3(@id);
可以发现游标只是将第一个值给了变量。
11-20
11-19
11-20
11-20
11-20
11-19
11-20
11-20
11-19
11-20
11-19
11-19
11-19
11-19
11-19
11-19