存储过程类似于java中的方法
好处:
1.提高代码的重用性
2.简化操作

存储过程

含义:一组预先编译好的SQL语句的集合,理解成批处理语句
1.提高代码的重用性
2.简化操作
3.减少了编译的次数并且减少了和数据库服务器的连接次数,提高效率

创建语法

  1. create procedure 存储过程名(参数列表)
  2. begin
  3. 存储过程体(一组合法的SQL语句)
  4. end

注意:
1.参数列表包含三部分
参数模式,参数名,参数类型
举例
IN stuname varchar(20)

参数模式:
IN: 该参数可以作为输入,也就是该参数需要调用方传入值
OUT: 该参数可以作为输出,该参数作为返回值
INOUT:该参数既可以作为输入,也可以输出。

如果存储过程仅仅只有一句话,BEGIN END 可以省略

存储过程体中,每条SQL语句的结尾要求必须加分号。
存储过程的结尾可以使用delimiter 重新设置
语法:
delimiter 结束标记

调用方法

call 存储过程名;

无参列表

注意,这里面的insert语句需要加上;

DELIMITER $
CREATE PROCEDURE myp1()

BEGIN
    INSERT INTO USER(id,count) values(1,0),(2,1),(3,2),(4,3);
END $

运行的时候

call `myp1`();

使用in模式的

CREATE DEFINER=`root`@`%` PROCEDURE `myp3`(in `name` varchar(20),in `pass` varchar(20))
begin
    declare result varchar(20) DEFAULt '';
    select count(*) into result from admin where username = `name` and `password` = `pass`;
    select result;
end


call myp3('john','8888');

使用out模式

create procedure myp5(in `location_id_1` int,out `count_num` int)
begin
    select count(*) into count_num from departments where location_id = `location_id_1`;
end

set @count_num = 0;
call myp5(1700,@count_num);
select @count_num;

out多个参数

    CREATE PROCEDURE myp6 ( IN keywords VARCHAR ( 20 ), OUT count_num INT, OUT avg_num int ) 
BEGIN
    SELECT `department_id`,location_id into count_num,  avg_num
        FROM
            departments 
        WHERE
            department_name LIKE concat( '%', `keywords`, '%' );
END

call myp6('Pub',@count_num,@avg_num);
select @count_num,@avg_num;

注意:这个只有一个intoSELECT department_id,location_id into count_num, avg_num

使用inout

create procedure myp8(inout a int,inout b int)
begin
    select a*2 ,b*2 into a,b;
END

set @a := 1;
set @b := 3;
call myp8(@a,@b);
select @a,@b;

删除存储工程

drop procedure 存储工程名
--eg:
drop procedure myp8;

查看存储过程的信息

show create procedure 存储过程名;
-- eg
show create procedure myp2;

无法删除存储过程,需要删除后创建

案例

-- 根据时间,返回格式化时间
CREATE DEFINER=`root`@`%` PROCEDURE `dfp1`(in `day` datetime,out `str` varchar(20))
begin
    set str := DATE_FORMAT(`day`,'%m-%d-%y');
END
--
create procedure test_pro5(in girlname varchar(50),out str varchar(50))
begin
select concat(b.name,' AND ', ifnull(boy.boyName,'null')) into str from beauty b join boys boy on b.boyfriend_id = boy.id where b.name = girlname;
end

call test_pro5('小昭',@str);
select @str;