仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 681|回复: 7
打印 上一主题 下一主题

[学习教程] 发一篇mysql5存储历程编写理论

[复制链接]
谁可相欹 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 20:14:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
曾经的功能列表可能会迅速变得过时了。而且,有些功能对有的应用程序非常重要,但是对别的应用程序则不一定。MySQL5.0今后均撑持存储历程,比来有空,研讨了一把这个。
格局:
  1. CREATEPROCEDURE历程名([历程参数[,...]])
  2. [特征...]历程体
复制代码
  1. CREATEFUNCTION函数名([函数参数[,...]])
  2. RETURNS前往范例
  3. [特征...]函数体
复制代码
历程参数:
[IN|OUT|INOUT]参数名参数范例
函数参数:
参数名参数范例
前往范例:
无效的MYSQL数据范例便可
特征:
  1. LANGUAGESQL
  2. |[NOT]DETERMINISTIC
  3. |{CONTAINSSQL|NOSQL|READSSQLDATA|MODIFIESSQLDATA}
  4. |SQLSECURITY{DEFINER|INVOKER}
  5. |COMMENTstring
复制代码
历程体/函数体:格局以下:
  1. BEGIN
  2. 无效的SQL语句
  3. END
复制代码
我在这里不体贴专有的特征,这些与SQL标准不兼容,以是characteristic(特征)的相干内容不作思索。
//
在开辟过程当中有几点要注重:
1、存储历程正文:MySQL撑持接纳--大概/**/正文,个中前者是行正文,后者是段式正文
2、变量起首用declare声名,个中一时变量能够间接以@前缀润色以供援用
3、间接接纳MySQL的Administrator办理器编纂时,能够间接接纳以下函数文本录进;
但如果在剧本中主动导进存储历程或函数时,因为MySQL默许以";"为分开符,则历程体的每句
都被MySQL以存储历程编译,则编译历程会报错;以是要事前用DELIMITER关头字声名以后段分开符
用完了就把分开符复原。以下所示:

  1. DELIMITER$$
  2. StoredProceduresandFunctions
  3. DELIMITER;
复制代码
4、MySQL撑持大批的内嵌函数,有些是和年夜型商用数据库如Oracle、informix、sybase等分歧,但也有些函数称号纷歧致,但功效分歧;大概有些称号分歧,但功效相异,这个出格关于从这些数据库开辟转过去的DBA要注重。
5、存储历程或函数的调试:我今朝还没有研讨MySQL所带的各类工具包,还不分明其供应了调试工具没有,不外编译毛病绝对好查找;至于营业流程的调试,能够接纳一个对照笨的办法,就是创立一个调试表,在包体中各个流程点都拔出一笔记录,以察看程序实行流程。这也是一个对照便利的笨举措。^_^
上面是2个例子,供应了一种字串加密的算法,每次以不异的进参挪用城市失掉分歧的加密了局,
算法绝对对照复杂,不具有强度。分离以函数和历程的情势分离完成以下:
(1)函数
eg:
  1. /**/
  2. setlen=LENGTH(inpass);
  3. if((len<=0)or(len>10))then
  4. return"";
  5. endif;
  6. setoffset=(SECOND(NOW())mod39)+1;/*依据秒数取模*/
  7. /*insertintotesttbvalues(offset,offset:);*/
  8. setstring_out=YN8K1JOZVURB3MDETS5GPL27AXWIHQ94C6F0#$_;/*密钥*/
  9. setstring_in=_$#ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789;
  10. setoutpass=CONCAT(outpass,SUBSTRING(string_out,offset,1));
  11. /*insertintotesttbvalues(2,outpass);*/
  12. setstring_out=CONCAT(string_out,string_out);
  13. set@i=0;
  14. REPEAT
  15. set@i=@i+1;
  16. setoutpass=CONCAT(outpass,SUBSTR(string_out,INSTR(string_in,SUBSTRING
  17. (inpass,@i,1))+offset,1));
  18. /*insertintotesttbvalues(@i+2,outpass);*/
  19. UNTIL(@i>=len)
  20. endREPEAT;
  21. returnoutpass;
  22. END
