lcpsky

导航

存储过程编写

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 ;  

posted on 2017-12-10 17:39  lcpsky  阅读(76)  评论(0编辑  收藏  举报