数据查询方法和装置制造方法

文档序号:6626839阅读:154来源:国知局
数据查询方法和装置制造方法
【专利摘要】本发明提供了一种数据查询方法和装置,其中,该方法包括:在接收的结构化查询语言SQL语句中携带变量名称时,获取用户根据变量名称输入的查询条件值;将变量名称与查询条件值进行绑定;预判SQL语句执行输出的查询结果的数据类型;根据预判的数据类型为SQL语句执行输出的查询结果分配数据存储变量数组;执行SQL语句,将查询结果存储在分配的数据存储变量数组中,将数据存储变量数组中存储的查询结果提供给应用程序。本发明解决了在查询条件不确定的情况下,无法采用绑定变量的SQL方式进行数据查询而导致的数据查询的安全性不高和系统数据处理效率低下的技术问题,达到了有效提高数据查询安全性和提高数据处理效率的技术效果。
【专利说明】数据查询方法和装置

【技术领域】
[0001] 本发明涉及数据处理【技术领域】,特别涉及一种数据查询方法和装置。

【背景技术】
[0002] Oracle数据库是当前主流的数据库之一,目前,许多企业采用Oracle数据库进行 企业数据的存储。在使用应用软件的过程中,经常需要进行灵活条件的查询,例如:一个查 询可能存在多项查询条件,但并非所有的查询条件都是必要的,用户在使用的时候往往仅 需要其中部分的查询条件就可以满足查询要求。因此,需要灵活的查询,以允许用户灵活把 握查询的维度和粒度,从而更为方便快速地查询到用户所需的结果。
[0003] 对于上述的灵活查询,通常在JAVA中可以直接实现,然而出于对系统分层设计的 考虑,浏览器/服务器模式(Browser/Server,BS)系统中通常将对数据库的访问采用存储 过程的方式实现,即,所有的数据库逻辑都在存储过程中实现,JAVA程序在整个过程中只调 用存储过程、传递输入参数、获取结果。
[0004] 然而,在实际使用的过程中,Oracle数据库的存储过程使用的过程化 SQL (Procedural Language/SQL,PL/SQL)语言中的本地动态结构化查询语言(Structured Query Language,SQL)在查询条件使用绑定变量时,只能支持固定的查询条件。如果查询 条件不固定,但需要使用SQL,那么就需要使用非绑定变量的方式进行查询,然而,非绑定变 量的SQL查询方式存在如下两个问题:1)会因为无法共享SQL而造成大量的硬解析,导致 系统开销增大,处理效率下降;2)由于非绑定变量方式中直接将变量值写入SQL语句文本 中,存在SQL引入问题,容易出现安全风险。
[0005] 因此,在查询条件不固定的情况下,如何使用绑定变量的方式进行SQL数据查询 显得尤为重要。


【发明内容】

