MySQL中的存储过程和函数使用详解
一.对待存储过程和函数的态度
在实际项目中应该尽量少用存储过程和函数,理由如下:
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 table stu(
stu_id bigint primary key auto_increment,#学号
stu_name varchar(10) not null,#姓名
stu_major int not null,#专业号
stu_sex char,#性别
stu_in date,#入学日期
stu_birth date,#出生日期
foreign key (stu_major) references major(ma_id)#专业外键设置
);
create table major(
ma_id int primary key,
ma_name varchar(15),
ma_boss varchar(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 data
begin
select ma_name into ma from major where ma_id = (select stu_major from stu where stu_name=sname);
end
//
使用这个存储过程:代码如下:
set @ma="没查询之前";
call pro1("小李",@ma);
select @ma;
结果如下:
解释一下代码:首先使用set @ma 定义一个全局变量,然后在使用call 存储过程名 语法调用存储过程,同时全局变量ma的值也改变了。
三.创建一个存储函数
3.1存储过程和存储函数的不同。
1.在函数中必须要有return返回值
2.在存储过程中参数有in out inout三种,默认为in类型,但是在函数中只有一种in类型。
3.2创建一个函数
语法:create function 函数名()
return 返回类型
sql语句集合
例子:
delimiter //
create function fun1(num int)
returns int
begin
return num+1000;
end
//
显然函数与存储过程的最大的区别就是在于return
3.3调用函数
使用语法不在使用关键字call,而是关键字select ,select 函数名
例子:
select fun1(100);
结果:
四.删除存储函数和存储过程
语法:drop procedure | function 存储过程名或者是函数名
例子:
drop procedure pro;
注意他是不带括号的
五.在存储过程和存储函数中使用游标
5.1为什么需要游标?
当我们在使用存储过程的时候可能用到多条数据,那么我们就需要用到游标来存放多条数据。
5.2使用游标的注意点
游标不能单独存在,必须在存储过程或者是存储函数中使用。
5.3使用游标
语法:
1.创建游标:declare 游标名 cursor for select语句
2.打开游标:open 游标名
3.使用游标:fetch 游标名 into 变量名
4.关闭光标:close 游标名
5.4例子
delimiter //
create function fun3(id int)
returns int
reads sql data
begin
declare cur cursor for select stu_id from stu;
open cur;
fetch cur into id;
close cur;
return id;
end
//
使用
set @id=0;
select fun3(@id);
结果
可以发现游标只是将第一个值给了变量。
MySQL中的存储过程和函数使用详解的更多相关文章
- MySQL中的存储过程和函数
存储过程和函数 简单的说,存储过程就是一条或者多条SQL语句的集合.可以视为批文件,但是其作用不仅仅局限于批处理.本文主要介绍如何创建存储过程和存储函数,以及如何调用.查看.修改.删除存储过程和存储函 ...
- MySQL中的存储过程、函数与触发器
一.对待存储过程和函数的态度 优点: 1.存储过程只在创建时进行编译,sql语句则每次执行都需要编译.能提高数据库执行速度. 2.简单复杂操作结合事物一起封装. 3.复用性高. 4.安全性高,可指定存 ...
- MySql中innodb存储引擎事务日志详解
分析下MySql中innodb存储引擎是如何通过日志来实现事务的? Mysql会最大程度的使用缓存机制来提高数据库的访问效率,但是万一数据库发生断电,因为缓存的数据没有写入磁盘,导致缓存在内存中的数据 ...
- Mysql中MVCC的使用及原理详解
准备 测试环境:Mysql 5.7.20-log 数据库默认隔离级别:RR(Repeatable Read,可重复读),MVCC主要适用于Mysql的RC,RR隔离级别 创建一张存储引擎为test ...
- Mysql中WHERE IN,UNION 用法详解
WHERE IN 用法 这里分两种情况来介绍 1.in 后面是记录集,如: select * from table where uname in(select uname from ...
- MySQL中的存储过程、游标和存储函数
MySQL中的存储过程首先来看两个问题: 1.什么是存储过程? 存储过程(Stored Procedure)是在数据库系统中,一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存 ...
- SQL中CONVERT()函数用法详解
SQL中CONVERT函数格式: CONVERT(data_type,expression[,style]) 参数说明: expression 是任何有效的 Microsoft® SQL Server ...
- mysql 中创建存储过程
mysql中创建存储过程和存储函数虽相对其他的sql语言相对复杂,但却功能强大,存储过程和存储函数更像是一种sql语句中特定功能的一种封装,这种封装可以大大简化外围调用语句的复杂程度. 首先以表emp ...
- SQL中的存储过程和函数
存储过程和函数 简单的说,存储过程就是一条或者多条SQL语句的集合.可以视为批文件,但是其作用不仅仅局限于批处理.本文主要介绍如 ...
随机推荐
- Python购物车
product_list = [ ['Iphone',5888], ['Mac Air',8000], ['XiaoMi',19.9], ['coffee',30], ['Tesla',820000] ...
- Windows下安装 Memcache
1.下载Memcached Windows服务端程序.(memcached >= 1.4.5 版本安装32 32位系统 1.4.5版本:http://static.runoob.com/down ...
- mvc4自定义辅助器方法的学习
1.什么是辅助器 它们可以对代码块和标记进行打包,以便能够在mvc框架应用程序中重用.可以理解成编写在页面上的C#代码(方法). 2 .自定义辅助器 创建“基本”的mvc示例,并创建Basic控制器, ...
- sql server 根据身份证号计算出生日期和年龄的存储过程
我这边有一个业务,需要客户填写身份证号,自动计算他的出生日期和年龄 在sql中,具体的存储过程实现是这样的: /******************************************** ...
- python2x 与 python3x 区别
python2.x 与 python3.x 的区别: 1. python2.x 的源码编码不规范,源码重复较多:python3.x 的源码编码规范,清晰.优美.简单 2. python2.x的默认字符 ...
- console.log()显示图片以及为文字加样式
有兴趣的同学可以文章最后的代码复制贴到控制台玩玩. Go for Code 在正常模式下,一般只能向console 控制台输出简单的文字信息.但为了把信息输出得更优雅更便于阅读,除了cosole.lo ...
- 真实分享记录我学习Linux系统遇到的问题
对于linux,又爱又恨,也有自己的一些看法,毕竟已经接触了快两年了.但是,说出来都是伤,为什么呢?如果您想知道请让我给您慢慢道来. 最开始接触linux是在高考完后,由于我家的台式电脑太卡,于是我就 ...
- HTML编辑笔记3
表单 1.语法 <form method="get|post" action="数据向哪提交的地址"> //表单内容 </form> 2 ...
- 每天CSS学习之color
color意为颜色,其作用是设置字体的颜色. 设置颜色的方式有以下几种: 1.使用颜色单词,如:red: 2.使用十六进制,如:#FFFFFF: 3.使用rgb(255,0,0); 让我们来实践一下, ...
- c/c++动态内存分配的区别
c中动态内存分配使用malloc和free. malloc指定需要分配的内存大小,分配成功则返回指向该内存的指针,不成功则返回空指针.返回的指针类型为void *,表示不确定指针所指内存存放的数据类型 ...