复制代码
CREATEFUNCTIONfun_addmm(inpassvarchar(10))RETURNSvarchar(11)
BEGIN
declarestring_invarchar(39);
declarestring_outvarchar(78);
declareoffsettinyint(2);
declareoutpassvarchar(30)default;
declarelentinyint;
/*declareitinyint;*/
(2)历程
  1. CREATEPROCEDURE`pro_addmm`(INinpassvarchar(10),OUToutpassvarchar(11))
  2. BEGIN
  3. declarestring_invarchar(39);
  4. declarestring_outvarchar(78);
  5. declareoffsettinyint(2);
  6. declarelentinyint;
  7. setoutpass=;
  8. setlen=LENGTH(inpass);
  9. if((len<=0)or(len>10))then
  10. setoutpass=;
  11. else
  12. setoffset=(SECOND(NOW())mod39)+1;
  13. setstring_out=YN8K1JOZVURB3MDETS5GPL27AXWIHQ94C6F0#$_;
  14. setstring_in=_$#ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789;
  15. setoutpass=CONCAT(outpass,SUBSTRING(string_out,offset,1));
  16. setstring_out=CONCAT(string_out,string_out);
  17. set@i=0;
  18. REPEAT
  19. set@i=@i+1;
  20. setoutpass=CONCAT(outpass,SUBSTR(string_out,INSTR(string_in,SUBSTRING
  21. (inpass,@i,1))+offset,1));
  22. UNTIL(@i>=len)
  23. endREPEAT;
  24. endif;
  25. END
复制代码
实行了局以下:
  1. mysql>callpro_addmm(zhouys,@a);
  2. QueryOK,0rowsaffected(0.00sec)
  3. mysql>SELECT@a;
  4. +---------+
  5. |@a|
  6. +---------+
  7. |U_PI6$4|
  8. +---------+
  9. 1rowinset(0.00sec)
  10. mysql>callpro_addmm(zhouys,@a);
  11. QueryOK,0rowsaffected(0.00sec)
  12. mysql>SELECT@a;
  13. +---------+
  14. |@a|
  15. +---------+
  16. |9P8UEGM|
  17. +---------+
  18. 1rowinset(0.00sec)
  19. mysql>selectfun_submm(U_PI6$4);
  20. +----------------------+
  21. |fun_submm(U_PI6$4)|
  22. +----------------------+
  23. |ZHOUYS|
  24. +----------------------+
  25. 1rowinset(0.00sec)
复制代码
加密算法有几个缺点:
1、不撑持巨细写
2、不撑持中文
3、加密强度不敷
有乐趣的人能够研讨一下解密函数怎样编写,这里就不赘述了。
你碰到的问题可能已经在社区中被别的人已经问过,即使没有MySQL学习教程,你也可以提出问题或通过Google来搜索答案。社区的相关负责人士:“MySQL社区是活跃、友好和内容渊博的。”
只想知道 该用户已被删除
沙发
发表于 2015-1-18 18:55:37 | 只看该作者
SP4是一个累积性的ServicePack,包含自以前的ServicePack发布以来所有的修补程序(包括MS03-031安全公告)。
飘灵儿 该用户已被删除
板凳
发表于 2015-1-24 12:51:36 | 只看该作者
微软对CLR作了大篇幅的宣传,这是因为数据库产品终于融入.net体系中。最开始我们也是狂喜,感觉对象数据库的一些概念可以实现了。
金色的骷髅 该用户已被删除
地板
发表于 2015-2-7 08:20:51 | 只看该作者
可以动态传入参数,省却了动态SQL的拼写。
第二个灵魂 该用户已被删除
5#
发表于 2015-2-21 06:20:34 | 只看该作者
光写几个SQL实在叫无知。
兰色精灵 该用户已被删除
6#
发表于 2015-3-6 19:58:51 | 只看该作者
如果是将来做数据库的开发设计,就应该详细学习T-SQL的各种细节,包括T-SQL的程序设计、存储过程、触发器以及具体使用某个开发语言来访问数据库。
谁可相欹 该用户已被删除
7#
 楼主| 发表于 2015-3-13 08:08:40 | 只看该作者
如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个SQL语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。
再现理想 该用户已被删除
8#
发表于 2015-3-20 17:28:52 | 只看该作者
换言之,只有在不断的失败中尝试成功,而关于失败的总结却是很少的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-24 01:41

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表