Mysql存储过程_函数等

前言

博主github

博主个人博客http://blog.healerjean.com

2、mysql的变量(上面没有declare会报错)

可能会发现直接set 变量名=值;也可以定义“用户变量”;

但这是一种不好的行为【这种行为忽略了各自变量的功能】,因为不知道会不会跟系统变量冲突(系统变量,不能随便定义名字,否则会报错)),所以最好用户变量加上@,系统变量加上@@

2.1、系统变量(不能随便定义名字,否则会报错)

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

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

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

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


set 变量名 =;  【比如常用的set names ="utf8";set @@变量名=//建议使用

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


set global 变量名 =;

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


show variables;

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


select @@变量名;

2.2、用户变量

用户变量就是用户自己定义的变量。

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

2.2.1、定义用户变量:

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

变量的定义方式:

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



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


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

select @setName ;

2.2.3、局部变量:

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

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

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

先使用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() ;
 

存储过程和函数的区别

1、调用方面:函数在sql语句中就可以使用(比如可以作为查询语句的一部分来调用),存储过程一般是独立执行的语句
2、返回结果方面:函数只能返回一个变量,存储过程可以返回多个变量、结果集
3、复杂性方面,存储过程的实现比较复杂一些,

1、函数

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管理部

1.2、定义方法


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

1.3、删除


drop function myselect2 ;

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('广告部');


3、存储过程

存储过程主要返回三类

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

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

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

3.1、in

in:限定这个参数是传值给存储过程,既然是传值,所以可以是变量或常量数据
【in修饰的参数一般是传入存储过程中作为某些条件的,不会被存储过程修改】

3.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  ;





感兴趣的,欢迎添加博主微信



哈,博主很乐意和各路好友交流,如果满意,请打赏博主任意金额,感兴趣的在微信转账的时候,备注您的微信或者其他联系方式。添加博主微信哦。

请下方留言吧。可与博主自由讨论哦

微信 微信公众号 支付宝
微信 微信公众号 支付宝
posted @ 2019-03-11 15:33  HealerJean  阅读(42)  评论(0编辑  收藏  举报