1.什么是mysql存储过程 存储过程[Stored Procedure]是一组[或者是若干条SQL]为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数[如果该存储过程带有参数]来调用执行它。 2.存储过程的创建 --创建语法: ``` create procedure procedureName() --同一个数据库中,存储过程名具有唯一性 begin #SQL语句集 end ``` 举个栗子:创建一个查询当前时间的存储过程 ``` delimiter $$ create procedure procedureName() begin select now() as nowtime; end $$ delimiter; ``` 这样我们就完成了第一个存储过程的创建,创建成功之后我们如何调用呢,在你的SQL语句中,只需要 ``` call procedureName() --select 存储过程名 即可调用 ``` ``` 当然,你还可以查看所有的存储过程: show procedure status; ``` 3.存储过程中变量的引用 存储过程中可以通过引用变量来完成复杂的编程,在存储过程中使用 declare 来声明变量, 格式如下: ``` declare 变量名[一般不以@开头且具有一定意义[@是mysql的关键字]] 变量类型[变量类型包括:数值类型[tinyint,int/integer,bigint,float,double,decimal],时间日期类型,字符串类型,][default 默认值[可选]] ``` 又一个栗子: ``` delimiter $$ --delimiter 定义结束符 create procedure procedureName() begin --开始存储过程 declare age int default 18; --声明一个int类型的age变量,并且默认值为18 declare myname varchar(255) default 'xiaoxiao'; --声明一个myname的varchar类型的变量,默认值为'xiaoxiao' select CONCAT(myname,age) as descr; --查询刚刚定义的变量并取别名为descr end $$ --结束存储过程 delimiter; --将mysql的存储过程设置为 ; ``` 既然我们可以为存储过程赋值,那么我们可以想到是否可以在存储过程中进行变量的计算,答案也是也可以的,再来一个栗子: ``` delimiter $$ create procedure procedureName() begin declare age int default 18; declare height int default 171; set age := age + 18; -- 变量的加法运算,变量的运算格式为,set 变量名 := 变量名 运算符[+,-,* ,/]值 select age; end $$ delimiter; --调用 call procedureName() --结果为 age 36 ``` 4.mysql中的流程控制 举个栗子说明一下: ``` delimiter $$ create procedure procedureName() begin declare age int default 18; declare height int default 171; set age := age + 18; -- 变量的加法运算,变量的运算格式为,set 变量名 := 变量名 运算符(+,-,* ,/)值 if age > 30 then select '30岁,中年啦'; else select '小年轻'; end if; -- end if结束if语句块 end $$ delimiter; ``` 调用的结果为:'30岁,中年啦'; 类似的语句还有 case...when... 5.存储过程参数的传递 存储过程主要分为三种参数类型,in[输入参数],out[输出参数],INOUT[输入输出参数] IN[输入]参数类型:该参数的值必须在调用存储过程时指定,如果在调用存储过程中修改该参数的值则该值不能被返回 IN参数类型: 基本格式: ``` delimiter $$ create procedure InType(in type char) -- 参数类型[IN/OUT/INOUT,参数名,参数类型[int,char,varchar等...]] begin IF type='A' THEN SELECT '我是IN参数A'; ELSEIF type='B' THEN SELECT '我是IN参数B'; ELSE SELECT '其他'; END IF; end $$ delimiter; ``` 调用: ``` call InType('A'); -- 输出'我是IN参数A' ``` OUT[输出]参数类型: ``` delimiter $$ create procedure outType(OUT type int) begin secelt type = 1+2; end $$ delimiter; ``` 调用: ``` call outType(@type); --输出 3 ``` INOUT[输入输出]参数类型: ``` delimiter $$ create procedure inoutType(INOUT ntime INT) begin declare nowtime INT(11); --定义变量 IF ntime > (select unix_timestamp) THEN --判断 SET nowtime = (select unix_timestamp); ELSE SET nowtime = ntime; END IF; SET ntime = nowtime; --返回赋值 end $$ delimiter; -- 传递一个时间戳,mysql对当前时间戳进行判断,如果传递进来的时间戳大于当前时间戳,设置nowtime变量为当前时间戳,否则则为传递进来的时间戳,并输出结果 ``` 一个开发过程中使用存储过程快速填充表的栗子: 栗子中user表有四个字段,分别为,name,age,sex,is_delete,快速为表填充6百万的测试数据,如下: ``` delimiter $$ create procedure fillData() begin set @i =1; --set 定义变量 while @i<=6000000 do --开始循环,循环变量小于6000000 insert into user (name,age,sex,is_delete)values(CONCAT("我是第",@i,"个name"),(SELECT RAND() * 20),(SELECT RAND() * 2),(SELECT RAND() * 1)); --批量向表里面插入6百万条数据,CONCAT为拼接字符串 set @i = @i+1; --变量累加 end while; --结束循环 end $$ delimiter; ```