存储过程和函数是指将经常使用的一组SQL语句组合在一起,并将这些SQL语句当作一个整体存储在服务器中
一、创建存储过程
语法格式:
create procedure sp_name ( [ proc_parameter[……] ] )
[ characteristic…… ] routine_body
sp_name:存储过程的名称;
proc_parameter:存储过程的参数列表;
characteristic:指定存储过程的特性;
routine_body:是SQL代码的内容。
注意:可以用begin……end来标志SQL代码的开始和结束。
-------------------------------------------------------------------------
proc_parameter:存储过程的参数列表;
proc_parameter中的每一个参数由3个部分组成。这3部分分别是 输入输出类型、参数名称、参数类型。
形式如下:
[ IN | OUT | INOUT ] param_name type
IN:表示输出参数;
OUT:表示输出参数;
INOUT:表示既可以是输入,也可以是输出;
param_name:表示存储过程的参数名称;
type:指定存储过程的参数类型,该类型可以是mysql数据库的任意数据类型;
------------------------------------------------------------------------
------------------------------------------------------------------------
characteristic:指定存储过程的特性;
characteristic参数有多个取值。说明如下:
LANGUAGE SQL:说明routine_body部分是由SQL语言的语句组成,这也是数据库系统的默认的语言;
+++++++++++++++++++
[ NOT ] DETERMINISTIC:指明存储过程的执行结果是否是确定的。
DETERMINISTIC表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。
NOT DETERMINISTIC表示结果是非确定的,相同的输入可能得到不同的输出。
默认情况下,结果是非确定的,
++++++++++++++++++++++++
{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATE }:指明子程序使用SQL语句的限制。
CONTAINS SQL:表示子程序包含SQL语句,但不包含读或写数据的语句;
NO SQL:表示子程序中不包含SQL语句;
READS SQL DATA:表示子程序中包含读数据的语句;
MODIFIES SQL DATE:表示子程序中包含写数据的语句。
默认情况下:系统会自定为:CONTAINS SQL
+++++++++++++++++++
SQL SECURITY { DEFINER | INVOKER }:指明谁有权限来执行。
DEFINER:表示只有定义者自己才能执行;
INVOKER:表示调用者可以执行;
默认情况下,系统指定的权限是DEFINER
++++++++++++++++++++++++++++++++++++++++++
COMMENT'string':注释信息
------------------------------------------------------------------------
------------------------------------------------------------------------
注意:创建存储过程时,系统默认指定CONTAINS SQL,表示存储过程中使用了SQL语句。但是如果存储过程中没有使用SQL语句;
最好设置为NO SQL。而且,存储过程中,最好在COMMENT部分对存储过程进行简单注释。
===========================================================================================
===========================================================================================
===========================================================================================
举例:
create procedure num_from_employee( IN emp_id INT,OUT count_num INT )
reads sql date
begin
select count(*) into count_num from employee where d_id = emp_id;
end
具体执行程序:
delimiter&&
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 &&
delimiter ;
二 创建存储函数
语法格式:
create function sp_name ( [func_parameter[,……]] )
returns type
[ characteristic……] routine_body
sp_name:存储函数的名称;
func_parameter:存储函数的参数列表;
returns type:指定返回值的类型;
characteristic:指定存储函数的特性,该参数的取值和存储过程的取值一样的;
routine_body:是SQL代码的内容,可以用BEGIN……END来标志SQL代码的开始和结束。
=================================================================================
举例:
create function name_from_employee ( emp_id int )
returns varchar(20)
begin
return ( select name from employee where num = emp_id );
end
具体执行程序:
delimiter &&
create function name_from_employee ( emp_id int )
returns varchar(20)
begin
return ( select name from employee where num = emp_id );
end &&
delimiter;
PS:注意:MYSql中默认的语句结束符号为分号 ; 存储过程中的SQL语句需要分号来结束。为了避免冲突,首先用DELIMITER&& 将mysql的结束符号设置为&&,最后再改过来。
存储函数也是一样。