sql_stored

  1. 存储过程
    1. 变量
  2. 存储函数

存储过程

介绍:事先经过编译并存储在数据库中的一段sql语句的集合,调用存储过程并可以简化应用开发任意的许多工作。减少数据在数据库和应用数据库之间的传输。

数据库sql语言层面的代码封装和重用。

特点:

封装,复用。

可以接收参数,也可以返回数据

减少网络交互,效率提升

创建:

create procedure 存储过程名称([参数列表])
begin
    --sql语句
end;

调用:

call 名称([参数]);

查看

select * from information_schema.routines_schema='xxx';--查询指定数据库的存储过程及状态信息
show create procedure 存储过程名称;--查询某个存储过程的定义

删除

drop procedure [if exists] 存储过程名称;

注意:在命令行中,执行创建存储过程的sql时,需要通过关键字delimiter指定sql语句的结束符

变量

系统变量是mysql服务器提供的,不是用户定义的,属于服务器层面。分为全局变量(global),会话变量(session)。

查看系统变量

show [session|global] variables; --查看所有系统变量
show [session|global] variables like '...'; --可以通过like模糊匹配方式查找变量
select @@[session|global]系统变量名; --查看指定变量的值

设置系统变量

set [session|global] 系统变量名=值;
set @@[session|global]系统变量名=值;

注意:如果没有指定session/global,默认是session,会话变量

mysql服务重新启动之后,所设置的全局参数会失效,要想不失效,可以在/etc/my.cnf中配置

用户定义变量

是用户根据需要自己定义的变量,用户变量不用提取声明,在用的时候直接用“@变量名”使用就可以。其作用域为当前连接。

赋值:

set @var_name=expr [,@var_name=expr]...;
set @var_name:=expr [,@var_name:=expr]...;
select @var_name:=expr [,@var_name:=expr]...;
select 字段名 into @var_name from 表名;

使用

select @var_name;

注意:用户定义的变量无需对其进行声明或初始化,只不过获取到的值为null。

局部变量

是根据需要定义的在局部生效的变量,访问之前,需要declare声明。可用作存储过程内的局部变量和输入参数,局部变量的范围是在其内声明的begin…end块。

声明

declare 变量名 变量类型[...];

赋值

set 变量=值;
set 变量名:=值;
select 字段名 into 变量名 from 表名...;

if

if ... then 
    ...
elseif ... then 
    ...
else 
    ...
end if;

参数

类型 含义 备注
in 该类参数作为输入,也就是需要调用时传入值 默认
out 该类参数作为输出,作为返回值
inout 即可以作为输入参数,也可以作为输出参数
create procedure 存储过程名称([in/out/inout 参数名 参数类型])
begin

end;

case

case ...
    when ... then ...
    ..
    [else ...]
end case;
case 
    when ... then ...
    ..
    [else ...]
end case;

while

while ... do
    ...
end while;

repeat

repeat 
    ..
    until ...
end repeat;

loop

[begin_lable:] loop
    ...
end loop[end_label];

leave label;--退出指定标记的循环体
iterate label;--直接进入下一次循环

游标:

用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。

声明

declare ... cursor for ...;

打开

open ...;

获取游标记录

fetch ... into 变量[,变量];

关闭游标

close ...;

条件处理程序

declare handler_action  handler for condition_value[,condition_value]... statement;

handler_action
    continue:继续执行当前程序
    exit:终止执行当前程序
condition_value
    sqlstate sqlstate_value:状态码,如02000
    sqlwarning:所有以01开头的sqlstate代码的简写
    not found:所有以02开头的sqlstate代码的简写
    sqlexception:所有没有被sqlwarning或not found捕获的sqlstate代码的简写

存储函数

存储函数是有返回值的存储过程,存储函数的参数只能是in类型

create function 存储函数名称([参数列表])
returns type [characteristic ...]
begin
    ...
    return ...;
end;

characteristic说明

​ deterministic:相同的输入参数总数产生相同的结果

​ no sql:不包含sql语句

​ reads sql data:包含读取数据的语句,但不包含写入数据的语句


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。