Mysql 变量 存储过程 自定义函数的使用


一. 变量

系统变量:

  • 全局变量
  • 会话变量

自定义变量:

  • 用户变量
  • 局部变量

1.会话变量与全局变量

说明: 变量由系统提供,不是用户定义,属于服务器层面

使用语法:
# 1. 查看所有的系统变量
show [global] | [session] variables;  (不加参数默认查看session)

# 2. 查看满足条件的部分系统变量
show [global] | [session] variables like '%条件%';

# 3. 查看指定的某个系统变量的值
select @@[global] | [session].系统变量名;

# 4. 为某个系统变量赋值
方式一:
set [global] | [session] 系统变量名 = 值;

方式二:
set @@[global] | [session] 系统变量名 = 值;
## 注意 ##
#全局变量的作用域: 服务器每次启动会为所有的全局变量赋初始值,针对所有的会话连接有效,但是不能跨重启(跨重启就需要修改配置文件的默认值.)

会话变量的作用域: 仅针对当前的会话连接有效.

2.用户变量(临时变量)

# 说明: 变量是用户自定义的.不是系统的

# 一、定义语法
=====================
'方式1':使用set,定义形式
set @用户变量名=值;
set @用户变量名:=值;

实例如下:
set  @temp=10;
SELECT @temp;

'方式2':使用select,定义形式
select @用户变量名:=值;

实例如下:
SELECT  @temp1:=10;
SELECT  @temp1;

# 赋值(更新用户变量的值)
set @用户变量名=值;
set @用户变量名:=值;
select @用户变量名:=值;
select 字段 into 变量名 from 表;

例子:
select count(*) into @count from 表;

# 使用(查看,比较,运算等)
select @变量名

# 作用域: 仅针对当前的会话连接有效.

3.局部变量

## 作用域: 仅针在定义它的begin end中有效.

使用步骤: 
# 应用在begin end 中的第一句话!

# 声明的方式:
declare 局部变量名 类型;
declare 局部变量名 类型 default 值;

# 赋值(更新用户变量的值)
set 局部变量名=值;     #注意这里不用@
set 变量名:=值;        #注意这里不用@
select @用户变量名:=值;    #注意这里使用@
select 字段 into 变量名 from 表;

# 使用(查看,比较,运算等)
select 变量名      #注意这里不用@


注意: 局部变量需放在begin end中才可以生效,直接使用会报错.


二. 存储过程和函数

存储过程的定义:
一组预先编译好的sql语句的集合,相当于批处理语句.

好处:
1. 提高代码重用性
2. 简化操作
3. 会减少编译次数,减少了和服务器的连接次数,增加效率


1.存储过程的创建

# 语法
create procedure 存储过程名(参数列表)
begin
    存储过程体(一组合法的sql语句)
end

# 注意:
1. 参数列表包含三部分:
参数模式 参数名 参数类型

2. 如果存储过程只有一句话,begin end就可以省略.

3. 存储过程体中的每条sql语句的结尾必须要加分号.

4. 存储过程的结尾可以使用 delimiter 重新设置定义.定义之后的语句都用此标识结尾.
语法: delimiter 结束标记   (这里不用分号)

# 参数模式:
in   该参数可以作为输入(需要调用方传入值)
out  该参数可以作为输出(该参数可以返回值)
inout 该参数可以作为输入也可以输出

参数举例
... in 表名 varchar(20)

2.多参数模式的创建和调用

call 存储过程名(实参列表值)

# 1.空参列表 (调用的时候不提供参数)
案例: 插入四条记录到表名1中
=====================================
select * from 表名1

delimiter create procedure myp1()
begin    insert into 表名1(username,password)
    values('Tom','000'),('Bom','000'),('Com','000'),('Dom','000');
end

call myp1()select * from 表名1
=====================================


