• <MySQL>入门七 存储过程和函数


    -- 存储过程和函数
    /*
        存储过程和函数:类似java中的方法
    
        好处:
        1.提高代码的重用性
        2.简化操作
    */
    
    /*
        存储过程 含义:一组预先编译好的SQL语句的集合。理解成批处理语句
        
        1.提高代码的重用性
        2.简化操作
        3.减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率    
    */
    
    -- 创建存储过程
    CREATE PROCEDURE 存储过程名(参数列表)
    BEGIN
        存储过程体(一组合法的SQL)
    END
    
    /*
        注意:
        1.参数列表包含三部分:参数模式   参数名   参数类型
            例如:IN stuName varchar(20);
          
          参数模式:
              IN     :该参数可以作为输入,需要调用方传入值
              OUT    :改参数可以作为输出,该参数作为返回值
              INOUT  :该参数既可以输入也可以输出,该参数既需要传入值,又可以返回值
              
         2.如果存储过程提只有一句话,begin end 可以省略
         
         3.存储过程体中每条SQL语句的结尾必须加分号
         
         4.存储过程的结尾可以使用 DELIMITER 重新设置
        例如 DELIMITER 任意字符 
    */
    
    -- 调用存储过程
    CALL 存储过程名(实参列表);
    
    -- ----------------------案例-----------------------------------------
    -- 1.空参列表
    -- 插入到amdin表中五条记录
    DELIMITER $
    CREATE PROCEDURE myp1()
    BEGIN
        INSERT INTO admin(username,`password`) VALUES
        ('a','00000'),
        ('b','00000'),
        ('c','00000'),
        ('d','00000'),
        ('e','00000');
    END $
    -- 调用
    CALL myp1()$
    
    
    -- 2.创建代in模式参数的存储过程
    -- 案例1.创建存储过程,根据女神名查询对应的男生信息
    DELIMITER $
    CREATE PROCEDURE myp2(IN beautyName VARCHAR(50))
    BEGIN
      SELECT bo.* FROM boys bo JOIN beauty be ON bo.id = be.boyfriend_id WHERE be.name = beautyName;
    END $
    -- 调用
    CALL myp2('麦克雷')$ -- 如果出现字符集问题,可以set names gbk$
    
    -- 案例2 创建存储过程,实现用户是否登录成功
    DELIMITER $
    CREATE PROCEDURE myp3(IN username VARCHAR(10),IN PASSWORD VARCHAR(10))
    BEGIN
        DECLARE result INT DEFAULT 0; -- 声明局部变量并初始化
        
        SELECT COUNT(*) INTO result FROM admin WHERE admin.`username`=username AND admin.`password`=PASSWORD;
        
        SELECT IF(result>0,'成功','失败'); 
    END $
    -- 调用
    CALL myp3('john','8888')$
    
    
    -- 3.创建代 in / out的存储过程
    -- 案例1 根据女神名,返回对应的男神名
    DELIMITER $
    CREATE PROCEDURE myp4(IN NAME VARCHAR(50),OUT boyName VARCHAR(20))
    BEGIN
        SELECT bo.boyName INTO boyName
        FROM boys bo JOIN beauty be ON bo.id = be.boyfriend_id
        WHERE be.name = NAME;
    END $
    -- 调用
    CALL myp4('麦克雷',@bName)$
    SELECT @bName $
    
    -- 案例2.根据女神名,返回对应的男神名和男神魅力值
    DELIMITER $
    CREATE PROCEDURE myp5(IN NAME VARCHAR(50),OUT boyName VARCHAR(20),OUT userCP INT)
    BEGIN
        SELECT bo.boyName,bo.userCP INTO boyName,userCP
        FROM boys bo JOIN beauty be ON bo.id = be.boyfriend_id
        WHERE be.name = NAME;
    END $
    -- 调用
    CALL myp5('麦克雷',@boyName,@userCP)$
    SELECT @boyName,@userCP $
    
    -- 4.创建代 inout 模式参数的存储过程
    -- 案例1.传入a和b两个值,最终a,b都翻倍并返回
    DELIMITER $
    CREATE PROCEDURE myp6(INOUT a INT,INOUT b INT)
    BEGIN
        SET a = a*2;
        SET b = b*2;
    END $
    -- 定义用户变量
    SET @m = 10$
    SET @n = 20$
    -- 调用
    CALL myp6(@m,@n)$
    -- 查询值
    SELECT @m,@n$

    练习

    -- 练习
    -- 1.创建存储过程 实现 传入用户名密码,插入到admin中
    DELIMITER $
    CREATE PROCEDURE myep1(IN username VARCHAR(10),IN PASSWORD VARCHAR(20))
    BEGIN
        INSERT INTO admin(username,`password`) VALUES(username,PASSWORD);
    END $
    CALL myep1('士兵76','123456')$
    
    -- 2.创建存储过程 实现传入女神编号,返回女神名称和女神电话
    DELIMITER $
    CREATE PROCEDURE myep2(IN id INT,OUT NAME VARCHAR(50),OUT phone VARCHAR(11))
    BEGIN
        SELECT be.name,be.phone INTO NAME,phone FROM beauty be WHERE be.id = id;
    END $
    CALL myep2(1,@name,@phone)$
    SELECT @name,@phone$
    
    -- 3.创建存储过程 实现传入两个女神生日,返回大小
    DELIMITER $
    CREATE PROCEDURE myep3(IN birth1 DATETIME,IN birth2 DATETIME,OUT result INT)
    BEGIN
        SELECT DATEDIFF(birth1,birth2) INTO result ;
    END $
    CALL myep3('1992-3-6',NOW(),@result)$
    SELECT @result$

    存储过程的删除和查看

    -- 删除存储过程,每次只能删除一个
    -- drop procedure 存储过程名
    DROP PROCEDURE myp1;
    
    -- 查看存储过程
    SHOW CREATE PROCEDURE myep1;
  • 相关阅读:
    误删表空间处理办法
    一步步开发网站系列-网站界面
    webstorm ftp发布问题
    TP5接受Vue跨域请求
    tp5上传图片添加永久素材到微信公众号
    将博客搬至CSDN
    swoole http_server 多进程并使用多进程处理消息
    高并发下,php与redis实现的抢购、秒杀功能
    SVN服务器搭建
    web服务器安全笔记
  • 原文地址:https://www.cnblogs.com/mapleins/p/10110383.html
Copyright © 2020-2023  润新知