Mysql 存储过程

存储过程

创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- DELIMITER是定义sql语句中,让mysql执行语句的的判断符号,
-- 只有当遇到定义的符号后,mysql解释器才会执行符号之前的所有语句,默认为;,但是在存储过程中;与此相冲突,所以得自定义
DELIMITER //
-- 输出类型分为in、out、inout:输入型、输出型、可输入也可输出
CREATE PROCEDURE sp_name (输出类型 变量名 变量类型, .... )
-- 存储体一般用BEGIN ... END包裹
BEGIN
-- 声明变量
DECLARE 变量名 变量类型 default 默认值;
-- 设置变量值
SET 变量名 = 变量值;
执行得存储内部语句
END
//
DELIMITER; -- 将mysql解释器得执行判定符号修改回;

存储的参数:

  • 输入型参数:只允许调用存储的时候传递给存储,并不会返回,用于接受参数
  • 输出型参数:只允许调用存储的时候返回,并不会接受传递进去的该位置的参数,用于返回参数,一般传递的都是用户参数
  • 输入输出型参数:即可以接受参数,也可以输出参数,不过尽量不要用

用户参数:

1
2
3
4
5
6
-- 新增用户变量则需要通过 select @变量名:=变量值 进行赋值初始化
select @name:=1 as a

-- 修改/初始化用户变量,@var:=value 或者 @var=value都可以
set @name=1
set @name:=1

执行

1
2
# 即使储存没有参数,也要用小括号包裹
call 存储名(参数)

查看

1
2
3
4
5
6
7
8
9
-- 数据库中的查询,如果需要包裹,则用`
-- 查看一个数据库中所有的存储过程
show procedure status where db=`数据库名`;

-- 查看指定存储过程的状态信息
show procedure status like `存储过程名`;

-- 查看存储过程语句
show create procedure `存储过程名`

修改

1
2
3
-- mysql不支持存储过程内容的修改,但是可以修改存储的名称,涉及存储内容的请删除重建把
-- 删除存储
drop procedure `存储过程名`

存储函数

创建

1
2
3
4
5
6
7
8
9
10
11
DELIMITER // 
CREATE FUNCTION func_name (变量名 变量类型, .... ) RETURNS 返回值类型
COMMENT '存储函数的描述文字'
BEGIN
DECLARE 变量名 变量类型 default 默认值;
SET 变量名 = 变量值;
-- 返回值要与返回值类型一致,否则会被强制转换
RETURN (返回值)
END
//
DELIMITER; -- 将mysql解释器得执行判定符号修改回;

执行

1
2
# 即使存储函数没有参数,也要用小括号包裹
select 存储名(参数)

查看

1
2
3
4
5
6
7
8
-- 查看数据库中所有的函数
show function status where db=`数据库名称`

-- 查看一个存储函数的详细状态
show function status like `存储函数名`

-- 查看存储函数的详细内容
show create function `存储函数名`

删除

1
drop function `存储函数名`

流程控制

条件

  • if … then … elseif … then … else … end if

    1
    2
    3
    4
    if num > 0 then data = 1;
    elseif num>1 then data = 2;
    else data = 3 ;
    end if;
  • case … when .. then .. else … end case

    1
    2
    3
    4
    5
    case num 
    when 1 then data = 2;
    when 2 then data =3;
    else data = 4;
    end case;

循环

  • while … do … end while

    1
    2
    3
    while a<0 do
    data = 1;
    end while;
  • repeat … until … end repeat

    1
    2
    3
    repeat
    data = 1;
    until a<0 end repeat;
  • 还有一些其它的,不过暂时没用到