mysql存储过程的初步学习及案例示例

存储过程

几个月前小编开始初步接触学习存储过程,当然是跟着大神的视频学习的,在学习的过程中自己也记录了一下笔记,如今整理一下,接下来我将从概念,优缺点以及语法和实际应用几方面为大家详细讲解一下存储过程,如有不对的地方,望留言批评,给予修正。

概念:一组预先编译好的sql语句的集合,理解成批处理语句。

优点:1.提高代码的重用性 2.简化操作 3.减少了我们的编译次数并且减少了服务器的连接次数,提高了效率。

语法:一、创建语法

create  procedure  存储过程名称(参数列表)
  begin

  存储过程体(一组合法的sql语句)

  end

注意:1.参数列表包含三部分:参数模式、参数名,参数类型

例如:in stuname varchar(20)   ,其中“in”为参数模式,“stuname”为参数名,varchar(20)为参数类型。

这里重点说一下参数模式,参数模式有以下三种:

in该参数可以作为输入,也就是说该参数需要调入方传入值;

out:该参数可以作为输出,也就是该参数可以作为返回值;

inout:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值。

2.如果存储过程仅仅只有一句话,begin end可以省略。存储过程体的每条sql语句的结尾要求必须加分号, 存储过程的结尾可以使用 delimiter 重新设置 语法: delimiter 结束标记 案例:delimiter $

二、调用语法

call 存储过程名(实体参数);

三、简单案例

1.空参列表 案例:插入到persion表中五条记录

delimiter $
create  procedure  myp1()
  begin
insert  into persion5(name,sex) values("张三",1),("汤姆",1),("李四",1),("王五",1);
  end $

调用语法

call myp1();

2.创建一个in模式的存储过程

案例一:创建存储过程实现,根据姓名查询对应的信息

delimiter $
create  procedure myp3(in beautyName varchar(20))
  begin
select p.*
from persion5 p
where p.name = beautyName;
  end $

调用语法

call myp3('张三');

案例二 创建存储过程用来传多个参数 in 模式

delimiter $
create  procedure myp4(in inname varchar(20),in insex int)
  begin
select if(p.name = inname and p.sex = insex,'查询出了数据','没有查询出数据') as result
from persion5 as p
where p.id = 9;
  end $

call myp4('张三',2);

案例三 自己声明参数

delimiter $
create  procedure myp5(in inname varchar(20),in insex int)
  begin
declare result varchar(20) default  '';#声明并初始化
select count(*) into result #赋值
from persion5 as p
where p.name = inname and p.sex = insex;

select result;#使用
  end $

call myp5('王五',1);

3.创建一个out模式的存储过程

案例一:根据name ,返回sex

delimiter $
create procedure myp6(in inname varchar(20),in inid int,out outsex varchar(20))
  begin
select p.name into outsex
from persion5 as p
where p.name = inname and p.id = inid;
  end $
set @outsex = '';
call myp6('李四',3,@outsex);
select @outsex as '结果';

4 创建一个inout模式参数的存储过程

案例!、传入a和b两个值,最终a和b都翻倍并返回

delimiter $
create  procedure myp7(inout a int,inout b int)
  begin
set a = a*2;
set b = b*2;
  end $

set @a=10;#声明一个变量a
set @b=20;#声明一个变量b
call myp7(@a,@b);#将变量a b传入到myp7中,返回的值存入先前声明的变量
SELECT @a,@b;#将变量输出

调用:需要先定义变量,

练习:

一、创建存储过程(略微提高难度)

实现往admin表中插入数据

delimiter $
create procedure test_pro1(in userName varchar(20),in loginPwd varchar(20))
  begin
insert into admin(admin.username,admin.password)
VALUES (userName,loginPwd);
  end $

call test_pro1('admiin','00001');

创建存储过程实现传入id,获取姓名以及地址

delimiter  $
create procedure test_pro2(in inid int,out outName varchar(20),out outAdress varchar(20))
  begin
select p.name ,p.adress into outName,outAdress
from persion p
where p.id = inid;
  end $

set @outName = '';
set @outAdress = '';
call test_pro2(1,@outName,@outAdress);
select @outName as outName,@outAdress as outAdress;

创建存储过程用来实现比较大小

delimiter  $
create procedure test_pro3(in birth1 DATETIME,in birth2 DATETIME,out result int)
  begin
select DATEDIFF(birth1,birth2) into result;#调用比较日期大小的函数
  end $


call test_pro3('2998-1-1',now(),@result);#传入两个时间,now()/取当前的时间
select @result;

二、删除存储过程

语法 drop procedure 存储过程名称  注意:只能删除一条
drop procedure test_pro5;

三、查看存储过程的信息

show create procedure '存储名称';
show  create procedure myp1;

四、创建存储过程或者函数实现传入一个日期,格式化成XX年XX月XX日并返回

delimiter $
create procedure test_pro4(in mydata datetime,out strdate varchar(20))
  begin
select DATE_FORMAT(mydata,'%Y年%c月%e日') into strdate;
  end $

call test_pro4(now(),@str);
select @str as  '格式化日期';

五 传入姓名,查出姓名 and 地址

delimiter $
create procedure  test_pro5(in myName varchar(20),out str varchar(20))
  begin
select concat(myName,' and ',IFNULL(p.adress,'111')) into str
from persion p
where p.name = myName;
  end $

call test_pro5('李白',@str);
select @str;

六 创建存储过程,根据传入的条目数和起始索引,查询记录

delimiter $
create  procedure test_pro6(in startIndex int,in size int)
  begin
select *
from persion5 limit startIndex,size;
  end $

call test_pro6(2,5);

在学习存储过程的过程中还需要注意的一点是与mysql函数的比较区分,在这里主要讲解的是存储过程的初步学习,函数方面就不做过多介绍了,后期有机会的话讲解一下函数。本篇存储过程的讲解适合初学者,更复杂的还需要大家和小编一块努力探究学习。
原文地址:https://www.cnblogs.com/zaevn00001/p/12169585.html