存储进程和函数,一种数据库对象,用来实现将一组关于表操作的SQL语句代码当作一个整体来履行,也是与数据库对象表关联最紧密的数据库对象。在数据库体系中,当调用存储进程和函数时,则会履行这些对象中所设置的sql语句组从而实现相应的功效。
一、存储进程和函数的相干概念
针对表的一个完全操作常常不是单条sql语句便可以够实现,而是须要一组sql语句来实现。
例:
为了购置商品的定单处置:
(1)在生成定单之前,首先须要查看商品库存中是不是有相应的商品
(2)如果库存中存在相应的商品,按着须要预定商品以便不将该商品卖给他人,并且删除库存数目以反应准确的库存量。
(3)如果商品库存中不存在相应的商品,就须要向供给商定货。
在具体应用中,一个完全的操作会包括多条sql语句,在履行进程中须要依据前面sql语句的履行成果有选择的履行后面的sql。为懂得决该问题,mysql供给了数据库对象存储进程和函数。
存储进程和函数实际上就是事前经过编译并存储在数据库夅的一段sql语句聚集。
二、存储进程根本操作
创立
create procedure procedure_name([procedure_paramiter[,...]])
[characteristic...] routine_body
procedure_name:存储进程名称
procedure_paramter:存储进程参数
characteristic:存储进程特征
routine_body:存储进程的sql语法代码,可以应用begin...end来标记sql语句的开端和停止
注意:推重的进程命名为procedure_xxx或proce_xxx;
procedure_paramter中每一个参数的语法情势:
[IN|OUT|INOUT] paramter_name type
上述语句:每一个参数有3部份组成,分离为输入输出类型,参数名,参数类型。
characteristic的取值:
LANGUAGE SQL
|[NOT] DETERMINISTIC
|{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}
|SQL SECURITY {DEFINER|INVOKER}
|COMMENT "string"
language sql :
存储进程的routine_body部份由sql语句组成。为mysql所默许的语句
[not]deterministic :
表现存储进程的履行成果是不是肯定。deterministic表现履行成果是肯定的,即每次履行存储进程时,如果输入雷同的参数将得到雷同的输出;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:包括写数据的语句
默以为contains sql
sql security {definer|invoke}
设置谁又权限来履行,如果值为definer,表现只有定义者自己能力够履行;如果值为invoker表现调用着可以履行。默以为definer
comment "string"
表现注释语句
例:创立查询所有雇员工资的存储进程。
delimiter $$
create procedure proce_employee_sale()
comment "查询所有雇员的工资"
begin
select sale from t_employee;
end
$$
delimiter;
查看
show procedure status \G
show create procedure proce_name\G
修正
alter procedure procedure_name
[characteristic...]
修正时characteristic的取值为
|{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}
|SQL SECURITY {DEFINER|INVOKER}
|COMMENT "string"
删除
drop procedure proce_name
三、函数的根本操作
创立
create function function_name([function_paramter[,...]])
[characteristic...] routine_body
routine_body 可以应用begin_end来标记sql语句的开端和停止
例:创立某个雇员工资的函数
delimiter $$
create function func_employee_sale(empno int)
returns double(10,2)
comment "查询某个雇员的工作"
begin
return (
select sale from t_employee where t_employee.empno=empno
);
end
$$
delimiter ;
查看
show function status\G
show create function func_name\G
修正
alter function function_name
[characteristic...]
修正时characteristic的取值为
|{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}
|SQL SECURITY {DEFINER|INVOKER}
|COMMENT "string"
删除
drop function func_name
四、存储进程和函数的表达式
操作变量
声明变量
declare var_name[,...] type [default value]
不指定default则为null
例:
declare employee_sale int default 1000
赋值变量
set var_name=expr[,...]
expr是关于变量的赋值表达式
select field_name[,...] into var_name[,...]
from table_name
where condition
应用查询成果给参数赋值
注意:当将查询成果赋值给变量,该查询语句的返回成果只能是单行。
例:
declare employee_sale int default 1000
set employee_sale=3500;
select sale into employee_sale
from t_employee
where empno=7566;
操作条件
定义条件
通过declare来定义
declare condition_name condition for condition_value
condition_value:
sqlstate[value] sqlstate_value|mysql_error_code
condition_name 表现所要定义的条件名称
condition_value 用来实现设置条件的类型
sqlstate_value 和mysql_error_code :用来设置条件的毛病
定义处置程序
declare handler_type handler for condition_value[,...] sp_statement
handler_type:
continue
|exit
|undo
condition_value:
sqlstate[value] sqlstate_value
|condition_name
|sqlwarning
|not found
|sqlexception
|mysql_error_code
应用光标
声明光标
declare cursor_name cursor for select_statement;
打开光标
open cursor_name
应用光标
fetch cursor_name into var_name [,var_name]...
关闭光标
close cursor_name
例:
declare cursor_employee cursor for select sale from t_employee;
open cursor_employee
fetch cursor_employee into employee_sale;
close cursor_employee
注意:
在具体应用光标时,光标必需在处置程序之前且在变量和条件以后声明,并且最后必定要关闭光标。
应用流程掌握
条件掌握
通过if,case来实现条件掌握语句,if语句具体进行条件掌握时,依据是不是满足条件,履行不同的语句;而对case语句则可以实现更庞杂的条件掌握。
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list]...
[ELSE search_condition]
END IF
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list]
[ELSE statement_list]
END CASE
重复掌握
[begin_label:]
LOOP
statement_list
END LOOP
[end_label]
begin_label和end_label分离表现重复开端和停止,这两个标记必需雷同,并且可以省略
对重复语句,如果想退出正在履行的重复体,可以应用症结字leave
LEAVE label
[begin_label:]
WHILE search_condition DO
statement_list
END WHILE
[end_label]
[begin_label:]
REPEAT search_condition DO
statement_list
END REPEAT
通过上述介绍,懂得了存储进程和函数的概念和定义,但是对存储进程和函数的具体应用还是模隐约糊的。
存储进程和函数的区分:函数必需有返回值,而存储进程没有。存储进程的参数类型远远多于函数参数类型。
存储进程和函数的优缺陷。
长处:
1、存储进程和函数许可尺度组件式编程,进步了sql语句的重用性,同享性,和可移植性
2、存储进程和函数能够实现较快的履行速度,能够减少网络流量
3、存储进程和函数可以被作为一种安全机制来应用
缺陷:
1、存储进程和函数的编写比单条sql语句庞杂,须要用户具有更高的技巧和更庞杂的经验
2、在编写存储进程和函数时,须要创立这些数据库对象的权限
存储进程和函数,一种数据库对象,用来实现将一组关于表操作的SQL语句代码当作一个整体来履行