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;
```