存储过程&变量

48 阅读4分钟

存储过程(存储函数)

简称:存过 (不推荐使用,了解就可以)

往emp表中插入10000条数据

定义:一组预编译的sql语句的集合,理解成可批量执行的sql语句,类似于java的中的方法

好处:提高代码的复用性,简化操作

弊端:占用磁盘空间,容易造成数据库IO瓶颈

语法:

create procedure 过程名(参数列表)

begin

逻辑(要执行的sql)

end

注意:

参数列表:参数模式 参数名 参数类型,参数模式 参数名 参数类型

参数模型 :

in 输入的参数 入参

out 输出的参数 出参 就是返回值

inout 可以入也可以出

但凡修改存过的逻辑,一定重新执行一下创建存过

-- 往emp里面插入5条数据
drop procedure if exists insertemp;
create procedure insertemp()
begin 
  insert into emp(empno,ename) values("1003","Andy1");
  insert into emp(empno,ename) values("1004","Andy2");
  insert into emp(empno,ename) values("1005","Andy3");
  insert into emp(empno,ename) values("1006","Andy4");
  insert into emp(empno,ename) values("1007","Andy5");
end; 
-- 存过和方法一样不调用  不执行
-- 调用存过
call insertemp();   
select * from emp;
-- 根据姓名 查询出该员工所在的部门名称
select ename,dname,loc from emp e join dept d on e.deptno = d.deptno and e.ename = 'smith';

drop procedure if exists selectbyname;
create procedure selectbyname(in ename char(50))
begin 
 select ename,dname,loc from emp e join dept d on e.deptno = d.deptno and e.ename = ename;
end;
-- 调用有参存过
call selectbyname('smith');



-- 创建一个登陆逻辑  判断用户是否登陆成功
select count(1) from user u where u.user_name = 'admin' and u.password = 123456;
drop procedure if exists islogin;
create procedure islogin(in username char(50),in password char(50))
begin 
    declare result int default 0; -- 声明局部变量 
    -- 把count(1)的结果赋值给result
    select count(1) into result from user u where u.user_name = username and u.password = password;
    select if(result,"登陆成功","账号密码错误") '登陆状态';
end;

-- 调用登陆验证存过
call islogin("admin","123456"); -- 0 1 应用层还得转  0转成登陆失败 1转成登陆成功

-- 创建一个带输出参数的存过
-- 根据员工的名字查询员工工作的地址
drop procedure if exists selectlocbyename;
create procedure selectlocbyename(in ename char(50),out loc char(50))
begin 
   select d.loc into loc from emp e,dept d where e.deptno = d.deptno and e.ename = ename;
end;

-- 调用有参有返回值的存过
call selectlocbyename('smith',@loc);  -- smith用于传参到存过中,@loc是用于接收存过的返回值
-- mysql中成员变量不用事先声明,用的时候直接  @变量名  就可以
-- mysql里面打印用select
select @loc;

变量:就是内存中的一个存储空间

  1. 局部变量

作用域: 存过的begin and中间 语句执行完,变量消失

语法: declare 变量名 数据类型 default 默认值

注意: declare声明变量 必须写在存过的begin的第一行

  1. 用户变量(成员变量)

作用域: 用于当前的连接,当前的连接断开,变量就消失

语法:

使用:select @变量名

赋值:

set @变量名 = 1;

set @变量名 := 2;

= 和 := 区别:在用select给变量进行赋值的时候,只能用:=

因为 select语句 = 表赋值

  • = 用于比较两个值是否相等。
  • := 用于给变量赋值。

注意:

select into 和 select := 区别

select into既可以给局部变量赋值也可以给用户变量赋值

如果是赋值的话,只能赋值,不会有返回值,也就是查询结果

select := 只能给用户变量赋值,不能给局部变量赋值,赋值的同时会有返回结果

  1. 会话变量

作用域: 用于当前的连接(仅限于当前连接,就是每个连接对象的会话变量是独立的),当前的连接断开,变量就消失

查看会话变量有很多种方式,其中之一查看所有会话变量 show session variables; 其他的自行百度

设置会话变量:

set auto_increment_increment = 值 直接设置 其他方式自行百度

  1. 全局变量(一般在数据库等级保障的时候,如果不想修改配置文件的情况,可以通过全局变量去设置一些安全方面的配置)

当mysql服务启动的时候,会将所有的全局变量给一个初始化默认值,作用域为整个mysql服务的生命周期。

查看全局变量:show global variables;

设置变量 :set 变量名 = 值

-- 查看全局变量:
show global variables;
show variables like "%sql_warnings%"; 
set sql_warnings = false;
-- 查看所有会话变量
show session variables;

select @a:= 12; -- 给变量@a赋值  同时会返回赋值后的结果
select @a;  -- 查询@a变量的值是多少

select @a=12;  -- 1 不可以用=赋值
select @a;

set @b = 10;
select @b;

set @b:=100;
select @b;