存储过程和函数是指将经常使用的一组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的结束符号设置为&&,最后再改过来。
       存储函数也是一样。