[0006] 本发明实施例提供了一种数据查询方法,以达到在查询条件不固定的情况下采用 绑定变量的SQL方式进行数据查询的目的,其中,该方法包括:
[0007] 在接收的结构化查询语言SQL语句中携带变量名称时,获取用户根据所述变量名 称输入的查询条件值;
[0008] 将所述变量名称与所述查询条件值进行绑定;
[0009] 预判所述SQL语句执行输出的查询结果的数据类型;
[0010] 根据预判的数据类型为所述SQL语句执行输出的查询结果分配数据存储变量数 组;
[0011] 执行所述SQL语句,将所述SQL语句执行输出的查询结果存储在分配的数据存储 变量数组中;
[0012] 将所述数据存储变量数组中存储的查询结果提供给应用程序。
[0013] 在一个实施例中,根据预判的数据类型为所述SQL语句执行输出的查询结果分配 数据存储变量数组,包括:
[0014] 在所述SQL语句执行输出的查询结果中包括多个输出字段时,确定所述多个输出 字段中各个输出字段的数据类型,根据确定的数据类型为每个字段分别分配对应的数据存 储变量数组中的元素。
[0015] 调用预定的绑定函数,将输出字段与数据存储变量数组中的元素进行一对一的绑 定。
[0016] 在一个实施例中,执行所述SQL语句,将所述SQL语句执行输出的查询结果存储在 分配的数据存储变量数组中,包括:
[0017] 为所述SQL语句分配游标;
[0018] 根据分配的游标,将所述SQL语句执行输出的查询结果逐一存储在分配的数据存 储变量数组对应的元素中。
[0019] 在一个实施例中,在将所述数据存储变量数组中存储的查询结果提供给应用程序 之后,所述方法还包括:
[0020] 释放为所述SQL语句分配的游标,和所述数据存储变量数组所占用的资源。
[0021] 在一个实施例中,将所述SQL语句执行输出的查询结果存储在分配的数据存储变 量数组中,包括:
[0022] 设定游标在所述查询结果的第一条记录上,将所述第一条记录存储至所述数据存 储变量数组中;
[0023] 移动游标至下一条记录上,确定是否存在记录;
[0024] 如果存在记录,则将当前的记录存储至所述数据存储变量数组对应的元素中,直 至游标移动至最后一条记录。
[0025] 在一个实施例中,所述SQL语句中携带的变量名称,和用户输入的查询条件值是 可变的。
[0026] 本发明实施例还提供了一种数据查询装置,以达到在查询条件不固定的情况下采 用绑定变量的SQL方式进行数据查询的目的,其中,该装置包括:
[0027] 获取模块,用于在接收的结构化查询语言SQL语句中携带变量名称时,获取用户 根据所述变量名称输入的查询条件值;
[0028] 绑定模块,用于将所述变量名称与所述查询条件值进行绑定;
[0029] 分配模块,用于预判所述SQL语句执行输出的查询结果的数据类型,并根据预判 的数据类型为所述SQL语句执行输出的查询结果分配数据存储变量数组;
[0030] 执行模块,用于执行所述SQL语句,将所述SQL语句执行输出的查询结果存储在分 配的数据存储变量数组中;
[0031] 提供模块,用于将所述数据存储变量数组中存储的查询结果提供给应用程序。
[0032] 在一个实施例中,所述分配模块包括:
[0033] 预判单元,用于预判所述SQL语句执行输出的查询结果的数据类型;
[0034] 元素分配单元,用于根据所述预判单元确定的数据类型为各个字段分别分配对应 的数据存储变量数组中的元素;
[0035] 绑定单元,用于在根据确定的数据类型为每个字段分别分配对应的数据存储变量 数组中的元素之后,调用预定的绑定函数,将输出字段与数据存储变量数组中的元素进行 一对一的绑定。
[0036] 在一个实施例中,所述执行模块包括:
[0037] 游标分配单元,用于为所述SQL语句分配游标;
[0038] 存储单元,用于根据分配的游标,将所述SQL语句执行输出的查询结果逐一存储 在分配的数据存储变量数组对应的元素中。
[0039] 在一个实施例中,上述装置还包括:
[0040] 释放模块,用于在所述提供单元将所述数据存储变量数组中存储的查询结果提供 给应用程序之后,释放为所述SQL语句分配的游标,和所述数据存储变量数组所占用的资 源。
[0041] 在一个实施例中,所述提供模块包括:
[0042] 设定单元,用于设定游标在所述查询结果的第一条记录上,将所述第一条记录存 储至所述数据存储变量数组中;
[0043] 移动单元,移动游标至下一条记录上,确定是否存在记录;
[0044] 存储单元,用于在确定存在记录的情况下,将当前的记录存储至所述数据存储变 量数组对应的元素中,直至游标移动至最后一条记录。
[0045] 在本发明实施例中,在上述实施例中,在确定接收到的SQL语句中携带有变量名 称的情况下,获取用户根据该变量名称输入的查询条件值,将两者进行绑定,然后预判SQL 语句执行输出的查询结果的数据类型,按照该数据类型为输出结果分配数据存储变量数 组,最终执行SQL语句,将输出的查询结果存储至分配的数据存储变量数组中,以完成整个 数据查询过程。通过上述方式,先对变量和变量值进行绑定,然后确定执行SQL语句后输出 的查询结果的数据类型,以便为其分配合适的存储空间,从而实现了在查询条件不固定的 情况下也可以采用绑定变量的SQL方式进行数据查询,解决了现有技术中在查询条件不确 定的情况下,无法采用绑定变量的SQL方式进行数据查询而导致的数据查询的安全性不高 的技术问题,达到了有效提高数据查询安全性的技术效果。

【专利附图】

【附图说明】
[0046] 此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,并不 构成对本发明的限定。在附图中:
[0047] 图1是本发明实施例的数据查询方法的方法流程图;
[0048] 图2是本发明实施例的基于Oracle数据库的数据查询装置的结构框图;
[0049] 图3是本发明实施例的查询单元的结构框图;
[0050] 图4是本发明实施例的应用程序端的数据处理单元的结构框图;
[0051] 图5是本发明实施例的基于Oracle数据库的数据查询方法的方法流程图;
[0052] 图6是本发明实施例的数据查询装置的结构框图。

【具体实施方式】
[0053] 为使本发明的目的、技术方案和优点更加清楚明白,下面结合实施方式和附图,对 本发明做进一步详细说明。在此,本发明的示意性实施方式及其说明用于解释本发明,但并 不作为对本发明的限定。
[0054] 发明人考虑到现有技术中,对于不定查询条件的查询存在安全性不高的技术问 题。然而,这个问题的产生主要是因为目前对不定查询条件只能采用非绑定变量方式。对 此,在本例中提出了一种数据查询方法以解决上述问题,如图1所示,该方法包括以下步 骤:
[0055] 步骤101:在接收的结构化查询语言SQL语句中携带变量名称时,获取用户根据所 述变量名称输入的查询条件值;
[0056] 步骤102:将所述变量名称与所述查询条件值进行绑定;
[0057] 步骤103 :预判所述SQL语句执行输出的查询结果的数据类型;
[0058] 步骤104 :根据预判的数据类型为所述SQL语句执行输出的查询结果分配数据存 储变量数组;
[0059] 步骤105 :执行所述SQL语句,将所述SQL语句执行输出的查询结果存储在分配的 数据存储变量数组中;
[0060] 步骤106 :将所述数据存储变量数组中存储的查询结果提供给应用程序。
[0061] 在上述实施例中,在确定接收到的SQL语句中携带有变量名称的情况下,获取用 户根据该变量名称输入的查询条件值,将两者进行绑定,然后预判SQL语句执行输出的查 询结果的数据类型,按照该数据类型为输出结果分配数据存储变量数组,最终执行SQL语 句,将输出的查询结果存储至分配的数据存储变量数组中,并将存储在数据存储变量数组 中的查询结果提供给应用程序,以完成整个数据查询过程。通过上述方式,先对变量和变量 值进行绑定,然后确定执行SQL语句后输出的查询结果的数据类型,以便为其分配合适的 存储空间,从而实现了在查询条件不固定的情况下也可以采用绑定变量的SQL方式进行数 据查询,解决了现有技术中在查询条件不确定的情况下,无法采用绑定变量的SQL方式进 行数据查询而导致的数据查询的安全性不高的技术问题,达到了有效提高数据查询安全性 的技术效果。
[0062] 在实施的过程中,在执行上述步骤101获取SQL语句中的变量名称时,可以先判断 SQL是否携带有变量,只有在SQL语句有变量的时候才需要进行后续的绑定的过程,否则不 需要进行后续的绑定过程,在一个实施例中,按照下述方式获取SQL语句中的变量名称:接 收所述SQL语句;判断所述SQL语句中是否携带有变量;如果有,则获取所述SQL语句中的 变量名称。通过上述方式,可以有效避免不必要的操作处理,节省查询时间。
[0063] 在为输出结果分配数据存储变量数组的过程中,数据存储变量数组中包含多个字 段或者是包含多个元素,每种数据类型都有与其对应的字段,每个输出字段对应数组中的 一条记录,因此可以根据输出字段的类型将字段绑定到相应的字段值中。
[0064] 具体的,在分配数据存储变量数组之后,还需要对输出字段和数据存储变量数组 中的元素进行绑定,可以根据数据的类型调用合适的DBMS_SQL. DEFINE_C0LUMN方法将输 出字段和数据存储变量数组进行绑定,如果有多个字段则进行多次绑定。即,在为所述多个 输出字段中的每个输出字段,分别分配一个数据存储变量数组中的元素之后,所述方法还 包括:调用预定的绑定方法,将输出字段与数据存储变量数组中的元素进行一对一的绑定。 [0065] 在实际执行的过程中,为了将查询结果存储在数据存储变量数组中,还需要为其 分配游标,通过游标实现查询结果的存储,具体的,执行所述SQL语句,将所述SQL语句执行 输出的查询结果存储在分配的数据存储变量数组中,可以包括:为所述SQL语句分配游标; 根据分配的游标,将所述SQL语句执行输出的查询结果逐一存储在分配的数据存储变量数 组对应的元素中。
[0066] 因为为查询结果分配了数组和游标,这些资源在将查询结果提供给应用程序后就 没有存在价值,因此,为了节省资源,在将所述数据存储变量数组中存储的查询结果提供给 应用程序之后,还可以包括:释放为所述SQL语句分配的游标,和所述数据存储变量数组所 占用的资源,从而使得这部分资源可以用于其它地方,以实现资源的有效利用,避免不合理 的占用。
[0067] 在将执行所述SQL语句后输出的查询结果存储在分配的数据存储变量数组中的 过程中,可以是采用移动游标的方式逐条记录进行存储,具体而言:执行所述SQL语句得到 查询结果;设定游标在查询结果的第一条记录上,将所述第一条记录存储至所述数据存储 变量数组中;移动游标至下一条记录上,移动游标至下一条记录上,确定是否存在记录;如 果存在记录,则将当前的记录存储至所述数据存储变量数组对应的元素中,直至游标移动 至最后一条记录。然而值得注意的是,考虑如果一次性将所有字段都取出,则可能由于记录 太多而导致存储资源不够用,在实现的过程中可以通过数据库端的数据处理单元和应用程 序端的数据处理单元两者的结合来实现数据的存储,只有应用程序发起请求,希望获取数 据,才会给应用程序提供一条记录,而并非一起把所有的记录都提供给应用程序。
[0068]在上述各个实施例中,SQL语句中携带的变量名称和用户输入的查询条件值是可 变的,即,可以根据需求输入和选择。
[0069] 下面将结合一个具体的实施例对上述数据查询方法进行具体描述,然而值得注意 的是,该具体实施例仅是为了更好地说明本发明,并不构成对本发明的不当限定。
[0070] 在本例中,提供了一种基于Oracle数据库的数据查询装置,可以基于Oracle数据 库进行安全灵活的、支持不定查询条件的、绑定变量形式的数据查询。如图2所示,该装置 包括:SQL接收单元01、变量接收单元02、查询单元03、数据输出单元04、应用程序端的数 据处理单元05、应用程序端的查询关闭单元06,下面对该结构中各个单元进行具体描述:
[0071] 1) SQL接收单元01,用于从应用存储过程或应用程序中接收SQL语句(该SQL语 句可以是字符串),即,在SQL语句中通常包含变量名称,可以由应用存储过程调用SQL接收 单元01,也可以由应用程序(例如JAVA程序)调用SQL接收单元01。SQL接收单元01部 署在Oracle数据库服务器中,该Oracle数据库服务器可以是Windows、Unix、Linux等操作 系统的服务器。
[0072] 2)变量接收单元02,用于从应用存储过程或应用程序中接收变量值(即,用户输 入的查询条件值),对于变量值的数量可以是任意多个,只要不超过Oracle系统本身的限 制即可,可以由存储过程调用SQL接收单元02,也可以由应用程序调用SQL接收单元02。变 量接收单元02也部署在Oracle数据库服务器中。
[0073] 该单元包含变量数组Variable_Array及一组支持各种数据类型的变量的接收方 法,其中,变量数组VariableArray的结构可以如表1所示:
[0074]表1
[0075]

