1.什么是存储过程

  • 一组可编程函数,是为了满足特定功能的SQL语句集
  • 存储过程就是具有名字的一段代码,用来完成个特定的功能
  • 创建的存储过程保存在数据库的数据字典中

2.为什么要用存储过程

  • 将重复性很高的操作,封装到一个存储过程中,简化了对这些SQL的调用
  • 批量处理
  • 统一接口,确保数据安全
  • 相对于Oracle来说,Mysql的存储过程相对功能较弱,使用较少

    3.存储过程的创建和调用

    1. delimiter$$

  • 他与存储过程无关

  • delimiter$$ 将标准分隔符 - 分号 (;) 更改为 两个 $
  • 将存储过程作为整体,而不是一次解释每条语句
  • 告诉mysql解释器,该段命令已经结束了。默认情况下,delimiter 是分号,在命令行客户端中,如果有一行命令以分号结束,回车后,mysql将会执行该命令。如果不希望这样,就可以 delimiter$$ ,这样只有在 $$出现后,mysql解释器才会执行 这段语句

  • mysql 存储过程 - 图1

    2.创建和调用存储过程

    1. # 创建存储过程
    2. CREATE PROCEDURE 名称()
    3. BEGIN
    4. 语句
    5. END$$
    6. # 调用存储过程
    7. CALL 名称()

    如图:
    mysql 存储过程 - 图2
    右击鼠标 运行已选择的
    然后运行CALL show_content() 这句,就会得到执行结果。
    将查询窗口关闭,重新打开一个新的查询窗口,可以直接使用 CALL show_content ,即可执行得到结果
    mysql 存储过程 - 图3

    3.查看存储过程

  • 查看所有存储过程: SHOW PROCEDURE STATUS;

  • 查看指定数据库中的存储过程: SHOW PROCEDURE STATUS WHERE DB = 'publiccms';

mysql 存储过程 - 图4

  • 查看指定存储过程源码 : SHOW CREATE PROCEDURE show_emp;
  • 删除指定存储过程: DROP PROCEDURE show_emp;

    4.存储过程变量

    delimiter $$
    CREATE PROCEDURE test()
    BEGIN
    -- 声明变量,默认为空
    DECLARE res VARCHAR(255) DEFAULT '';  
    DELETE x,y int DEFAULT 0 -- 声明两个变量,类型为int ,默认为 0
    -- 赋值  set 方式
    set x = 3;
    set y = 4;
    DECLARE avgRes DOUBLE DEFAULT 0;
    -- 另一种赋值方式 into 方式
    select avg(salary) into avgRes from emp
    end$$
    -- 什么的变量,如 x,y等,只能在 begin end 之间有效
    

    5.存储过程参数传递

    in
    -- 根据传入的名称,获取对应的信息
    delimiter $$
    create PROCEDURE getName(in name VARCHAR(255))
    BEGIN
    SELECT * FROM emp where ename = name;
    end$$
    delimiter ;
    
    CALL getName('鲁班')
    
    mysql 存储过程 - 图5

out

-- 传入姓名,得出薪水
delimiter $$
create procedure getSalary(in name varchar(255),out money int)
BEGIN
select salary into money from emp where ename = name;
end$$
delimiter ;
CALL getSalary('李白',@s) -- @s 代表返回的数
select @s; -- 也可以写为 select @s from DUAL 
-- DUAL 是一个虚拟的表

mysql 存储过程 - 图6


inout 既是输入,又是输出

delimiter $$
create procedure test(inout num int,in inc int)  -- inout ,既是输入,也是输出
BEGIN
set num = num + inc;
end$$
delimiter ;
set @num1 = 20;  -- @ 代表地址传递
CALL test(@num1, 10);
select @num1;

mysql 存储过程 - 图7