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 @变量名 := 值;
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.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_id | dept_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 ;
感兴趣的,欢迎添加博主微信
哈,博主很乐意和各路好友交流,如果满意,请打赏博主任意金额,感兴趣的在微信转账的时候,备注您的微信或者其他联系方式。添加博主微信哦。
请下方留言吧。可与博主自由讨论哦
微信 | 微信公众号 | 支付宝 |
---|---|---|