【权利要求】
1. 一种数据查询方法,其特征在于,包括: 在接收的结构化查询语言SQL语句中携带变量名称时,获取用户根据所述变量名称输 入的查询条件值; 将所述变量名称与所述查询条件值进行绑定; 预判所述SQL语句执行输出的查询结果的数据类型; 根据预判的数据类型,为所述SQL语句执行输出的查询结果分配数据存储变量数组; 执行所述SQL语句,将所述SQL语句执行输出的查询结果存储在分配的数据存储变量 数组中; 将所述数据存储变量数组中存储的查询结果提供给应用程序。
2. 如权利要求1所述的方法,其特征在于,根据预判的数据类型,为所述SQL语句执行 输出的查询结果分配数据存储变量数组,包括: 在所述SQL语句执行输出的查询结果中包括多个输出字段时,确定所述多个输出字段 中各个输出字段的数据类型,根据确定的数据类型为每个字段分别分配对应的数据存储变 量数组中的元素; 调用预定的绑定函数,将输出字段与数据存储变量数组中的元素进行一对一的绑定。
3. 如权利要求2所述的方法,其特征在于,执行所述SQL语句,将所述SQL语句执行输 出的查询结果存储在分配的数据存储变量数组中,包括: 为所述SQL语句分配游标; 根据分配的游标,将所述SQL语句执行输出的查询结果逐一存储在分配的数据存储变 量数组对应的元素中。
4. 如权利要求3所述的方法,其特征在于,在将所述数据存储变量数组中存储的查询 结果提供给应用程序之后,所述方法还包括: 释放为所述SQL语句分配的游标、和所述数据存储变量数组所占用的资源。
5. 如权利要求1所述的方法,其特征在于,将所述SQL语句执行输出的查询结果存储在 分配的数据存储变量数组中,包括: 设定游标在所述查询结果的第一条记录上,将所述第一条记录存储至所述数据存储变 量数组中; 移动游标至下一条记录上,确定是否存在记录; 如果存在记录,则将当前的记录存储至所述数据存储变量数组对应的元素中,直至游 标移动至最后一条记录。
6. 如权利要求1至5中任一项所述的方法,其特征在于,所述SQL语句中携带的变量名 称,和用户输入的查询条件值是可变的。
7. -种数据查询装置,其特征在于,包括: 获取模块,用于在接收的结构化查询语言SQL语句中携带变量名称时,获取用户根据 所述变量名称输入的查询条件值; 绑定模块,用于将所述变量名称与所述查询条件值进行绑定; 分配模块,用于预判所述SQL语句执行输出的查询结果的数据类型,并根据预判的数 据类型为所述SQL语句执行输出的查询结果分配数据存储变量数组; 执行模块,用于执行所述SQL语句,将所述SQL语句执行输出的查询结果存储在分配的 数据存储变量数组中; 提供模块,用于将所述数据存储变量数组中存储的查询结果提供给应用程序。
8. 如权利要求7所述的装置,其特征在于,所述分配模块包括: 预判单元,用于预判所述SQL语句执行输出的查询结果的数据类型; 元素分配单元,用于根据所述预判单元确定的数据类型为各个字段分别分配对应的数 据存储变量数组中的元素; 绑定单元,用于在根据确定的数据类型为每个字段分别分配对应的数据存储变量数组 中的元素之后,调用预定的绑定函数,将输出字段与数据存储变量数组中的元素进行一对 一的绑定。
9. 如权利要求8所述的装置,其特征在于,所述执行模块包括: 游标分配单元,用于为所述SQL语句分配游标; 存储单元,用于根据分配的游标,将所述SQL语句执行输出的查询结果逐一存储在分 配的数据存储变量数组对应的元素中。
10. 如权利要求9所述的装置,其特征在于,还包括: 释放模块,用于在所述提供单元将所述数据存储变量数组中存储的查询结果提供给应 用程序之后,释放为所述SQL语句分配的游标,和所述数据存储变量数组所占用的资源。
11. 如权利要求7至10中任一项所述的装置,其特征在于,所述提供模块包括: 设定单元,用于设定游标在所述查询结果的第一条记录上,将所述第一条记录存储至 所述数据存储变量数组中; 移动单元,移动游标至下一条记录上,确定是否存在记录; 存储单元,用于在确定存在记录的情况下,将当前的记录存储至所述数据存储变量数 组对应的元素中,直至游标移动至最后一条记录。
【文档编号】G06F17/30GK104239508SQ201410466552
【公开日】2014年12月24日 申请日期:2014年9月12日 优先权日:2014年9月12日
【发明者】黄坚, 戴明海 申请人:中国工商银行股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1