Heim > Datenbank > MySQL-Tutorial > mysql5存储过程编写实践_MySQL

mysql5存储过程编写实践_MySQL

WBOY
Freigeben: 2016-06-01 14:11:40
Original
1102 Leute haben es durchsucht

MySql5.0以后均支持存储过程,最近有空,研究了一把这个
 
格式:
        
CREATE PROCEDURE 过程名 ([过程参数[,...]])
    [特性 ...] 过程体

CREATE FUNCTION 函数名 ([函数参数[,...]])
    RETURNS 返回类型
    [特性 ...] 函数体
    
过程参数:
    [ IN | OUT | INOUT ] 参数名 参数类型
    
函数参数:
    参数名 参数类型

返回类型:
    有效的MySQL数据类型即可

特性:
    LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }
  | COMMENT 'string'

过程体/函数体:格式如下:
BEGIN
    有效的SQL语句
END    
    
我在这里不关心专有的特性,这些与SQL规范不兼容,所以characteristic(特性)的相关内容不作考虑。
//
在开发过程中有几点要注意:
1、存储过程注释:MySQL支持采用--或者/**/注释,其中前者是行注释,后者是段式注释
2、变量首先用declare申明,其中临时变量可以直接以@前缀修饰以供引用
3、直接采用MySQL的Administrator管理器编辑时,可以直接采用如下函数文本录入;
   但若在脚本中自动导入存储过程或函数时,由于MySQL默认以";"为分隔符,则过程体的每一句
   都被MySQL以存储过程编译,则编译过程会报错;所以要事先用DELIMITER关键字申明当前段分隔符
   用完了就把分隔符还原。  如下所示:
       DELIMITER $$
       Stored Procedures and Functions
       DELIMITER ;
4、MySQL支持大量的内嵌函数,有些是和大型商用数据库如oracle、informix、sybase等一致,
   但也有些函数名称不一致,但功能一致;或者有些名称一致,但功能相异,这个特别对于从
   这些数据库开发转过来的DBA要注意。
5、存储过程或函数的调试:我目前还没有研究MySQL所带的各种工具包,还不清楚其提供了调试工具
   没有,不过编译错误相对好查找;至于业务流程的调试,可以采用一个比较笨的方法,就是创建一
   个调试表,在包体中各个流程点都插入一条记录,以观察程序执行流程。这也是一个比较方便的笨
   办法。^_^
   
   下面是2个例子,提供了一种字串加密的算法,每次以相同的入参调用都会得到不同的加密结果,
   算法相对比较简单,不具备强度。分别以函数和过程的形式分别实现如下:
(1)函数

eg:
CREATE FUNCTION fun_addmm(inpass varchar(10)) RETURNS varchar(11)
BEGIN
     declare string_in varchar(39);
     declare string_out varchar(78);
     declare offset tinyint(2);
     declare outpass varchar(30) default ';
     declare len tinyint;
     /*declare i tinyint;*/

     /**/
     set len=LENGTH(inpass);
     if((len10)) then
         return "";
     end if;

     set offset=(SECOND(NOW()) mod 39)+1; /*根据秒数取模*/
     /*insert into  testtb values(offset,'offset: ');*/
     set string_out='YN8K1JOZVURB3MDETS5GPL27AXWIHQ94C6F0#$_';  /*密钥*/
     set string_in='_$#ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

     set outpass=CONCAT(outpass,SUBSTRING(string_out,offset,1));
/*     insert into  testtb values(2,outpass);*/
     set string_out=CONCAT(string_out,string_out);
     set @i=0;
     REPEAT
       set @i=@i+1;
       set outpass=CONCAT(outpass,SUBSTR(string_out,INSTR(string_in,SUBSTRING(inpass,@i,1))+offset,1));
/*       insert into  testtb values(@i+2,outpass);*/
     UNTIL (@i>=len)
     end REPEAT;

     return outpass;
END 


(2)过程

CREATE PROCEDURE `pro_addmm`(IN inpass varchar(10),OUT outpass varchar(11))
BEGIN
     declare string_in varchar(39);
     declare string_out varchar(78);
     declare offset tinyint(2);                
     declare len tinyint;

     set outpass=';

     set len=LENGTH(inpass);
     if((len10)) then
         set outpass=';
     else
         set offset=(SECOND(NOW()) mod 39)+1;

         set string_out='YN8K1JOZVURB3MDETS5GPL27AXWIHQ94C6F0#$_';
         set string_in='_$#ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

         set outpass=CONCAT(outpass,SUBSTRING(string_out,offset,1));

         set string_out=CONCAT(string_out,string_out);
         set @i=0;
         REPEAT
               set @i=@i+1;
               set outpass=CONCAT(outpass,SUBSTR(string_out,INSTR(string_in,SUBSTRING(inpass,@i,1))+offset,1));
         UNTIL (@i>=len)
         end REPEAT;
     end if;
END


//
执行结果如下:
mysql> call pro_addmm('zhouys',@a);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @a;
+---------+
| @a      |
+---------+
| U_PI6$4 |
+---------+
1 row in set (0.00 sec)

mysql> call pro_addmm('zhouys',@a);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @a;
+---------+
| @a      |
+---------+
| 9P8UEGM |
+---------+
1 row in set (0.00 sec)

mysql> select fun_submm('U_PI6$4');
+----------------------+
| fun_submm('U_PI6$4') |
+----------------------+
| ZHOUYS               |
+----------------------+
1 row in set (0.00 sec)

加密算法有几个弱点:
1、不支持大小写
2、不支持中文
3、加密强度不够

有兴趣的人可以研究一下解密函数如何编写,这里就不赘述了。

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage