1>创建mysql存储过程、存储函数 
create procedure 存储过程名(参数) 
存储过程体 

create function 存储函数名(参数)



 mysql> DELIMITER // 

 mysql> CREATE PROCEDURE proc1(OUT s int) 

    -> BEGIN

    -> SELECT COUNT(*) INTO s FROM user; 

    -> END

    -> // 

 mysql> DELIMITER ;




注: 
(1)这里需要注意的是DELIMITER//和DELIMITER;两句,DELIMITER是分割符的意思,因为MySQL默认以”;”为分隔 符,
如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事
先用DELIMITER关键字申明当 前段分隔符,这样MySQL才会将”;”当做存储过程中的代码,不会执行这些代码,用完了之
后要把分隔符还原。 
(2)存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型是int型,如果有多个参数
用”,”分割开。 
(3)过程体的开始与结束使用BEGIN与END进行标识。 


2>参数


MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如: 
CREATEPROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形…]) 
IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值 
OUT 输出参数:该值可在存储过程内部被改变,并可返回 
INOUT 输入输出参数:调用时指定,并且可被改变和返回


3>IN参数例子

创建:

mysql > DELIMITER //  

 mysql > CREATE PROCEDURE demo_in_parameter(IN p_in int)  

      -> BEGIN   

      -> SELECT p_in;   

      -> SET p_in=2;   

      -> SELECT p_in;   

      -> END;   

-> //  

 mysql > DELIMITER ;




执行结果:

mysql > SET @p_in=1;   

 mysql > CALL demo_in_parameter(@p_in);  

 mysql> SELECT @p_in;




OUT参数例子


创建:


mysql > DELIMITER //  

 mysql > CREATE PROCEDURE demo_out_parameter(OUT p_out int)  

      -> BEGIN 

      -> SELECT p_out;  

      -> SET p_out=2;  

      -> SELECT p_out;  

      -> END;  

      -> //  

 mysql > DELIMITER ; 



 mysql > SET @p_out=1;  

 mysql > CALL sp_demo_out_parameter(@p_out);  

 mysql > SELECT @p_out;  



 INOUT参数例子



 创建:



 mysql > DELIMITER //   

 mysql > CREATE PROCEDURE demo_inout_parameter(INOUT p_inout int)   

      -> BEGIN 

      -> SELECT p_inout;  

      -> SET p_inout=2;  

      -> SELECT p_inout;   

      -> END;  

-> //   

 mysql > DELIMITER ; 



 mysql > SET @p_inout=1;  

 mysql > CALL demo_inout_parameter(@p_inout) ;  

 mysql > SELECT @p_inout;




4>局部变量


变量定义:局部变量声明一定要放在存储过程体的开始 
DECLARE variable_name [,variable_name…] datatype [DEFAULT value]; 
其中,datatype为MySQL的数据类型,如:int, float, date,varchar(length) 
例如:


DECLARE l_int int unsigned default 4000000;  

 DECLARE l_numeric number(8,2) DEFAULT 9.95;  

 DECLARE l_date date DEFAULT '1999-12-31';  

 DECLARE l_datetime datetime DEFAULT '1999-12-31 23:59:59';  

 DECLARE l_varchar varchar(255) DEFAULT 'This will not be padded';




变量赋值


SET 变量名 = 表达式值 [,variable_name = expression …]




5>用户变量


在MySQL客户端使用用户变量


1.  mysql > SELECT 'Hello World' into @x;  

 2.  mysql > SELECT @x;  

 3.  +-------------+  

 4.  |   @x        |  

 5.  +-------------+  

 6.  | Hello World |  

 7.  +-------------+  

 8.  mysql > SET @y='Goodbye Cruel World';  

 9.  mysql > SELECT @y;  

 10.+---------------------+  

 11.|     @y              |  

 12.+---------------------+  

 13.| Goodbye Cruel World |  

 14.+---------------------+  

 15. 

 16.mysql > SET @z=1+2+3;  

 17.mysql > SELECT @z;  

 18.+------+  

 19.| @z   |  

 20.+------+  

 21.|  6   |  

 22.+------+


在存储过程中使用用户变量


1.  mysql > CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World');  

 2.  mysql > SET @greeting='Hello';  

 3.  mysql > CALL GreetWorld( );  

 4.  +----------------------------+  

 5.  | CONCAT(@greeting,' World') |  

 6.  +----------------------------+  

 7.  |  Hello World               |  

 8.  +----------------------------+




在存储过程间传递全局范围的用户变量


1.  mysql> CREATE PROCEDURE p1()   SET @last_procedure='p1';  

 2.  mysql> CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@last_procedure);  

 3.  mysql> CALL p1( );  

 4.  mysql> CALL p2( );  

 5.  +-----------------------------------------------+  

 6.  | CONCAT('Last procedure was ',@last_proc       |  

 7.  +-----------------------------------------------+  

 8.  | Last procedure was p1                         |  

 9.  +-----------------------------------------------+




注意: 
①用户变量名一般以@开头 
②滥用用户变量会导致程序难以理解及管理


6>注释


MySQL存储过程可使用两种风格的注释 
双模杠:– 
该风格一般用于单行注释 
c风格: 一般用于多行注释 
例如:


1.  mysql > DELIMITER //  

 2.  mysql > CREATE PROCEDURE proc1 --name存储过程名  

 3.       -> (IN parameter1 INTEGER)   

 4.       -> BEGIN   

 5.       -> DECLARE variable1 CHAR(10);   

 6.       -> IF parameter1 = 17 THEN   

 7.       -> SET variable1 = 'birds';   

 8.       -> ELSE 

 9.       -> SET variable1 = 'beasts';   

 10.     -> END IF;   

 11.     -> INSERT INTO table1 VALUES (variable1);  

 12.     -> END   

 13.     -> //  

 14.mysql > DELIMITER ;