mysql储存过程写法(浅析mysql存储过程)
首发

mysql储存过程写法(浅析mysql存储过程)

优质
请用语音读文章

概述

在数据库的开发过程中。经常会遇到复杂的业务逻辑和对数据库的操作。这个时候就会用存储过程来封装数据库操作。如果项目的存储过程较多。书写又没有一定的规范。将会影响以后的系统维护困难和大存储过程逻辑的难以理解。另外如果数据库的数据量大或者项目对存储过程的性能要求很。就会遇到优化的问题。否则速度有可能很慢。一个经过优化过的存储过程要比一个性能差的存储过程的效率甚至高几百倍。


未优化的存储过程:

在存储过程中使用到的表tb_testnum结构如下:

在存储过程中使用到的另外一张表tb_testnum_tmp结构如下:

从两个表的结构可以看出。tb_testnum和tb_testnum_tmp所包含的字段完全相同。存储过程pr_dealtestnum的作用是根据输入参数将tb_testnum_tmp表的数据插入到tb_testnum表中。


优化一

存储过程pr_dealtestnum的主体是一条insert语句。但这条insert语句里面又包含了select语句。这样的编写是不规范的。因此把这条insert语句拆分成两条语句。即先把数据从tb_testnum_tmp表中查找出来。再插入到tb_testnum表中。修改之后的存储过程如下:


优化二

在向tb_testnum表插入数据之前。要判断该条数据在表中是否已经存在了。如果存在。则不再插入数据。同理。在从tb_testnum_tmp表中查询数据之前。要先判断该条数据在表中是否存在。如果存在。才能从表中查找数据。修改之后的存储过程如下:

dropprocedureifexistspr_dealtestnum;  delimiter//    createprocedurepr_dealtestnum  (  inp_boxnumbervarchar(30)  )  pr_dealtestnum_label:begin  declarep_usertypeint;  declarep_datacountint;    selectcount(*)intop_datacountfromtb_testnum_tmpwhereboxnumber=p_boxnumber;  ifp_datacount>0then  begin  selectusertypeintop_usertypefromtb_testnum_tmpwhereboxnumber=p_boxnumber;  end;  else  begin  leavepr_dealtestnum_label;  end;  endif;    selectcount(*)intop_datacountfromtb_testnumwhereboxnumber=p_boxnumber;  ifp_datacount=0then  begin  insertintotb_testnumvalues(p_boxnumber,p_usertype);  leavepr_dealtestnum_label;  end;  else  begin  leavepr_dealtestnum_label;  end;  endif;  end;  //  delimiter;  select'createprocedurepr_dealtestnumok';

优化三

不管向tb_testnum表插入数据的操作执行成功与否。都应该有一个标识值来表示执行的结果。这样也方便开发人员对程序流程的追踪和调试。也就是说。在每条leave语句之前。都应该有一个返回值。我们为此定义一个输出参数。修改之后的存储过程如下:

dropprocedureifexistspr_dealtestnum;  delimiter//    createprocedurepr_dealtestnum  (  inp_boxnumbervarchar(30),  outp_resultint--0-succ,other-fail  )  pr_dealtestnum_label:begin  declarep_usertypeint;  declarep_datacountint;    selectcount(*)intop_datacountfromtb_testnum_tmpwhereboxnumber=p_boxnumber;  ifp_datacount>0then  begin  selectusertypeintop_usertypefromtb_testnum_tmpwhereboxnumber=p_boxnumber;  end;  else  begin  setp_result=1;  leavepr_dealtestnum_label;  end;  endif;    selectcount(*)intop_datacountfromtb_testnumwhereboxnumber=p_boxnumber;  ifp_datacount=0then  begin  insertintotb_testnumvalues(p_boxnumber,p_usertype);  setp_result=0;  leavepr_dealtestnum_label;  end;  else  begin  setp_result=2;  leavepr_dealtestnum_label;  end;  endif;  end;  //  delimiter;  select'createprocedurepr_dealtestnumok';

优化四

