第十章 存储过程和函数

创建存储过程和函数

创建存储过程

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;

posted @ 2016-05-24 21:47  且听风吟-wuchao  阅读(220)  评论(0编辑  收藏  举报