zoukankan      html  css  js  c++  java
  • 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函数的比较区分,在这里主要讲解的是存储过程的初步学习,函数方面就不做过多介绍了,后期有机会的话讲解一下函数。本篇存储过程的讲解适合初学者,更复杂的还需要大家和小编一块努力探究学习。
  • 相关阅读:
    php 使用函数中遇到的坑之----list
    redis info
    Redis查询当前库有多少个 key
    Git怎样撤销一次分支的合并Merge
    JKS转PFX
    js获取当前域名、Url、相对路径和参数以及指定参数
    MySQL触发器更新和插入操作
    MySQL创建触发器的时候报1419错误( 1419
    xml 3 字节的 UTF-8 序列的字节 3 无效
    PostgreSQL的递归查询(with recursive) ,替代oracle 的级联查询connect by
  • 原文地址:https://www.cnblogs.com/zaevn00001/p/12169585.html
Copyright © 2011-2022 走看看