-- 存储过程(类似函数)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);