??常用的SQL语句在执行时需要先编译,然后执行;而存储过程(Store Procedure)是经编译后存储在数据库中的SQL语句集,在数据库中创建和保存。
??SQL语句中不能使用存储过程,但可以使用函数。
存储过程 | 函数 | |
---|---|---|
特点 | 功能相对负责 | 功能针对性较强 |
参数 | IN、OUT、INOUT | IN |
返回参数 | 可以返回参数 | 可以返回值、表对象 |
返回类型 | 不需指明返回的类型 | 需要指明返回的类型,且需包含return语句 |
函数体 | 可以使用非确定函数 | 不能使用非确定函数 |
??在MySQL中默认是以分号作为语句的结束标志,但若语句中包含分号,则语句会提前结束,达不到语句应有的功能,因此,通过此命令可修改结束标志的符合。语法如下:
delimiter $$
create procedure sp_name (proc_parameters[,...]) [characteristic...] routine_body;
参数 | 说明 |
---|---|
sp_name | 存储过程的名称 |
routine_body | SQL代码,可以使用begin...end来包含SQL代码 |
proc_parameters | 存储过程的参数,格式为:[IN | OUT | INOUT] param_name type; |
characteristic | 参数有多种取值,详见下表 |
characteristic参数 | 说明 |
---|---|
language SQL |
说明routine_body部分SQL语句,默认值 |
[not] deterministic |
deterministic说明结构是确定的,即每次执行存储过程,相同的输入总会得到相同的输出;反之(默认值)亦然 |
{contains SQL | no SQL | reads SQL data | modifies SQL data} |
contains SQL表示子程序包含SQL语句,但不包含读或写数据的语句(默认值);no SQL表示子程序不包含SQL语句;reads SQL data表示子程序中包含读数据的语句;modifies SQL data表示子程序中包含写数据的语句 |
SQL security {definer | invoker} |
definer表示只要定义者才能执行(默认值),invoker表示只有调用者才能执行 |
comment ‘string‘ | 注释信息 |
create function sp_name ([func_parameter[,...]]) returns type [characteristic...] routine_body;
参数 | 说明 |
---|---|
sp_name | 存储过程的名称 |
routine_body | SQL代码,可以使用begin...end来包含SQL代码 |
func_parameter | 函数参数,格式为:param_name type;characteristic ,参数同上 |
show {procedure | function} status [like ‘pattern‘];
参数中,用来匹配自定义存储过程名称或函数名称,若省略则显示所有的存储过程或函数。
show create {procrdure | function} sp_name;
参数中,sp_name为自定义存储过程名称或函数名称。
select * from information_schema.routines [where routine_name=‘pattern‘];
参数中,pattern为自定义存储过程名称,若省略则显示所有的存储过程。
alter procedure sp_name [characteristic...];
参数中,characteristic与创建存储函数时相同。
drop {procedure | function} [if exists] sp_name;
-- 调用存储过程
call sp_name([param])
-- 调用函数
select sp_name([param])
declare var_name[, ...] type [default_value];
使用declare定义的变量只能在begin…end中有效,且declare语句必须在复合语句的开头。
set @var_name = defalut_value;
使用set定义的变量为用户变量,必须在定义时赋值,可在任意位置定义、不用显式声明类型。
set var_name = value[, ...];
使用set进行赋值,可同时给多个变量赋值。
select col_name[, ...] into var_name[, ...] table_expr;
使用select语句进行赋值,table_expr为select语句中from之后的字句。
@var_name
变量使用直接在其前面添加@符号即可。
select @var_name [from dual];
??定义条件和处理主要用于在处理过程中遇到问题时的相应处理步骤。
declare condition_name condition for {SQLstate SQLstate_value | MySQL_error_value};
其中,condition_name是条件名称。
示例代码如下:
-- 捕获SQLstate_value
declare can_not_find condition for SQLstate ‘13d12‘;
-- 捕获MySQL_error_code
declare can_not_find condition for MySQ_error_code 1111;
declare handler_type handler for condition_value[, ...] sp_statement;
参数 | 参数值 | 说明 |
---|---|---|
sp_statement | 表示一些存储过程或函数的执行语句 | |
handler_type | continue、exit、undo | continue表示继续执行;exit表示退出;undo表示撤回之前的操作,MySQL暂时不支持这种方式 |
condition_value | SQLstate SQLstate_value、MySQL_error_code、condition_name、SQLwarning、not found、SQLexception | 前两种与条件创建的类似;condition_name表示使用创建的条件名称;SQLwarning表示所有以01开头的SQLstate_value值;not found表示所有以02开头的SQLstate_value值;SQLexception表示其他类型的SQLstate_value值 |
示例代码如下:
-- 捕获SQLstate_value
declare continue handler for SQLstate ‘42s02‘ set @info=‘can not find‘;
-- 捕获MySQL_error_code
declare continue handler for 1146 set @info=‘can not find‘;
-- 先定义条件,然后调用
declare can_not_find condition for 1146;
declare continue handler for can_not_find set @info=‘can not find‘;
-- 使用SQLwarning
declare exit handler for SQLwarning set @info=‘can not find‘;
-- 使用not found
declare exit handler for not found set @info=‘can not find‘;
-- 使用SQLexception
declare exit handler for SQLexception set @info=‘can not find‘;
??游标声明位置必须在处理程序之前,在变量和条件之后。游标是只读的,不能更新的,不能滚动的。游标只能在存储过程或函数中使用。
declare cursor_name cursor for select_statement;
其中,cursor_name为游标名称,select_statement为select子句,且不能带有into子句。
??一个游标可以被打开多次,但每次打开的结果可能会不同。
open cursor_name;
fetch cursor_name into var_name[, ...]
??需要注意,into子句中变量的个数必须与select子句中列的数目相同。
close cursor_name;
if search_condition then statement_list
[elseif search_condition then statement_list]
...
[else statement_list]
end if;
其中,search_condition为条件判断语句,statement_list为执行语句。
case case_value
when when_value then statement_list
[when when_value then statement_list]
...
[else statement_list]
end case;
其中,case_value为条件判断的变量,statement_list为执行语句。
leave label
其中,label为标签,一般结合loop语句使用,表示跳出循环。
iterate label
其中,label为标签,一般结合loop语句使用,表示跳出本次循环。
[begin_label: ] loop
statement_list
end loop [end_label]
其中,statement_list为执行语句。
-- loop结合leave、iterate示例代码
add_num: loop
set @count = @count + 1;
if @count = 10 then leave add_num;
elseif mod(@count, 2) = 0 then iterate add_num;
end loop
[begin_label: ] repeat
statement_list
until search_condition
end repeat [end_label]
其中,search_condition为条件判断语句,表示当满足条件时跳出循环语句。
[begin_label: ] while search_condition do
statement_list
end while [end_lable]
其中,search_condition为条件判断语句,表示当满足条件时执行循环语句。
??常见的系统函数:Mysql常用函数大全(分类汇总讲解)_Mysql_脚本之家 (jb51.net)
原文:https://www.cnblogs.com/bpf-1024/p/14059827.html