|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
曾经的功能列表可能会迅速变得过时了。而且,有些功能对有的应用程序非常重要,但是对别的应用程序则不一定。MySQL5.0今后均撑持存储历程,比来有空,研讨了一把这个。
格局:
- CREATEPROCEDURE历程名([历程参数[,...]])
- [特征...]历程体
复制代码- CREATEFUNCTION函数名([函数参数[,...]])
- RETURNS前往范例
- [特征...]函数体
复制代码 历程参数:
[IN|OUT|INOUT]参数名参数范例
函数参数:
参数名参数范例
前往范例:
无效的MYSQL数据范例便可
特征:
- LANGUAGESQL
- |[NOT]DETERMINISTIC
- |{CONTAINSSQL|NOSQL|READSSQLDATA|MODIFIESSQLDATA}
- |SQLSECURITY{DEFINER|INVOKER}
- |COMMENTstring
复制代码 历程体/函数体:格局以下:
我在这里不体贴专有的特征,这些与SQL标准不兼容,以是characteristic(特征)的相干内容不作思索。
//
在开辟过程当中有几点要注重:
1、存储历程正文:MySQL撑持接纳--大概/**/正文,个中前者是行正文,后者是段式正文
2、变量起首用declare声名,个中一时变量能够间接以@前缀润色以供援用
3、间接接纳MySQL的Administrator办理器编纂时,能够间接接纳以下函数文本录进;
但如果在剧本中主动导进存储历程或函数时,因为MySQL默许以";"为分开符,则历程体的每句
都被MySQL以存储历程编译,则编译历程会报错;以是要事前用DELIMITER关头字声名以后段分开符
用完了就把分开符复原。以下所示:
- DELIMITER$$
- StoredProceduresandFunctions
- DELIMITER;
复制代码 4、MySQL撑持大批的内嵌函数,有些是和年夜型商用数据库如Oracle、informix、sybase等分歧,但也有些函数称号纷歧致,但功效分歧;大概有些称号分歧,但功效相异,这个出格关于从这些数据库开辟转过去的DBA要注重。
5、存储历程或函数的调试:我今朝还没有研讨MySQL所带的各类工具包,还不分明其供应了调试工具没有,不外编译毛病绝对好查找;至于营业流程的调试,能够接纳一个对照笨的办法,就是创立一个调试表,在包体中各个流程点都拔出一笔记录,以察看程序实行流程。这也是一个对照便利的笨举措。^_^
上面是2个例子,供应了一种字串加密的算法,每次以不异的进参挪用城市失掉分歧的加密了局,
算法绝对对照复杂,不具有强度。分离以函数和历程的情势分离完成以下:
(1)函数
eg:
- /**/
- setlen=LENGTH(inpass);
- if((len<=0)or(len>10))then
- return"";
- endif;
- setoffset=(SECOND(NOW())mod39)+1;/*依据秒数取模*/
- /*insertintotesttbvalues(offset,offset:);*/
- setstring_out=YN8K1JOZVURB3MDETS5GPL27AXWIHQ94C6F0#$_;/*密钥*/
- setstring_in=_$#ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789;
- setoutpass=CONCAT(outpass,SUBSTRING(string_out,offset,1));
- /*insertintotesttbvalues(2,outpass);*/
- setstring_out=CONCAT(string_out,string_out);
- set@i=0;
- REPEAT
- set@i=@i+1;
- setoutpass=CONCAT(outpass,SUBSTR(string_out,INSTR(string_in,SUBSTRING
- (inpass,@i,1))+offset,1));
- /*insertintotesttbvalues(@i+2,outpass);*/
- UNTIL(@i>=len)
- endREPEAT;
- returnoutpass;
- END
复制代码 CREATEFUNCTIONfun_addmm(inpassvarchar(10))RETURNSvarchar(11)
BEGIN
declarestring_invarchar(39);
declarestring_outvarchar(78);
declareoffsettinyint(2);
declareoutpassvarchar(30)default;
declarelentinyint;
/*declareitinyint;*/
(2)历程
- CREATEPROCEDURE`pro_addmm`(INinpassvarchar(10),OUToutpassvarchar(11))
- BEGIN
- declarestring_invarchar(39);
- declarestring_outvarchar(78);
- declareoffsettinyint(2);
- declarelentinyint;
- setoutpass=;
- setlen=LENGTH(inpass);
- if((len<=0)or(len>10))then
- setoutpass=;
- else
- setoffset=(SECOND(NOW())mod39)+1;
- setstring_out=YN8K1JOZVURB3MDETS5GPL27AXWIHQ94C6F0#$_;
- setstring_in=_$#ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789;
- setoutpass=CONCAT(outpass,SUBSTRING(string_out,offset,1));
- setstring_out=CONCAT(string_out,string_out);
- set@i=0;
- REPEAT
- set@i=@i+1;
- setoutpass=CONCAT(outpass,SUBSTR(string_out,INSTR(string_in,SUBSTRING
- (inpass,@i,1))+offset,1));
- UNTIL(@i>=len)
- endREPEAT;
- endif;
- END
复制代码 实行了局以下:
- mysql>callpro_addmm(zhouys,@a);
- QueryOK,0rowsaffected(0.00sec)
- mysql>SELECT@a;
- +---------+
- |@a|
- +---------+
- |U_PI6$4|
- +---------+
- 1rowinset(0.00sec)
- mysql>callpro_addmm(zhouys,@a);
- QueryOK,0rowsaffected(0.00sec)
- mysql>SELECT@a;
- +---------+
- |@a|
- +---------+
- |9P8UEGM|
- +---------+
- 1rowinset(0.00sec)
- mysql>selectfun_submm(U_PI6$4);
- +----------------------+
- |fun_submm(U_PI6$4)|
- +----------------------+
- |ZHOUYS|
- +----------------------+
- 1rowinset(0.00sec)
复制代码 加密算法有几个缺点:
1、不撑持巨细写
2、不撑持中文
3、加密强度不敷
有乐趣的人能够研讨一下解密函数怎样编写,这里就不赘述了。
你碰到的问题可能已经在社区中被别的人已经问过,即使没有MySQL学习教程,你也可以提出问题或通过Google来搜索答案。社区的相关负责人士:“MySQL社区是活跃、友好和内容渊博的。” |
|