一.对待存储过程和函数的态度

在实际项目中应该尽量少用存储过程和函数,理由如下:

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中的存储过程和函数使用详解的更多相关文章

  1. MySQL中的存储过程和函数

    存储过程和函数 简单的说,存储过程就是一条或者多条SQL语句的集合.可以视为批文件,但是其作用不仅仅局限于批处理.本文主要介绍如何创建存储过程和存储函数,以及如何调用.查看.修改.删除存储过程和存储函 ...

  2. MySQL中的存储过程、函数与触发器

    一.对待存储过程和函数的态度 优点: 1.存储过程只在创建时进行编译,sql语句则每次执行都需要编译.能提高数据库执行速度. 2.简单复杂操作结合事物一起封装. 3.复用性高. 4.安全性高,可指定存 ...

  3. MySql中innodb存储引擎事务日志详解

    分析下MySql中innodb存储引擎是如何通过日志来实现事务的? Mysql会最大程度的使用缓存机制来提高数据库的访问效率,但是万一数据库发生断电,因为缓存的数据没有写入磁盘,导致缓存在内存中的数据 ...

  4. Mysql中MVCC的使用及原理详解

      准备 测试环境:Mysql 5.7.20-log 数据库默认隔离级别:RR(Repeatable Read,可重复读),MVCC主要适用于Mysql的RC,RR隔离级别 创建一张存储引擎为test ...

  5. Mysql中WHERE IN,UNION 用法详解

    WHERE IN 用法 这里分两种情况来介绍 1.in 后面是记录集,如: select  *  from  table  where   uname  in(select  uname  from  ...

  6. MySQL中的存储过程、游标和存储函数

    MySQL中的存储过程首先来看两个问题: 1.什么是存储过程? 存储过程(Stored Procedure)是在数据库系统中,一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存 ...

  7. SQL中CONVERT()函数用法详解

    SQL中CONVERT函数格式: CONVERT(data_type,expression[,style]) 参数说明: expression 是任何有效的 Microsoft® SQL Server ...

  8. mysql 中创建存储过程

    mysql中创建存储过程和存储函数虽相对其他的sql语言相对复杂,但却功能强大,存储过程和存储函数更像是一种sql语句中特定功能的一种封装,这种封装可以大大简化外围调用语句的复杂程度. 首先以表emp ...

  9. SQL中的存储过程和函数

                                        存储过程和函数 简单的说,存储过程就是一条或者多条SQL语句的集合.可以视为批文件,但是其作用不仅仅局限于批处理.本文主要介绍如 ...

随机推荐

  1. 2015-09-29 js2

    Javasript 六. 条件语句 1. 比较运算符 == .!=.>.>=.<.<= 转大/小写:toUpperCase().toLowerCase() 2. 逻辑运算符(与 ...

  2. [LeetCode] 94. Binary Tree Inorder Traversal(二叉树的中序遍历) ☆☆☆

    二叉树遍历(前序.中序.后序.层次.深度优先.广度优先遍历) 描述 解析 递归方案 很简单,先左孩子,输出根,再右孩子. 非递归方案 因为访问左孩子后要访问右孩子,所以需要栈这样的数据结构. 1.指针 ...

  3. redis的文件事件

    redis的文件事件:即与io相关的事件. /* File event structure */ typedef struct aeFileEvent { int mask; /* one of AE ...

  4. redis sentinel哨兵模式集群搭建教程

    1.环境说明 我们将使用192.168.220.128.192.168.220.129两台机器搭建sentinel交叉主从为例 当前我们已在192.168.220.128上按redis安装教程安装了r ...

  5. curl和wget的区别和使用

    curl和wget基础功能有诸多重叠,如下载等. 非要说区别的话,curl由于可自定义各种请求参数所以在模拟web请求方面更擅长:wget由于支持ftp和Recursive所以在下载文件方面更擅长.类 ...

  6. Net Core2.0 升级到.Net Core 2.1

    1. 安装新 .Net Core SDK 2.1 2. 升级VS.net 到15.7, 这个版本极其不好用,IIS打中文会自动退出,但现在也没办法降级了.只能等微软打补丁. 3. 对于面向 ASP.N ...

  7. python 利用turtle库绘制五角星

    # -*- coding: utf-8 –*-import turtleimport math def draw_polygon(aTurtle, size=50, n=3): for i in ra ...

  8. 逆袭之旅DAY17.东软实训.Oracle.PLSQL.过程,函数,包,练习

    2018-07-13 14:54:46 --1.创建一个包,包含一个为雇员加薪的过程,一个为雇员减薪的过程 CREATE OR REPLACE PACKAGE pac_test1 IS PROCEDU ...

  9. Win10系列:UWP界面布局基础1

    随着技术的不断发展,使用者对应用程序的界面体验提出了更高的要求,为了应对越来越复杂的界面设计需求和有效的简化界面开发过程,微软公司在其应用程序的开发技术当中引入一套新的应用程序界面描述语言,这就是XA ...

  10. TCP_NODELAY算法使用事项

    当有一个TCP数据段不足MSS,比如要发送700Byte数据,MSS为1460Byte的情况.nagle算法会延迟这个数据段的发送,等待,直到有足够的数据填充成一个完整数据段.也许有人会问,这有什么影 ...