调用数据库存储过程的方法及装置与流程

文档序号:19431291发布日期:2019-12-17 16:50阅读:345来源:国知局
本发明涉及通信领域,具体而言,涉及一种调用数据库存储过程的方法及装置。
背景技术
::在运用关系型数据库开发的程序中,调用数据库存储是对数据库操作很常见的操作方式。存储过程(storedprocedure)是在大型数据库系统中,一组为了完成特定功能的sql语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。程序调用存储过程,需要输入全部存储过程的输入参数,且顺序需要完全符合存储过程的设定;而现实中往往不是所有输入参数都需要传入,而且调用存储过程的程序开发也不是很关心参数的顺序。例如,数据库开发人员写了一个存储,命名为pr_userinfo_upd,用于更新用户信息表(userinfo);开发人员的调用方式是调用数据库语句实现sql语句callpr_userinfo_upd(p_user_id,p_user_name,p_user_age,p_user_sex,p_user_phone)来更新用户的信息,其中,需要输入用户id(用户表的唯一键),用户名字,用户年龄,用户性别,用户手机号。但是,如果只想更新用户的手机号,操作起来就很麻烦了,需要先把上述用户信息从数据库里面全部查询出来,然后替换掉手机号,再执行这个存储过程。为了节约开发成本,数据库不可能无限制的增加存储过程,例如,更新用户手机是一个存储过程,更新用户姓名是一个存储过程,更新用户年龄是一个存储过程等等,这样需要些很多很多种存储过程来满足更改用户信息这样一个功能;而是统一提供一个接口来改所有用户信息,当只需要更改用户的某个信息的时候,程序就需要从数据库里面,将上述所有的用户信息读取出来,然后再更新需要修改的字段,在调用这个通用的存储来实现更改用户的某个信息的功能。此外,还存在另一个问题,传入存储过程的参数必须严格按照规定的顺序,如果顺序不对,就会出现不可预知的错误出来。例如,以上面的pr_userinfo_upd为例,callpr_userinfo_upd(p_user_id,p_user_name,p_user_age,p_user_sex,p_user_phone)这个是数据库定义模板正确的调用方式是callpr_userinfo_upd(10001,王xx,18,女,12345678901);说的是更新用户id为10001的这个用户,姓名改为王xx,年龄改为18,性别改为女,手机号改为12345678901。而错误的调用方式,例如,callpr_userinfo_upd(10001,王xx,女,18,12345678901);这样性别和年龄就会反了。程序里面的列表数据往往是无序的,或者顺序和存储不一定对等。以php语言为例,array是php里面的数组数据类型$datalist=array(user_age=>18,user_name=>王xx,user_phone=>12345678901,user_id=>10001,user_sex=>女,);表示申明一个数组类型datalist里面有年龄,姓名,手机号,用户id,性别。当要用datalist来调用存储过程更新用户数据的时候,就必须一个字段,一个字段的对齐。而这样操作,就必须先了解存储过程是怎么定义的,参数是什么顺序。在需要使用数据库的程序开发的过程中,会遇到很多使用存储过程的场景,例如,增加一条个人信息表数据,或者增加一张体检信息表数据。这种数据库表可能会有很多的字段,甚至可能会达到成百上千个字段;这样每次程序调用存储过程添加数据的时候,不得不将所有的字段慢慢的核对位置和值是否匹配,大大地增加了无效和重复的工作。技术实现要素:本发明的主要目的在于公开了一种调用数据库存储过程的方法及装置,以至少解决相关技术中针对大量调用存储过程的场景,每次程序调用存储过程添加数据的时候,不得不将所有的字段慢慢的核对位置和值是否匹配,大大地增加了无效和重复工作的问题。根据本发明的一个方面,公开了一种调用数据库存储过程的方法。根据本发明的调用数据库存储过程的方法包括:调用数据库接口,获取待调用的存储过程在该数据库中所对应的参数列表param_list;在上述存储过程的类型为更新表格类型且上述存储过程所要更新的表的主键不为空时,采用上述数据库接口查询出上述主键的数据列表datalist_org;循环执行参数列表param_list,如果传入参数中有待填充参数,则将上述传入参数填充到新建的空数组datalist_dest中,如果传入参数中没有上述待填充参数,则将从上述数据库数据列表中查询出来的数据填充到上述空数组datalist_dest中,如果传入参数和数据列表datalist_org中均没有待填充参数,则将待填充参数复制为空字符串填充到上述空数组datalist_dest中;使用填充完的数组datalist_dest作为传入参数来调用存储过程。优选地,上述参数列表param_list包括按照顺序排列好的多个参数。优选地,采用上述数据库接口查询出上述主键的数据列表datalist_org之前,还包括:根据上述存储过程的命名的全部或部分字段判断存储过程的类型是否为更新表格类型;在上述命名的全部或部分字段包括预定字段时,确定上述存储过程的类型为更新表格类型。优选地,根据上述存储过程的命名的全部或部分字段判断存储过程的类型是否为更新表格类型,在上述命名的全部或部分字段包括预定字段时,确定上述存储过程的类型为更新表格类型包括:判断上述存储过程的命名的后缀是否是“_upd”字段;在上述存储过程的命名的后缀是“_upd”字段时,确定上述存储过程的类型为更新表格类型。优选地,在循环执行参数列表param_list之前,还包括:新建上述空数组datalist_dest。根据本发明的一个方面,公开了一种调用数据库存储过程的装置。根据本发明的调用数据库存储过程的装置包括:获取模块,用于调用数据库接口,获取待调用的存储过程在该数据库中所对应的参数列表param_list;查询模块,用于在上述存储过程的类型为更新表格类型且上述存储过程所要更新的表的主键不为空时,采用上述数据库接口查询出上述主键的数据列表datalist_org;循环执行模块,用于循环执行参数列表param_list,如果传入参数中有待填充参数,则将上述传入参数填充到新建的空数组datalist_dest中,如果传入参数中没有上述待填充参数,则将从上述数据库数据列表中查询出来的数据填充到上述空数组datalist_dest中,如果传入参数和数据列表datalist_org中均没有待填充参数,则将待填充参数复制为空字符串填充到上述空数组datalist_dest中;调用模块,用于使用填充完的数组datalist_dest作为传入参数来调用存储过程。优选地,上述参数列表param_list包括按照顺序排列好的多个参数。优选地,上述装置还包括:判断模块,用于根据上述存储过程的命名的全部或部分字段判断存储过程的类型是否为更新表格类型;确定模块,用于在上述命名的全部或部分字段包括预定字段时,确定上述存储过程的类型为更新表格类型。优选地,上述判断模块包括:判断单元,用于判断上述存储过程的命名的后缀是否是“_upd”字段;上述确定模块包括:确定单元,用于在上述存储过程的命名的后缀是“_upd”字段时,确定上述存储过程的类型为更新表格类型。优选地,上述装置还包括:建立模块,用于建立上述空数组datalist_dest。与现有技术相比,本发明实施例至少具有以下优点:开发人员不用关心存储过程参数的顺序,也不用关心如果是更新数据库表的话,需要传入全部信息这个问题,可简化程序调用存储过程的方案,使程序开发人员调用存储更为方便。附图说明图1是根据本发明实施例的调用数据库存储过程的方法的流程图;图2是根据本发明优选实施例的调用数据库存储过程的方法的流程图;图3是根据本发明实施例的调用数据库存储过程的装置的结构框图;以及图4是根据本发明优选实施例的调用数据库存储过程的装置的结构框图。具体实施方式下面结合说明书附图对本发明的具体实现方式做一详细描述。图1是根据本发明实施例的调用数据库存储过程的方法的流程图。如图1所示,该调用数据库存储过程的方法包括:步骤s101:调用数据库接口,获取待调用的存储过程在该数据库中所对应的参数列表param_list;步骤s103:在上述存储过程的类型为更新表格类型且上述存储过程所要更新的表的主键不为空时,采用上述数据库接口查询出上述主键的数据列表datalist_org;步骤s105:循环执行参数列表param_list,如果传入参数中有待填充参数,则将上述传入参数填充到新建的空数组datalist_dest中,如果传入参数中没有上述待填充参数,则将从上述数据库数据列表中查询出来的数据填充到上述空数组datalist_dest中,如果传入参数和数据列表datalist_org中均没有待填充参数,则将待填充参数复制为空字符串填充到上述空数组datalist_dest中;步骤s107:使用填充完的数组datalist_dest作为传入参数来调用存储过程。现有的程序开发者调用存储过程的方式是使用第三方的数据库插件,按照存储过程的参数定义,顺序的传入所有存储过程要求的参数以实现调用存储。而采用图1所示的方法,抽象出一种方法给数据库开发人员调用,开发人员不用关心存储过程参数的顺序,也不用关心如果是更新数据库表的话,需要传入全部信息这个问题,可简化程序调用存储过程的方案,使程序开发人员调用存储更为方便。优选地,上述参数列表param_list可以进一步包括按照顺序排列好的多个参数。例如,查询出来的就是$param_list=array("p_user_id","p_user_name","p_user_age","p_user_sex","p_user_phone");在调用存储过程之前,先拉取该存储的调用参数,按照顺序,根据用户所要传入数据,和原有的表格数据来填补存储参数,这时调用存储就能保证存储参数的有效性和顺序了。优选地,采用上述数据库接口查询出上述主键的数据列表datalist_org之前,还可以包括:根据上述存储过程的命名的全部或部分字段判断存储过程的类型是否为更新表格类型;在上述命名的全部或部分字段包括预定字段时,确定上述存储过程的类型为更新表格类型。在优选实施过程中,根据上述存储过程的命名的全部或部分字段判断存储过程的类型是否为更新表格类型,在上述命名的全部或部分字段包括预定字段时,确定上述存储过程的类型为更新表格类型可以进一步包括:判断上述存储过程的命名的后缀是否是“_upd”字段;在上述存储过程的命名的后缀是“_upd”字段时,确定上述存储过程的类型为更新表格类型。在优选实施过程中,如何确定当前存储过程是否更新表的存储,涉及到了需要预先规范存储过程的命名。例如,插入一条数据的存储过程命名可以为pr_表名_add,修改一条数据的存储过程命名可以为pr_表名_upd;则如果是以_upd结尾的存储过程,就可以确定这个是更新表数据的存储了。优选地,在循环执行参数列表param_list之前,还可以包括:新建上述空数组datalist_dest。在优选实施过程中,需要预先规范存储过程的命名,例如,插入一条数据的存储过程命名为pr_表名_add,修改一条数据的存储过程命名为pr_表名_upd;比如用户信息表,表名为userinfo,这样输入用户信息表的存储命名为pr_userinfo_add,修改用户信息表的存储命名为pr_userinfo_upd,存储参数的命名为p_表字段的名称,比如用户名的表字段名称为username,那当作为存储参数输入时的命名为p_username。调用本发明提供的抽象方法时,需要传入需要调用的pro_name(存储过程名称),table_key(存储所修改的表的主键名称),和所有需要传入datalist(存储的数据列表)。实现方式如下:先调用数据库接口,获取该存储在数据库中所对应的参数列表param_list(以mysql为例查询information_schema.parameters里面对应的数据库和存储的参数列表);如果存储过程的类型为更新表格类型(pro_name以upd结尾)且传入方法的主键(table_key)不为空,用数据库接口查询出该表所对应的主键的列表datalist_org。新建一个空数组datalist_dest,然后循环param_list,如果datalist中所对应的参数有值param,则datalist_dest[param]=datalist[param];如果datalist里没有对应的param且datalist_org里面有对应的参数的值,则datalist_dest[param]=datalist_org[param];如果datalist和datalist_org里都没有对应的param,则datalist_dest[param]复制为空字符串。最后用datalist_dest来充当所调用的数据库存储的参数列表。以下结合图2的示例进一步描述上述优选实施方式。图2是根据本发明优选实施例的调用数据库存储过程的方法的流程图。如图2所示,该调用数据库存储过程的方法包括:步骤s201:先到数据库里面,按照传入参数的顺序查询出该存储过程所需要传入的参数。需要说明的是,上述参数是按照传入参数的顺序,查询出来的,也就是查询出来的是按顺序排列好的。例如,定义了一个函数名字叫runproc,输入参数有3个,pro_name(存储过程名称),table_key(存储所修改的表的主键名称),datalist(存储的数据列表),举例,代码如下:$datalist=array(user_age=>18,user_id=>10001,);runproc("pr_userinfo_upd","user_id",$datalist)。其代码作用为更新用户的年龄为18岁。采用步骤s201的操作,查询出来的结果如下:$paramlist=array("p_user_id","p_user_name","p_user_age","p_user_sex","p_user_phone")。步骤s203:判断当前存储是否是更新表的存储,如果是,则查询出存储过程所要更新的表的主键所对应的数据列表datalist_org。在优选实施过程中,对于如何确定存储是否是更新表的存储,需要涉及到了之前上述的,规范存储过程的命名。例如,插入一条数据的存储过程命名为pr_表名_add,修改一条数据的存储过程命名为pr_表名_upd等,则以_upd结尾的存储过程,可确定这个是更新表数据的存储了。例如,查询出user_id为10001的人的所有用户数据如下:$datalist_org=array(user_age=>17,user_name=>王xx,user_phone=>12345678901,user_id=>10001,user_sex=>女,);此处查询出来的是原始数据,而不是要更新的数据,要更新的是用户年龄更新为18。步骤s205:新建一个空的数组datalist_dest,其中,$datalist_dest=array();数组datalist_dest用来存放最后调用存储过程的数据。由此可见,该数组会慢慢的填充参数,最后把它构建成能够调用存储过程的数据数组。步骤s207:循环执行步骤s201查询出来的参数列表$paramlist,例如,$paramlist=array("p_user_id","p_user_name","p_user_age","p_user_sex","p_user_phone"),循环执行这个数组,逐个填充datalist_dest数组。例如,循环执行里面的代码:while($paramlist=>$param){if($datalist[$param]){$datalist_dest[$param]=$datalist[$param];}elseif($datalist_org[$param]){$datalist_dest[$param]=$datalist_org[$param];}}对于原始数据:$datalist=array(user_age=>18,user_id=>10001,);$datalist_org=array(user_age=>17,user_name=>王xx,user_phone=>12345678901,user_id=>10001,user_sex=>女,);$paramlist=array("p_user_id","p_user_name","p_user_age","p_user_sex","p_user_phone");例如,第一轮循环如下:while($paramlist=>$param){//$param为user_id即当调用者传入的参数里面有user_id,为10001则进入第一个分支;if($datalist[$param]){即最终输出的数组的user_id就用调用者传入的参数。$datalist_dest[$param]=$datalist[$param];}elseif($datalist_org[$param]){$datalist_dest[$param]=$datalist_org[$param];}}当调用者传入的参数里面有user_id为10001时,则最终输出的数组的user_id就用调用者传入的参数。循环参数列表,如果调用者传入参数里面有该参数,则用调用者传入的参数来填充;如果调用者传入的参数列表里面没有该参数,则用从数据库数据列表datalist_org里查询出来的数据来填充。例如,第二轮循环如下:while($paramlist=>$param){//$param为user_name即当调用者传入的参数里面没有user_name,而数据库原始数据列表中有user_name为王xx,则进入第二个分支:if($datalist[$param]){$datalist_dest[$param]=$datalist[$param];}elseif($datalist_org[$param]){即最终输出的数组的user_name就用数据库原始数据列表中的数据。$datalist_dest[$param]=$datalist_org[$param];}}综上,循环执行参数列表param_list,如果传入参数中有待填充参数,则将上述传入参数填充到新建的空数组datalist_dest中,如果传入参数中没有上述待填充参数,则将从上述数据库数据列表中查询出来的数据填充到上述空数组datalist_dest中,如果传入参数和数据列表datalist_org中均没有待填充参数,则将待填充参数复制为空字符串填充到上述空数组datalist_dest中。直至循环结束,以上例而言,得到如下结果:$$datalist_dest=array(user_id=>10001,user_name=>王xx,user_age=>18,user_sex=>女,user_phone=>12345678901,);步骤s209:使用填充完的数组datalist_dest作为传入参数来调用存储过程。图3是根据本发明实施例的调用数据库存储过程的装置的结构框图。如图3所示,该调用数据库存储过程的装置包括:获取模块30,用于调用数据库接口,获取待调用的存储过程在该数据库中所对应的参数列表param_list;查询模块32,用于在上述存储过程的类型为更新表格类型且上述存储过程所要更新的表的主键不为空时,采用上述数据库接口查询出上述主键的数据列表datalist_org;循环执行模块34,用于循环执行参数列表param_list,如果传入参数中有待填充参数,则将上述传入参数填充到新建的空数组datalist_dest中,如果传入参数中没有上述待填充参数,则将从上述数据库数据列表中查询出来的数据填充到上述空数组datalist_dest中,如果传入参数和数据列表datalist_org中均没有待填充参数,则将待填充参数复制为空字符串填充到上述空数组datalist_dest中;调用模块36,用于使用填充完的数组datalist_dest作为传入参数来调用存储过程。采用图3所示的装置,开发人员不用关心存储过程参数的顺序,也不用关心如果是更新数据库表的话,需要传入全部信息这个问题,可简化程序调用存储过程的方案,使程序开发人员调用存储更为方便。优选地,上述参数列表param_list包括按照顺序排列好的多个参数。优选地,如图4所示,该装置还可以包括:判断模块38,与获取模块30相连接,用于根据上述存储过程的命名的全部或部分字段判断存储过程的类型是否为更新表格类型;确定模块40,连接于判断模块38与查询模块32之间,用于在上述命名的全部或部分字段包括预定字段时,确定上述存储过程的类型为更新表格类型。优选地,如图4所示,上述判断模块38可以进一步包括:判断单元380,用于判断上述存储过程的命名的后缀是否是“_upd”字段;上述确定模块40可以进一步包括:确定单元400,用于在上述存储过程的命名的后缀是“_upd”字段时,确定上述存储过程的类型为更新表格类型。优选地,如图4所示,上述装置还可以包括:建立模块42,连接于查询模块32与循环执行模块34之间,用于建立上述空数组datalist_dest。综上所述,借助本发明提供的上述实施例,调用存储前,先拉取该存储过程的调用参数,按照顺序,根据用户所要传入数据,和数据库中原有的数据列表来填充存储参数,这时调用存储就能保证存储参数的有效性和顺序了。采用本发明技术方案,可以让开发人员简化调用存储过程的方法,减少重复而大量的劳动。以上公开的仅为本发明的几个具体实施例,但是,本发明并非局限于此,任何本领域的技术人员能思之的变化都应落入本发明的保护范围。当前第1页1 2 3 当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1