第十章 存储过程和函数
创建存储过程和函数
创建存储过程
create procedure sp_name ([proc_parameter[...]])
[characteristic ...] routine_body
"sp_name"是参数存储过程名称
"proc_parameter"存储过程的参数列表
"characteristic"存储过程的特性
"routine_body"是SQL代码内容,可以用begin...end标志
proc_parameter的每个参数由三个部分构成:输入输出类型、参数名、参数类型
形式:[in|out|inout] param_name type
characteristic参数有多个取值:
language sql:说明routine_body部分由sql语言的语句组成
[not] deterministic:指明存储过程的执行结果是否是确定的。(相同输入得到相同输出,便是确定的)
{contains sql|no sql|reads sql data|modifies sql data}:指明子程序使用sql语句的限制。
contains sql表示子程序包含sql语句,但不包含读或写数据的语句(默认)
no sql表示子程序中不包含sql语句
reads sql data表示子程序包含读数据的语句
modifies sql data表示子程序中包含写数据的语句
mysql> delimiter &&
mysql> create procedure num_from_employee(in emp_id int,out count_num int)
-> reads sql data
-> begin
-> select count(*) into count_num
-> from employee
-> where d_id=emp_id;
-> end &&
创建存储函数
形式如下:
create function sp_name ([func_parameter[...]])
return type
[characteristic...] routine_body
参数意义参照上一个
mysql> delimiter &&
mysql> create function name_from_employee(emp_id int)
-> returns varchar(20)
-> begin
-> return (select name from employee where num=emp_id);
-> end &&
变量的使用
存储过程和函数中可以定义和使用变量。这些变量的作用范围是begin...end程序段中。
a.定义变量
declare var_name[,...] type [default value]
b.变量赋值
set var_name = expr[,var_name = expr]...
还可以使用select ... into语句为变量赋值
select col_name[,...] into var_name[,...] from table_name where condition
col_name 参数表示查询字段名称,var_name是变量名称
定义条件和处理程序
定义条件和处理程序是事先定义程序执行过程中可能遇到的问题,并且可以在处理程序中定义解决这些问题的办法。通过declare关键字来定义
a.定义条件
MySQL中可以使用declare关键字来定义条件。语法如下:
declare condition_name condition for condition_value
condition_value:
sqlstate [value] sqlstate_value | mysql_error_code
b.定义处理程序
declare hander_type handler for condition_value[,...] sp_statement
hander_type:
continue|exit|undo
condition_value:
sqlstate[value] sqlstate_value|condition_name|sqlwarning
|not found|sqlexception|mysql_error_code
光标的使用
a.声明关标
declare cursor_name cursor for select_statement;
b.打开光标
open cursor_name;
c.使用光标
fetch cur_emloyee into var_name[,var_name...];
d.关闭光标
close cursor_name;