“insert into tb_testnum values(p_boxnumber,p_usertype);”语句中。tb_testnum表之后没有列出具体的字段名。这个也是不规范的。如果在以后的软件版本中。tb_testnum表中新增了字段。那么这条insert语句极有可能会报错。因此。规范的写法是无论tb_testnum表中有多少字段。在执行insert操作时。都要列出具体的字段名。修改之后的存储过程如下:

dropprocedureifexistspr_dealtestnum;  delimiter//    createprocedurepr_dealtestnum  (  inp_boxnumbervarchar(30),  outp_resultint--0-succ,other-fail  )  pr_dealtestnum_label:begin  declarep_usertypeint;  declarep_datacountint;    selectcount(*)intop_datacountfromtb_testnum_tmpwhereboxnumber=p_boxnumber;  ifp_datacount>0then  begin  selectusertypeintop_usertypefromtb_testnum_tmpwhereboxnumber=p_boxnumber;  end;  else  begin  setp_result=1;  leavepr_dealtestnum_label;  end;  endif;    selectcount(*)intop_datacountfromtb_testnumwhereboxnumber=p_boxnumber;  ifp_datacount=0then  begin  insertintotb_testnum(boxnumber,usertype)values(p_boxnumber,p_usertype);  setp_result=0;  leavepr_dealtestnum_label;  end;  else  begin  setp_result=2;  leavepr_dealtestnum_label;  end;  endif;  end;  //  delimiter;  select'createprocedurepr_dealtestnumok';

优化五

在执行insert语句之后。要用mysql中自带的@error_count参数来判断插入数据是否成功。方便开发人员跟踪执行结果。如果该参数的值不为0。表示插入失败。那么我们就用一个返回参数值来表示操作失败。修改之后的存储过程如下:

dropprocedureifexistspr_dealtestnum;  delimiter//    createprocedurepr_dealtestnum  (  inp_boxnumbervarchar(30),  outp_resultint--0-succ,other-fail  )  pr_dealtestnum_label:begin  declarep_usertypeint;  declarep_datacountint;    selectcount(*)intop_datacountfromtb_testnum_tmpwhereboxnumber=p_boxnumber;  ifp_datacount>0then  begin  selectusertypeintop_usertypefromtb_testnum_tmpwhereboxnumber=p_boxnumber;  end;  else  begin  setp_result=1;  leavepr_dealtestnum_label;  end;  endif;    selectcount(*)intop_datacountfromtb_testnumwhereboxnumber=p_boxnumber;  ifp_datacount=0then  begin  insertintotb_testnum(boxnumber,usertype)values(p_boxnumber,p_usertype);  if@error_count<>0then  begin  setp_result=3;  end;  else  begin  setp_result=0;  end;  endif;  end;  else  begin  setp_result=2;  end;  endif;    leavepr_dealtestnum_label;  end;  //  delimiter;  select'createprocedurepr_dealtestnumok';

总结

从上面可以看出。一个短短的存储过程。就有这么多需要优化的地方。看来存储过程的编写也不是一件很简单的事情。平时在编写代码(不仅仅是存储过程)的时候。一定要从功能、可读性、性能等多方面来考虑。这样才能够写出优美的、具备较长生命周期的存储过程。

以上就是由优质生活领域创作者 生活常识网 整理编辑的,如果觉得有帮助欢迎收藏转发~

分享到 :
相关推荐

网络营销学习(新人如何学习网络营销)

请用语音读文章  网络营销是以现代营销理论为基础。利用网络对产品的售前、售中、售后[...

关于创业的软件有哪几个(寻找创业项目有哪几个渠道)

请用语音读文章没有什么靠谱的创业服务平台。创业项目服务平台目前基本都是忽悠人转会员[...

微信积分商城兑换礼品在哪里(好的plus)

请用语音读文章谁说微信就只能发发文章、畅玩游戏获取客户。“微库”近期为公众号运营服[...

Ccf手游王者之心礼包每发小号的钻石以及钥匙需要多少(手游王者之心要多少钻石)

请用语音读文章人生如戏。全靠演技。先给看官大老爷问好了。我是天意游戏解说。(介绍完[...

发表评论

您的电子邮箱地址不会被公开。