# 2.创建带in模式参数的存储过程 (in在这里可以省略不写,默认就是in参数)
例: 创建存储过程实现根据女神名,查询对应男神信息.
create procedure myp2(in 女神名变量1 varchat(20))
begin 
    select 男表.*
    from 男表 bo
    right join 女表 n on bo.id=n.男友id;
    where n.name=女神名变量1
end call myp2('条件')
=====================================


# 3.创建带多个in模式参数的存储过程
例: 创建存储过程实现用户是否登录成功.
create procedure myp3(in username变量 varchar(20),in password变量 varchar(20))
begin
    declare res int default 0;  #声明res变量并初始化
    select count(*) into res    # 给res变量赋值
    from 用户表 y
    where y.username = username变量
    and y.password = password变量;
    select if(res>0,'成功','失败');     #使用变量判断
end call myp3('条件用户名','条件密码');      #调用存储过程
=====================================


# 4.创建带out模式的存储过程
例: 根据女神名,返回对应的男神名.
create procedure myp5(in 女神名变量 varchar(20),out 男神名变量 varchar(20))
begin
    select bo.男神名 into 男神名变量
    from 男神表 bo    inner join 女神表 n on bo.id=n.男友id
    where n.name=女神名变量;
end
set @bname # 用于接受out中男神名变量的返回值(可以省略不定义)
call myp5('条件女神名',@bname)
select @bname =====================================


# 5.创建带多个out模式的存储过程
例: 根据女神名,返回对应的男神名和男神魅力值
create procedure myp6(in 女神名变量 varchar(20),out 男神名变量 varchar(20),out 男神魅力值变量 int)
begin
    select bo.男神名,bo.魅力值 into 男神名变量,男神魅力值变量
    from 男神表 bo    inner join 女神表 n on bo.id=n.男友id
    where n.name=女神名变量;
end
call myp5('条件女神名',@bname,@b魅力值) select @bname,@b魅力值
=====================================


# 6.创建带inout模式的存储过程
例: 传入a和b,最终a和b翻倍返回
create procedure myp8(inout a int,inout b int)
begin
    set a=a*2;
    set b=b*2
end set @m=10
set @n=20 call myp8(@m,@n)
select @m,@n $

3.经典案例:


4.存储过程的删除

# 语法
drop procedure 存储过程名;

#一次只能删除一个.

5.存储过程的查看

# 查看库中的存储过程和函数
show procedure status; //存储过程
show function status;     //函数

# 语法
show create procedure 存储过程名;

# 注意!! 存储过程存储在系统的mysql表下的proc表中.

6.存储过程的修改

一般不能修改.推荐删除重建.


案例 :



案例:



三. 自定义函数

1.创建

create function 函数名(参数列表 参数类型) returns 返回类型
begin
    函数体...;
    return 值;
end $

# 注意:
函数体: 一定会有return语句,否则会报错.

2.调用

select 函数名(参数列表);
执行函数中的语句显示返回值

# 1.无参有返回值
案例 : 返回公司的员工个数
delimiter create function myf() returns int
begin
    declare c int default 0;  #定义变量
    select count(*) into c    #赋值给变量
    from 员工表;
    return c;
end
select myf() # 2.有参有返回
案例 : 根据员工名,返回他的工资.
create function myf(员工名变量 varchar(20)) returns double #double是工资对应的数据类型
begin
    set @sal=0;   #定义用户变量
    select 工资 into @sal   #赋值
    from 工资表
    where 姓名 = 员工名变量;
    return @sal;
end
select myf('员工名') $

3.查看函数

show create function 函数名;

# 注意!! 存储过程存储在系统的mysql表下的proc表中.

4.删除函数

drop function 函数名;

5.修改函数

与存储过程相同,不建议修改,一般删除重建.


Copyright © 2009 - Now . XPBag.com . All rights Reserved.
夜心的小站 » Mysql 变量 存储过程 自定义函数的使用

提供最优质的资源集合

立即查看 了解详情