武林秘籍之存储过程和函数
简介:大家好,我是醉心于武术的功夫小白,今天我在扔垃圾的时候,意外发现垃圾桶旁边躺着一本不起眼的书籍,心里却泛起一种莫名的躁动,像是受到某种神秘力量的召唤,眼看四下无人一把塞进怀里跑回家。透过门上的猫眼确定没人尾随后,我颤颤巍巍地从怀里摸出那本被捂得有点烫手的书籍,泛黄残缺的封面在昏暗的灯光下有种天书古卷的味道。我的手不禁颤抖了起来,封面越破记载的功夫越厉害,在电视里长这样的怎么也得是名震天下的武林秘籍,而我必然是头顶光环准备逆袭的废柴主角。我压抑着狂乱的心跳翻开了第一页,一道道浅浅的金光从书中射出,书上赫然写着一行金色字体——《Mysql之存储过程和函数篇》。竟然是冠绝天下,多年前却突然在江湖销声匿迹只留下无数传说的《Mysql宝典》,我迫不及待地继续往下翻,只要学会了我将会是江湖的下一个传说。
一、宝典介绍
这招威震武林的杀招— —存储过程,他厉害之处是并不拘泥于固定的招式,可以灵活地将各种招式组合成一个连招来达到意想不到的效果,减少与敌人交手的次数,一招制敌是最高效安全的,减少程序与数据库的交互次数也是如此。
二、宝典第一式— —安装数据库
要想成功,必先自— —行安装Mysql
三、宝典第二式— —查看存储过程
在学习存储过程之前,先来了解如何运功查看自己身上有没有学过这招存储过程,便于以后自己可以查看是否已经学会,也就是看看存储过程有没有创建成功,还是解释一下,毕竟像我一样天资聪颖的奇才也不多;
- 查看数据库的存储过程的命令:
--第一招,如图一
show procedure status where db='数据库名称';
--可以在后面添加“\G”显示详情,如图二
show procedure status where db='数据库名称'\G;
--第二招
select routine_name from information_schema.routines where routine_schema='数据库名称';
--第三招
select name from mysql.proc where db='数据库名称';
图一:
图二:
四、宝典第三式— —创建存储过程
到了我最关心的环节了,开始学习如何创建属于自己的必杀技— —存储过程。开始创建存储过程之前我们要热热身,做些准备工作。
因为存储过程是由多行语句组成的,避免使用分号“;”分隔符时系统判定我们为结束编辑,我们可以先执行“delimiter $”指令修改结束符为“ $ "符,也可以是别的,你喜欢就好,不喜欢就别勉强,强扭的符号不甜。你偏要犟就是不改别人也拿你没办法,但这就是天堂有路你不… …
1、简单的存储过程的创建和调用
-- 因为存储过程是由多行语句组成的,避免使用分号“;”分隔符时系统判定我们为结束编辑,我们得先修改结束符
delimiter $
--创建简单存储过程
create procedure a()
begin
select ("第一个存储过程");
select ("第一招,亢龙有悔");
select ("第二招,万佛朝宗");
end$
--调用存储过程
call a()$
如图:
2、带变量的存储过程的创建和调用以及两种赋值方式
定义变量:
- 通过declare variableName variableType default value 定义变量,使用default给变量设置默认值
存储过程变量的两种赋值方式:
- 通过set给变量赋值
- 通过select …into …给变量赋值
--创建带变量的存储过程
create procedure b()
begin
declare num int default 5;
set num=num+5;
select concat('通过set方法为变量赋值为:',num);
select count(*) into num from t_account;
select concat('通过select...into...方法为变量赋值',num);
end$
--调用函数
call b()$
如图
3、带参数的存储过程的创建和调用
存储过程有三种参数格式:in、out、inout
- in:往存储过程传入数据,参数类型可以为常量和变量;
- out:存储过程向外传出数据,参数类型只能为变量;
- inout:表示既往存储函数传入参数,存储函数又向外传出数据,参数类型只能为变量;
(1)in类型参数的使用实例,可传入常量和变量,存储过程函数体只有一句的时候可以省略begin和end
--创建带in类型参数的存储过程
create procedure c(in num int,in name varchar(50))
begin
SELECT concat("我!",name,",要打",num,"个!");
end$
-- 设置会话变量
set @name='叶问'$
-- 调用存储过程,可传入常量和变量
call c(10,@name)$
图一:
(2)out类型参数的使用实例,只能传入变量,否则会报错
--创建带out类型的存储过程
create procedure d(out text varchar(100),out num int)
begin
set num=10;
select concat('我!叶问,要打',num,'个!') into text;
end$
--调用存储过程
call d(@a,@b)$
--查看传出的参数
select @a,@b$
如图:
(3)inout类型参数的使用实例,只能传入变量
-- 创建带inout类型参数的存储过程
create procedure e(inout name varchar(100),inout num int)
begin
select concat('我!',name,',也要打',num,'个!');
set name="张三";
set num=9;
end$
--设置要传入的变量值
set @a='叶问',@b=10$
--调用存储过程
call e(@a,@b)$
--查看存储过程传出的值
select @a,@b$
如图: