-- 存储过程(类似函数)procedure
/*
 存储过程是事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程可以简化应用开发
人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。
存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
 */

-- 存储过程VS函数
/*
 函数的参数列表只有输入参数,存储过程可以有输入参数、输出参数、可输入输出的参数
 函数有只能返回一个变量的限制,存储过程可以返回多个变量
 函数可以嵌入SQL中使用,如在SELECT语句中调用,存储过程不能
 除此之外,两者本质一致
 */

-- 创建
create procedure p0()

begin
    select * from employee;
end;

call p0();

-- 查看
select * from information_schema.ROUTINES where ROUTINE_SCHEMA = 'test';

-- 查看创建语句
show create procedure p0;

-- 删除
drop procedure if exists p0;



-- 变量
/*
在MySQL中变量分为三种类型: 系统变量、用户定义变量、局部变量。
系统变量
是MySQL服务器提供,不是用户定义的,属于服务器层面。分为全局变量(GLOBAL)、会话变量(SESSION)。
用户定义变量
是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用 "@变量名" 使用就可以。其作用域为当前连接。
局部变量
是根据需要定义的在局部生效的变量,访问之前,需要DECLARE声明。可用作存储过程内的
局部变量和输入参数,局部变量的范围是在其内声明的BEGIN ... END块。
 */

-- mysql服务重新启动之后,所设置的全局参数会失效,要想不失效,可以在 /etc/my.cnf 中配置。



-- 系统变量
show global variables ;  -- 查看所有系统变量
show session variables ;   --

show global variables like 'admin%';   -- 模糊查询

select @@global.admin_port;  -- 查看系统变量的值 全局
select @global autocommit;
select @@session.autocommit;  -- 当前会话  不同窗口值可能不一样


set @@global.autocommit = 1;  -- 设置全局系统变量的值
set session autocommit = 0;   -- 设置当前会话系统变量


-- 用户变量


-- 局部变量

create procedure p1()  #创建存储过程p1
begin
    declare v_count int default 0;   -- 使用前要先声明,名称,类型,默认值
    select count(*) into v_count from employee;
    select v_count;

end;

call p1();

drop procedure if exists p1;
show create procedure p1;

练习:


--  创建一个存储过程,计算employee表中的员工人数,并存储到一个局部变量中,调用存储过程,并查看该变量结果(使用select @variable)
create procedure p_count()
begin
    declare v_num int default 0;
    select count(*) into v_num from employee;
    select v_num;
end;        -- 创建存储进程

call p_count();   -- 调用存储进程


--  创建一个存储过程,比较两个员工的实际收入,若前者比后者就输出0,否则输出1,员工用其员工编号识别
create procedure p_compare(id1 char(6),id2 char(6))
begin
    declare result int default 0;  -- 结果
    declare s1 double default 0;   -- 员工1工资
    declare s2 double default 0;   -- 员工2工资
    select income into s1 from salary where employeeID = id1;
    select income into s2 from salary where employeeID = id2;
    if s1>s2 then
        set result = 0;
    else
        set result = 1;
    end if;
    select result;
end;

-- 比较id为000001 和010008的员工的薪资
call p_compare(000001,010008);