当前位置: 首页 > 科技观察

存储过程

时间:2023-03-19 14:56:23 科技观察

MySQL基础教程存储过程简单来说,存储过程就是一个或多个MySQL语句的集合,保存起来以备将来使用。将它们视为批处理文件,尽管它们不限于批处理。在我看来,存储过程是业务逻辑和流程的集合,在其中可以创建表、更新数据、删除数据等。为什么使用存储过程通过将处理封装在易于使用的单元中来简化复杂的操作(如前例所示)。这通过不需要重复设置一系列处理步骤来确保数据完整性。如果所有开发人员和应用程序都使用相同的(试用和测试)存储过程,则使用的代码是相同的。其扩展是错误预防。需要执行的步骤越多,出错的可能性就越大。防止错误可确保数据的一致性。简化变更管理。如果表名、列名或业务逻辑(或其他内容)发生变化,只需要更改存储过程的代码即可。使用它的人甚至不需要知道这些变化。一个简单的存储过程createprocedureporcedureName()beginselectnamefromuser;end;存储过程用createprocedure创建,业务逻辑和sql写在begin和end之间。调用过程名();可以在mysql中调用程序。--调用过程callporcedureName();这个存储过程没有参数,调用时只是查询user表的用户名,调用结果如下存储过程createprocedureprocedureName(outmindecimal(8,2),outavgdecimal(8,2),outmaxdecimal(8,2))BEGINselectMIN(price)INTOminfromorder;selectAVG(price)intoavgfromorder;selectMAX(price)intomaxfromorder;END;这??个过程接受三个参数,分别用于获取订单表的最低价、平均价和最高价。每个参数必须指定类型,这里使用十进制值(decimal(8,2)),关键字OUT表示对应的参数用于从存储过程中传递一个值(返回给调用者)MySQL支持IN(传递给存储过程)、OUT(在存储过程之外,如此处所用)和INOUT(在存储过程中进出)类型参数。存储过程的代码位于BEGIN和END语句内部,如前所述,它们是一系列SELECT语句,用于检索值,然后将它们保存到相应的变量(通过指定INTO关键字)以调用这个修改后的存储过程,必须指定三个变量名,如下所示:(所有MySQL变量必须以@开头。)--由于该过程指定了三个参数,所以调用必须匹配参数callprocedureName(@min,@avg,@最大限度);该调用没有任何输出,但调用的结果被分配给调用中传递的变量(@min、@avg、@max)。然后您可以调用以显示该变量的值。选择@min,@avg,@max;结果如下@min@avg@max42.00601.002222.00使用in参数,输入一个用户id,返回该用户所有订单的总价。createproceduregetTotalById(inuserIdint,outtotaldecimal(8,2))BEGINselectSUM(r.price)fromorderrwherer.u_id=userIdintototal;END;调用存储过程callgetTotalById(1,@total);select@total;结果会返回所有的总价用户的订单。比较复杂的流程,根据用户id获取该用户所有的订单价格,动态选择是否加税。代码设计如下createproceduregetTotalByUser2(inuserIdint,infalgboolean,--是否加税标outtotaldecimal(8,2))beginDECLAREtmptotalDECIMAL(8,2);DECLAREtaxrateintDEFAULT6;--默认税率selectSUM(r.price)fromorderrwherer.u_id=userIdintotmptotal;iftaxablethenselecttmptotal+(tmptotal/1000*taxrate)intotmptotal;endif;selecttmptotalintototal;END;这个流程传入三个参数,userid,是否加税和返回的总价,在流程内部,定义了两个局部变量tmptotal和taxrate,将查询的结果赋值给一个临时变量来判断是否加税。最后,将局部变量的值赋给输出参数。callgetTotalByUser2(1,false,@total);--不增税callgetTotalByUser2(1,true,@total);--增税select@total;