1. 创建存储过程create procedure procedure_name ([proc_param[,...]]) [characteristic ...] routine_body
procedure_name 表示所要创建的存储过程的名字
proc_param 表示存储过程的参数
characteristic 表示存储过程的特性
routine_body 表示存储过程的 sql 语句
procedure_name 不能出现重名
proc_param 中每个参数的语法形式如下,每个参数由三部分组成,分别为输入/输出类型、参数名和参数类型。共有三种输入输出类型,分别是in、out、inout。param_name 表示参数名,type 表示参数类型
[ in | out | inout ] param_name type
characteristic 指定存储过程的特性,有以下取值:
language sql:说明存储过程中使用的是 sql 语言编写的
[not] deterministic:说明存储过程执行的结果是否正确,deterministic 表示结果是确定的,即每次执行存储过程,相同的输入会得到相同的输出;not deterministic 表示结果是不确定的,相同的输入可能得到不同的输出,默认为 not deterministic
{contains sql | no sql | reads sql data | modifies sql data}:指明子程序使用 sql 语句的限制,contains sql 表示子程序不包含读或者写数据的语句,no sql 表示子程序不包含 sql,reads sql data 表示子程序包含读数据的语句,但是不包含写数据的语句,modifies sql data 表示子程序包含写数据的语句
sql security {definer | invoker}:指明谁有权限执行,definer 表示只有定义者才能执行,invoker 表示拥有权限的调用者可以执行,默认为 definer
comment 'string':注释信息,可以用来描述存储过程或函数
示例:创建存储过程,查询表 t_employee 中所有员工的薪水的存储过程
delimiter $$create procedure proc_employee()comment '查询员工薪水'begin select salary from t_employeeend;$$delimiter ;
mysql 中默认以分号 ; 作为语句结束符,存储过程中的 sql 语句需要分号来结束,为了避免冲突,先用 delimiter $$ 将 mysql 的结束符设置为 $$,再用 delimiter ; 将结束符恢复为分号
2. 创建存储函数create function fun_name([func_param,[,...]]) [characteristic ...] routine_body
fun_name 表示函数名字
func_param 表示函数从参数
characteristic 表示函数特性,取值与存储过程的取值相同
routine_body 表示函数的 sql 语句
func_param 中每个参数的语法形式如下,分别为参数名和参数类型
param_type type
还是之前的示例
delimiter $$ create function func_employee(id int(4)) returns int(6) comment '查询员工薪水' begin select salary from t_employee end; $$delimiter ;
2|0变量在 mysql 中,可以定义和使用变量,这些变量的作用范围在 begin ... end 程序段中
1. 定义变量declare var_name[,...] type [default value]
关键字 declare 用来声明变量
参数 var_name 是变量的名称,可以同时定义多个变量
参数 type 用来指定变量的类型
default value 子句将变量默认值设置为 value,没有使用 default 子句时,默认值为 null
示例:定义变量 sql_test,数据类型为 int 型,默认值为 10
declare test_sql int default 10;
2. 变量赋值set var_name=expr[,var_name=expr]...
关键字 set 用来为变量赋值
参数 var_name 是变量的名称
参数 expr 是赋值表达式
示例:将变量 sql_test 赋值为 30
set test_sql = 30;
3|0定义条件和处理程序定义条件和处理程序是事先定义程序执行过程中可能遇到的问题,并且可以在处理程序中定义解决这些问题的能力
1. 定义条件declare condition_name condition for condition_valuecondition_value:sqlstate[value] sqlstate_value|mysql_error_code
参数 condition_name 表示条件名称
参数 condition_value 表示条件类型
参数 sqlstate_value 和 参数 mysql_error_code 都可以表示 mysql 的错误
示例:定义 error 1146(42s02) 错误,名称为 can_not_find,可以用两种不同的方法来定义
// 方法一:使用sqlstate_valuedeclare can_not_find condition for sqlstate '42s02';// 方法二:使用mysql_error_codedeclare can_not_find condition for 1146;
2. 定义处理程序declare handler_type handler for condition_value[,...] proc_statementhandler_type:continue|exit|undocondition_value:sqlstate[value]sqlstate_value|condition_name|sqlwarning|not found|sqlexception|mysql_error_code
handler_type 指明错误的处理方式:该参数有三个取值:
continue:表示遇到错误不处理,继续向下执行
exit:表示遇到错误马上退出
undo:表示遇到错误后撤回之前的操作
condition_value 表示错误类型,可以有以下取值:
sqlstate[value]sqlstate_value 包含 5 个字符的字符串错误值
condition_name 表示 declare condition 定义的错误条件名称
sqlwarning 匹配所有 01 开头的 sqlstate 错误代码
not found 匹配所有 02 开头的 sqlstate 错误代码
sqlexception 匹配所有没有被 sqlwarning 或 not found 捕获的 sqlstate 错误代码
mysql_error_code 匹配数值类型错误代码
proc_statement 匹配数值类型错误代码
下面是定义处理程序的几种示例方式:
// 方法一:捕获sqlstate_valuedeclare continue handler for sqlstate '42s02'set @info='not found';// 方法二:使用mysql_error_code declare continue handler for 1146set @info='not found';// 方法三:先定义条件,然后调用eclare can_not_find condition for 1146;declare continue handler for can_not_findset @info='not found';// 方法四:使用sqlwarningdeclare exit handler for sqlwarning set @info='error';// 方法五:使用not founddeclare exit handler for not foundset @info='not found';// 方法六:使用sqlexception declare exit handler for 使用sqlexceptionset @info='error';
4|0光标在存储过程和函数中,可以使用光标逐条读取查询结果集中可能出现的多条记录。光标必须声明在处理程序之前,声明在变量和条件之后
1. 声明光标declare cursor_name cursorfor select_statement;
参数 cursor_name 表示光标名称
参数 select_statement 表示 select 语句
下面声明一个名为 cur_employee 的光标
declare cur_employee cursorfor select name,age from t_employee;
2. 打开光标open cursor_name;
参数 cursor_name 表示光标的名称
下面打开一个名为 cur_employee 的光标
open cur_employee;
3. 使用光标fetch cursor_nameinto var_name[,var_name...]
cursor_name 表示光标的名称
var_name 表示将光标中的 select 语句查询出来的信息存入该参数,该参数必须在声明光标之前就定义好
下面打开一个名为 cur_employee 的光标,将查询的数据存入 emp_name 和 emp_age 这两个变量中
fetch cur_employee into emp_name,emp_age;
4. 关闭光标close cursor_name
cursor_name 表示光标的名称
5|0流程控制1. if 语句if search_condition then statement_list [elseif search_condition then statement_list]... [else statement_list]end if
参数 search_condition 表示条件判断语句
参数 statement_list 表示不同条件的执行语句
下面是一个 if 语句的示例
if age>20 then set @count1=@conut1+1; elseif age=20 then @count2=@conut2+1; else @count3=@count3+1;end if;
2. case 语句case case_value when when_value then statement_list [when when_value then statement_list]... [else statement_list]end case
参数 case_value 表示条件判断的变量
参数 when_value 表示变量的取值
参数 statement_list 表示不同 when_value 的执行语句
下面的是一个 case 语句的示例
case age when 20 then set @count1=@count1+1; else set @count2=@count2+1;end case;
3. loop 语句[begin_label:]loop statement_listend loop [end_label]
参数 begin_label 和参数 end_label 分别表示循环开始和结束的标志,必须相同,而且都可以省略
参数 statement_list 表示需要循环执行的语句
下面是一个 loop 语句的示例
add_num:loop select @count1=@count1+1;end loop add_num
4. leave 语句主要用于跳出循环
leave label
参数 label 表示循环的标志
下面是一个 leave 语句的示例
add_num:loop select @count1=@count1+1; if @count1=100 then leave add_num;end loop add_num
5. iterate 语句也是用于跳出循环,不过是跳出本次循环,直接进入下次循环,类似 java 的 continue
iterate label
iterate label
参数 label 表示循环的标志
下面是一个 iterate 语句的示例
add_num:loop select @count1=@count1+1; if @count1=100 then leave add_num; else if mod(@count1,3)=0 then iterate add_num; select * from employee;end loop add_num
6. repeat 语句repeat 语句是由条件的控制循环语句,当满足特定条件就会退出循环语句
[begin_label:]repeat statement_list until search_conditionend repeat [end_label]
参数 statement_list 表示需要循环执行的语句
参数 search_condition 表示结束循环的条件,满足该条件即结束循环
下面是一个 repeat 语句的示例
add_num:repeat select @count1=@count1+1; until @count1=100end repeat add_num
7. while 语句while 语句也是有条件控制的循环语句,与 repeat 语句不同的是,while 语句是当满足条件时执行循环内的语句
[begin_label:]while search_condition do statement_listend while [end_label]
参数 statement_list 表示需要循环执行的语句
参数 search_condition 表示结束循环的条件,满足该条件即结束循环
下面是一个 while 语句的示例
while @count<100 do set @count=@count+1;end while;
6|0操作存储过程和函数1. 调用存储过程在 mysql 中,使用 call 语句来调用存储过程
call proc_name([parameter[,...]])
proc_name 是存储过程的名称
paramter 是指存储过程的参数
2. 调用存储函数在 mysql 中,存储函数的使用方法和 mysql 内部函数是一样的
3. 使用 show status 语句查看存储过程和函数的状态show {procedure|function} status{like 'pattern'}
参数 procedure 表示查询存储过程,function 表示存储函数
参数 like 'pattern' 用来匹配存储过程或函数的名称
4. 使用 show create 语句查看存储过程和函数的定义show create {procedure|function} proc_name
5. 从 information_schema.routine 表中查看存储过程和函数的信息select * from information_schema.routinewhere routine_name='proc_name'
6. 修改存储过程和函数alter {procedure|function} proc_name[characteristic...];characteristic: {contains sql|no sql|reads sql data|modifies sql data}|sql security{definer|invoker}|comment 'string'
参数 proc_name 表示存储过程或函数的名称
参数 characteristic 指定存储过程的特性:
contains sql 表示子程序包含 sql 语句,但不包含读或写数据的语句
no sql 表示子程序不包含 sql 语句
reads sql data 表示子程序中包含读数据的语句
modifies sql data 表示子程序中包含写数据的语句
sql security{definer|invoker} 指明谁有权限执行:
definer 表示只有定义者才能执行
invoker 表示调用者可以执行
comment 'string' 是注释信息
7. 删除存储过程和函数通过 drop 语句删除存储过程
drop procedure proc_name;
通过 drop function 语句删除存储函数
drop function func_name;
以上就是mysql存储过程和函数怎么创建的详细内容。
