前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

1、Mysql的变量

1.1、系统变量

注意:不能随便定义名字,否则会报错

系统变量中全局变量和会话变量其实是使用一套变量,不同的是会话变量仅当次会话生效

1、会话变量(会话变量仅当次会话生效)

2、全局变量(一直生效的变量)

1.1、会话变量的赋值:set @@变量名=值


set 变量名 = ;  【比如常用的set names ="utf8";

set @@变量名= //建议使用

2.2、全局变量的赋值:set global 变量名 = 值;


set global 变量名 = ;

2.3、查看所有系统变量:show variables;


show variables;

2.4、系统变量的使用 select @@变量名;


select @@变量名;

1.2、用户变量

用户变量就是用户自己定义的变量。 用户变量都是会话级的变量,仅在当次连接中生效。

1.2.1、定义用户变量:

系统为了区别系统变量跟用户变量,规定用户变量必须使用一个@符号,可以不定义直接使用,默认为null,比如存储过程的地方使用过

set @变量名=1 //建议使用
select @变量名 := ;
select  into @变量名;



测试
set @setName = 'HealerJean' ;
select @setName := 'HealerJean 2' ;
select 1 into @setName ;


2.2.2、查询用户变量:select @setName ;

select @setName ;

2.2.3、局部变量:

由于局部变量是用户自定义的,可以认为局部变量也是用户变量【但有所不同,局部中不需要使用@】

用法:局部变量一般用在sql语句块中,比如存储过程块触发器块

2.2.4、局部变量的定义方法:

先使用declare声明局部变量,其中可选项default后面可以跟默认值:【非常重要的一步,不然会设置成用户变量】


不写 declare 会报错

示例:declare myq int;
示例:declare myq int default 666;

设置变量的值:


set 变量名= 值;

获取变量的值:


select 变量名;

举例:

函数
create function funParam(dept_name varchar(20)) returns int
  begin
    declare c int;
#     c = 1 ; 报错
    set c = 1 ;
    return c ;
  end ;



  
存储过程
create procedure myset()
  begin
    declare mya int;
    declare myq int default 777;
    set myq=6;
    set mya=666;
    select mya,myq;
  end;
  
call myset() ;
 

2、存储过程和函数的区别

1、调用方面:函数在sql语句中就可以使用(比如可以作为查询语句的一部分来调用),存储过程一般是独立执行的语句

2、返回结果方面:函数只能返回一个变量,存储过程可以返回多个变量、结果集

3、复杂性方面,存储过程的实现比较复杂一些,

2.1、函数

2.1.1、测试表

create table department (
  dept_id int(11) default 0 comment '部门id',
  dept_name varchar(20) default '' comment '部门名称'
)comment ='部门' ;

INSERT INTO department (dept_id, dept_name) VALUES (1, '广告部');
INSERT INTO department (dept_id, dept_name) VALUES (2, '媒体部');
INSERT INTO department (dept_id, dept_name) VALUES (3, '管理部');

dept_iddept_name
1广告部
2媒体部
3管理部

2.1.2、创建函数


create function 函数名([参数列表]) returns 数据类型
begin
 sql语句;
 return ;
end;

2.1.3、删除函数

drop function myselect2 ;

2.1.4、函数创建和使用

1.4.1、最简单的


create function myselect2() returns int return 666;


create function funSelectBySql() returns int
  begin
    declare c int;
    select dept_id from department where dept_id= 1 into c;
    return c;
  end;
  

mysql> create function myselect2() returns int return 666;

mysql> select  myselect2() ;
+-------------+
| myselect2() |
+-------------+
| 666         |
+-------------+
1 rows in set (0.01 sec)

sql> select funSelectBySql()



1.4.2、传入参数


create function funParam(dept_name varchar(20)) returns int
  begin
    declare c int;
    select d.dept_id from department  d where d.dept_name =dept_name into c;
    return c ;
  end ;

select funParam('广告部');


2.2、存储过程

1、返回数值得的存储过程,其执行完后返回一个值,例如数据库中执行一个有返回值的函数或命令

2、返回记录集的存储过程:执行结果是一个记录集,例如,从数据库中检索出符合某一个或几个条件的记录

3、行为存储过程,用来实现数据库的某个功能,而没有返回值,例如在数据库中的更新和删除操作。

2.1.1、in

限定这个参数是传值给存储过程,既然是传值,所以可以是变量或常量数据

注意:in修饰的参数一般是传入存储过程中作为某些条件的,不会被存储过程修改

2.1.2、out

out:限定这个参数是存储过程传出的一个值,因为有值的返回,所以这个参数必须是一个变量

注意:存储过程中会给out修饰的变量赋值,使得过程外部可以获取这个更改的值

3.3、inout:inout

是上面两者的叠加,既可以被存储过程内部使用,又可以修改后被外部使用,因为有值的返回,所以这个参数必须是一个变量

-- 最简单的例子
create procedure myselect()
begin 
    select @@version;
end;

call myselect();


create procedure getInfo(in mname varchar(15))
begin 
select mname;
end;

call getInfo("lilie");



-- 能通过传参来获取指定内容的
create procedure getInfo2(in mname varchar(15))
begin 
select * from student where name =mname;
end;

call getInfo2("lilei");



-- 将结果赋值给一个变量传到外部
select * from coupon_adzone ;

create procedure getInfo3(in mname varchar(15),out oname varchar(15))
  begin
    select c.adzoneName from coupon_adzone c where c.adzoneName =mname into oname;
 #  select * from coupon_adzone ;
  end;

call getInfo3('藏宝阁',@oname );     
#不会在muysql执行器中返回数据,除非加上后面的 select * from coupon_adzone,可以返回数据
select @oname  ;

ContactAuthor