谁可相欹 发表于 2015-1-16 20:14:13

发一篇mysql5存储历程编写理论

曾经的功能列表可能会迅速变得过时了。而且,有些功能对有的应用程序非常重要,但是对别的应用程序则不一定。MySQL5.0今后均撑持存储历程,比来有空,研讨了一把这个。
格局:

CREATEPROCEDURE历程名([历程参数[,...]])
[特征...]历程体
CREATEFUNCTION函数名([函数参数[,...]])
RETURNS前往范例
[特征...]函数体历程参数:
参数名参数范例
函数参数:
参数名参数范例
前往范例:
无效的MYSQL数据范例便可
特征:

LANGUAGESQL
|DETERMINISTIC
|{CONTAINSSQL|NOSQL|READSSQLDATA|MODIFIESSQLDATA}
|SQLSECURITY{DEFINER|INVOKER}
|COMMENTstring历程体/函数体:格局以下:

BEGIN
无效的SQL语句
END我在这里不体贴专有的特征,这些与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;
ENDCREATEFUNCTIONfun_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社区是活跃、友好和内容渊博的。”

只想知道 发表于 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的拼写。

第二个灵魂 发表于 2015-2-21 06:20:34

光写几个SQL实在叫无知。

兰色精灵 发表于 2015-3-6 19:58:51

如果是将来做数据库的开发设计,就应该详细学习T-SQL的各种细节,包括T-SQL的程序设计、存储过程、触发器以及具体使用某个开发语言来访问数据库。

谁可相欹 发表于 2015-3-13 08:08:40

如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个SQL语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。

再现理想 发表于 2015-3-20 17:28:52

换言之,只有在不断的失败中尝试成功,而关于失败的总结却是很少的
页: [1]
查看完整版本: 发一篇mysql5存储历程编写理论