Sql函数转换装置和sql函数转换方法

文档序号:6434506阅读:313来源:国知局
专利名称:Sql函数转换装置和sql函数转换方法
技术领域
本发明涉及数据库技术领域,具体而言,涉及SQL函数转换装置和方法。
背景技术
随着数据库产品的不断增多,除流行的0RACLE、Sql Server、DB2外,目前国内又涌现出了诸如KingbaseES、GBASE、OSCAR等比较成熟的数据库产品,用户基与各种需求对数据库的选择也在增加。作为一款产品化的软件让其支持多种数据库技术是很有必要的。如何让软件产品能与不同的数据库产品交互,面对数十万行的产品代码,不可能针对每种数据库对上层代码进行修改,目前比较流行的做法是尽量使用与数据库无关的通用SQL语句和数据类型;重写与开发工具相关的DataBase对象;在DataBase对象的底层截取SQL串进行与目标数据库相关的替换。其中最重要的工作之一就是对SQL串的替换,SQL串的替换一般有以下几种形式1、直接在上层使用处更改SQL语句,目的是让SQL语句变成通用写法以减少 Database对象的底层替换操作。2、在Database对象的底层,对于替换条件满足唯一正侧表达式的串使用正侧表达式进行替换。3、对于满足有限替换条件,且条件之间不会产生互拆的串使用正侧表达式方式进行顺序替换。不同数据库产品之间的主要差异之一就是数据库的系统函数差异,如以下列举的一些类型的差异1、功能相同但名称不同,如Sql Server中的Len(string_expression)函数与 KingbaseES 中的 Length (string_expression)函数。2、名称相同但功能不同,如Sql Server中的CONVERT函数与KingbaseES中的 CONVERT函数是两个完全无法联系在一起的函数,前者是用作数据类型的转换,后者是用作字符串编码的转换。3、入口参数有差异,如 Sql Server 中的 SPACE(integer_expression)与 KingbaseES 中的 RPAD (char_expression, integer_expression)。4、某一数据库中独有的函数,如 Sql Server 中的 IIf (《Logical Expression)), ((Numeric Expressionl)), ((Numeric Expression2))),在 KingbaseES 中不存在。对于支持多数据库的软件产品,这些差异处理不好会造成错误,如直接报错、由于引用处使用了容错而使代码往错误的逻辑方向运行、返回不是需要的结果等,对开发和测试带来很大的额外工作量。而对SQL串的替换操作不能简单用正侧表达式方式替换,主要有以下三方面原因1、因为函数的使用往往带有复杂的混合、嵌套使用的问题,因而造成无法用正侧表达式表述,例如 Sql server 表述select space (12-len(' 2311'))在 KingbaseES 中的等效转换select RPAD(' ‘,12_length(' 2311'))。2、函数入口参数的多样性造成匹配的正侧表达式的多样性。例如Sql server中 conver函数至少对应20种以上的转换形式。3、由于数据库系统间的差异,无直接匹配的功能函数,还需要通过特定算生成相应的替换串,如Sql server表述select convert (varchar (10), cast( ‘ 2011-01-1209:30:01 ‘ as datetime),102),在 KingbaseES 中的等效转转为 select T0_CHAR(cast(' 2011-01-1209:30:01' as TIMESTAMP), ‘ YYYY.MM.DD')。因此,需要一种比较全面且安全可靠的函数替换技术,可以考虑到不同数据库产品之间的差异,满足多种数据库的要求。

发明内容
本发明所要解决的技术问题在于,提供一种SQL函数转换技术,可以进行全面且安全可靠的函数替换。根据本发明的一个方面,提供了一种SQL函数转换装置,包括第一替换单元,用标识符替换来自调用者的SQL函数中的参数,得到迭代后的SQL函数;数据库单元,将所述标识符与所述参数对应保存为参数对照表;处理单元,根据所述迭代后的SQL函数中的标识符,从所述参数对照表提取出所述参数,对所述参数进行转换处理;第二替换单元,将处理后的所述参数替换所述迭代后的SQL函数中对应的标识符,以得到目标数据库执行的 SQL函数。在上述技术方案中,优选地,所述第一替换单元用第一标识符替换所述SQL函数中的单引号中的用户值,用第二标识符替换所述SQL函数中的小括号中的函数参数,所述迭代后的SQL函数包含所述第一标识符和所述第二标识符。在上述技术方案中,优选地,所述数据库单元将所述第一标识符与所述用户值对应保存为第一参数对照表,将所述第二标识符与所述函数参数对应保存为第二参数对照表,并在所述第二参数对照表中保存所述函数参数在所述SQL函数中的层级。在上述技术方案中,优选地,所述第二替换单元根据所述迭代后的SQL函数中的所述第一标识符和所述第一参数对照表提取出对应的用户值,将提取出的所述用户值替换所述迭代后的SQL函数中对应的所述第一标识符;所述处理单元还包括分解单元和编写单元,所述分解单元根据所述迭代后的SQL函数中的所述第二标识符,从所述第二参数对照表提取出所述函数参数,分解提取出的所述函数参数,所述编写单元按照目标数据库执行的SQL函数规则重新编写分解的所述函数参数,所述第二替换单元将重新编写后的函数参数替换所述迭代后的SQL函数中对应的第二标识符。在上述技术方案中,优选地,所述第一替换单元采用递归算法将所述第二标识符按照从低级到高级的顺序分阶替换所述SQL函数中的小括号中的函数参数,所述第二替换单元按照从高级到低级的顺序将处理后的所述函数参数替换所述迭代后的SQL函数中对应的第二标识符,以得到所述目标数据库执行的SQL函数。通过上述技术方案,可以实现一种SQL函数转换装置,通过迭代技术和对应的函数处理方法来实现SQL函数的转换,将SQL函数转换成目标数据库可以执行的SQL函数,并且转换后的SQL函数全面且准确,不会造成错误的结果。
根据本发明的又一方面,还提供了一种SQL函数转换方法,包括步骤202,用标识符替换来自调用者的SQL函数中的参数,得到迭代后的SQL函数;步骤204,将所述标识符与所述参数对应保存为参数对照表;步骤206,根据所述迭代后的SQL函数中的标识符,从所述参数对照表提取出所述参数,对所述参数进行转换处理,将处理后的所述参数替换所述迭代后的SQL函数中对应的标识符,以得到目标数据库执行的SQL函数。在上述技术方案中,优选地,所述步骤202具体可以包括所述参数包括用户值和函数参数,用第一标识符替换所述SQL函数中的单引号中的所述用户值,用第二标识符替换所述SQL函数中的小括号中的所述函数参数,所述迭代后的SQL函数包含所述第一标识符和所述第二标识符。在上述技术方案中,优选地,所述步骤204具体可以包括将所述第一标识符与所述用户值对应保存为第一参数对照表,将所述第二标识符与所述函数参数对应保存为第二参数对照表,并在所述第二参数对照表中保存所述函数参数在所述SQL函数中的层级。在上述技术方案中,优选地,所述步骤206具体可以包括步骤2062,根据所述迭代后的SQL函数中的所述第二标识符,从所述第二参数对照表提取出所述函数参数,分解提取出的所述函数参数,按照目标数据库执行的SQL函数规则重新编写分解的所述函数参数,将重新编写后的函数参数替换所述迭代后的SQL函数中对应的第二标识符;步骤2064, 根据所述迭代后的SQL函数中的所述第一标识符和所述第一参数对照表提取出对应的用户值,将提取出的所述用户值替换所述迭代后的SQL函数中对应的所述第一标识符。在上述技术方案中,优选地,采用递归算法将所述第二标识符按照从低级到高级的顺序分阶替换所述SQL函数中的小括号中的函数参数,在得到所述目标数据库执行的 SQL函数时,按照从高级到低级的顺序将处理后的所述函数参数替换所述迭代后的SQL函数中对应的第二标识符。通过上述技术方案,可以实现一种SQL函数转换方法,通过迭代技术和对应的函数处理方法来实现SQL函数的转换,将SQL函数转换成目标数据库可以执行的SQL函数,并且转换后的SQL函数全面且准确,不会造成错误的结果。


图1示出了根据本发明的实施例的SQL函数转换装置的框图;图2示出了根据本发明的实施例的SQL函数转换方法的流程图;以及图3示出了根据本发明的实施例的SQL函数转换方法的流程图。
具体实施例方式为了能够更清楚地理解本发明的上述目的、特征和优点,下面结合附图和具体实施方式
对本发明进行进一步的详细描述。在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是,本发明还可以采用其他不同于在此描述的其他方式来实施,因此,本发明并不限于下面公开的具体实施例的限制。图1示出了根据本发明的实施例的SQL函数转换装置的框图。如图1所示,根据本发明的实施例的SQL函数转换装置100包括第一替换单元102,用标识符替换来自调用者的SQL函数中的参数,得到迭代后的SQL函数;数据库单元 104,将所述标识符与所述参数对应保存为参数对照表;处理单元106,根据所述迭代后的 SQL函数中的标识符,从所述参数对照表提取出所述参数,对所述参数进行转换处理;第二替换单元108,将处理后的所述参数替换所述迭代后的SQL函数中对应的标识符,以得到目标数据库执行的SQL函数。在上述技术方案中,优选地,所述第一替换单元102用第一标识符替换所述SQL函数中的单引号中的用户值,用第二标识符替换所述SQL函数中的小括号中的函数参数,所述迭代后的SQL函数包含所述第一标识符和所述第二标识符。在上述技术方案中,优选地,所述数据库单元104将所述第一标识符与所述用户值对应保存为第一参数对照表,将所述第二标识符与所述函数参数对应保存为第二参数对照表,并在所述第二参数对照表中保存所述函数参数在所述SQL函数中的层级。在上述技术方案中,优选地,所述第二替换单元108根据所述迭代后的SQL函数中的所述第一标识符和所述第一参数对照表提取出对应的用户值,将提取出的所述用户值替换所述迭代后的SQL函数中对应的所述第一标识符;所述处理单元106还包括分解单元 1062和编写单元1064,所述分解单元1062根据所述迭代后的SQL函数中的所述第二标识符,从所述第二参数对照表提取出所述函数参数,分解提取出的所述函数参数,所述编写单元1064按照目标数据库执行的SQL函数规则重新编写分解的所述函数参数,所述第二替换单元108将重新编写后的函数参数替换所述迭代后的SQL函数中对应的第二标识符。在上述技术方案中,优选地,所述第一替换单元102采用递归算法将所述第二标识符按照从低级到高级的顺序分阶替换所述SQL函数中的小括号中的函数参数,所述第二替换单元108按照从高级到低级的顺序将处理后的所述函数参数替换所述迭代后的SQL函数中对应的第二标识符,以得到所述目标数据库执行的SQL函数。通过上述技术方案,可以实现一种SQL函数转换装置,通过迭代技术和对应的函数处理方法来实现SQL函数的转换,将SQL函数转换成目标数据库可以执行的SQL函数,并且转换后的SQL函数全面且准确,不会造成错误的结果。图2示出了根据本发明的实施例的SQL函数转换方法的流程图。如图2所示,根据本发明的实施例的SQL函数转换方法,包括步骤202,用标识符替换来自调用者的SQL函数中的参数,得到迭代后的SQL函数;步骤204,将所述标识符与所述参数对应保存为参数对照表;步骤206,根据所述迭代后的SQL函数中的标识符,从所述参数对照表提取出所述参数,对所述参数进行转换处理,将处理后的所述参数替换所述迭代后的SQL函数中对应的标识符,以得到目标数据库执行的SQL函数。在上述技术方案中,优选地,所述步骤202具体可以包括所述参数包括用户值和函数参数,用第一标识符替换所述SQL函数中的单引号中的所述用户值,用第二标识符替换所述SQL函数中的小括号中的所述函数参数,所述迭代后的SQL函数包含所述第一标识符和所述第二标识符。在上述技术方案中,优选地,所述步骤204具体可以包括将所述第一标识符与所述用户值对应保存为第一参数对照表,将所述第二标识符与所述函数参数对应保存为第二参数对照表,并在所述第二参数对照表中保存所述函数参数在所述SQL函数中的层级。在上述技术方案中,优选地,所述步骤206具体可以包括步骤2062,根据所述迭代后的SQL函数中的所述第二标识符,从所述第二参数对照表提取出所述函数参数,分解提取出的所述函数参数,按照目标数据库执行的SQL函数规则重新编写分解的所述函数参数,将重新编写后的函数参数替换所述迭代后的SQL函数中对应的第二标识符;步骤2064, 根据所述迭代后的SQL函数中的所述第一标识符和所述第一参数对照表提取出对应的用户值,将提取出的所述用户值替换所述迭代后的SQL函数中对应的所述第一标识符。在上述技术方案中,优选地,采用递归算法将所述第二标识符按照从低级到高级的顺序分阶替换所述SQL函数中的小括号中的函数参数,在得到所述目标数据库执行的 SQL函数时,按照从高级到低级的顺序将处理后的所述函数参数替换所述迭代后的SQL函数中对应的第二标识符。通过上述技术方案,可以实现一种SQL函数转换方法,通过迭代技术和对应的函数处理方法来实现SQL函数的转换,将SQL函数转换成目标数据库可以执行的SQL函数,并且转换后的SQL函数全面且准确,不会造成错误的结果。下面结合图3进一步说明根据本发明的技术方案。首先,用标识替换SQL串中的函数描述部分按取最小单位原则,通过层层迭代SQL串中的()部分(指小括号内的函数参数), 使SQL串中需要被转换的函数描述部分具备了正侧表达式描述-函数名(\s*{iW-9]*}) 的特性,例如将 convert (varchar,cast (‘ 2011-01-1209:30:01' as datetime),102) 迭代后变成 convert {§2},参数(varchar,cast (‘ 2011-01-1209:30:01, as datetime), 102)存放在参数对照表中序号为2的位置,2对应的存入值为(varchar,cast{#l},102)。 {@序号}代表函数参数,{#序号}代表用户值。然后,将需要被转换的函数描述转换成目标数据库的调用从迭代后的Sql串和参数对照表中提取函数描述,例如函数描述函数名(参数 1,参数2),提取值应该是函数名序号};根据序号提取对应参数串(参数1,参数2); 分解参数串并调用对应的转换方法对分解的参数进行转换,将转换后的结果存放到对照表中;再提取参数串中需要被转换的函数描述进入下一转换,用户值不需要转换。最后,重建SQL串把对照表中的转换值,按最大原则自顶向下逐步将转换结果还原到被迭代的SQL串,得到能被目标数据库执行的SQL串。下面参见图3对上面描述的函数转换过程进行详细描述。如图3所示,在步骤302,从调用者接收SOL语句。在步骤304,为防止用户值被误替换,对截取的SQL串中的用户值(主要是单引号中的用户值),用第一标识符替换SQL串中的用户值,替换后的用户值保存到数组QuotationMarks(第一参数对照表)中,且每个值对应一个唯一标示符,第一标识符格式为{#序号},序号对应用户值在数组中的下标。提取用户值的正侧表达式 V rv ]*V,相关算法实现描述如下Function ExtractQuotationMarks(sSql As String,Optional rowX As Long = 0)获取所有符合ν Γ\' ]*\正侧表达式规则的Unit到集合colMatches中。For Each unit In colMatches然后将Unit信息保存到二维数组QuotationMarks (χ, y)中。
NextFor each row in QuotationMarks用{#序号}替换sSql中相关元素。NextExtractQuotationMarks =替换后的 sSqlEnd Function。在步骤306,用第二标识符替换SQL串中的小括号和小括号中的值(函数参数),并将第二标识符和被替换的函数参数信息存放到数组arrN0de(第二参数对照表)中,arrNode可以理解为存放所有函数参数的二维数组,第二标识符的格式为序号};为了解决函数混合嵌套的情况,提取小括号的值必须是最小单位,正侧表达式为 \([~\(|\)]*\),并且需要记录该提取值所在层级,此处需要用递归算法分阶提取函数参数,相关算法实现描述如下Function ChangeString(sSql As String, rowX As Long)As String从sSql中提取所有满足正侧表达式\(Γ\(|\)]*\)的unit到集合colMatches 中。For Each unit In colMatches保存unit信息到二维数组arrNode (χ, y)。NextFor each row in arrNode用序号}替换sSql中相关元素。Next rowXChangeString 被替换过的 sSql, LevelIDChangeString =被替换过的 sSqlEnd Function。在步骤308,在被格式化后的SQL串和arrNode中,提取满足正侧表达式函数名称(\s*{iW-9]*})的部分,由相应转换方法(分解提取的函数参数,按照目标数据的规则重新编写分解的函数参数)生成替换串。相关算法实现描述如下Function ChangeFunctionX(SqlStringToReplace as string)提取SqlStringToR印lace中满足正侧表达式函数名(\s* {§
*})的Unit到 colMatchesFor Each Unit In colMatches提取该Unit的序号。根据Unit序号找到该函数参数。对函数参数进行分解。重新编写分解的函数参数以符合目标数据的规则。Next遍列数组 arrnode。For each row in arrnode提取arrnode (row)中满足正侧表达式函数名(\s*{@
*})的Unit到
9colMatches。For Each Unit In colMatches提取该Unit的序号。根据Unit序号找到该函数参数。对函数参数进行分解。重新编写分解的函数参数以符合目标数据的规则并将重新编写的函数参数保存到 arrnode (row)。End Function。步骤312,将生成的替换串来替换被格式化后的SQL串中对应的标识符
*}。在步骤314,完成所有函数参数的替换操作后,遍历数组QuotationMarks,还原所有用户值,即将第一参数对照表中对应的用户值替换被格式化后的SQL串中对应的标识符 {#
*}。相关算法实现描述如下Function ReBuildQuotationMarks(SqlStringToReplace as string)As Stringtmp String = m_SqlStringReplacedFor each row in QuotationMarksSqlStringReplaced = Replace ( (SqlStringToReplace, QuotationMarks(oldValue, row), QuotationMarks(m_ValueChanged, row))NextReBuildQuotationMarks = SqlStringReplacedEnd Function。在步骤310还步骤308之间还有其他的语法的替换,在此不再赘述。在步骤316,得到能被目标数据库执行的SQL串,将最终的结果返回给调用者。本发明的技术方案将来自调用者的SQL语句进行替换处理,首先用第一标识符来替代用户值,保存第一标识与对应的用户值,然后按照最小单位原则,通过迭代方法用第二标识符来替代函数参数,保存第二标识符与对应的函数参数以及函数参数所在的层级,这样就得到格式化处理的SQL语句,最后,需要将格式化处理的SQL语句转换为目标数据库可执行的语句。在转换过程中,首先按照从高级到低级(根据记录的层级)的顺序取出函数参数进行处理,而在提取函数参数时,则根据第二参数对照表获取第二标识符对应的函数参数,将处理后的函数参数放回其在格式化的SQL语句中的原位置,处理的过程为分解提取的函数参数,按照目标数据库执行的SQL函数规则重新编写分解的函数参数。然后,根据第一标识从第一参数对照表中找出对应的用户值,还原用户值。这样就得到目标数据库可执行的语句并返回调用者。以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
权利要求
1.一种SQL函数转换装置,其特征在于,包括第一替换单元,用标识符替换来自调用者的SQL函数中的参数,得到迭代后的SQL函数;数据库单元,将所述标识符与所述参数对应保存为参数对照表;处理单元,根据所述迭代后的SQL函数中的标识符,从所述参数对照表提取出所述参数,对所述参数进行转换处理;第二替换单元,将处理后的所述参数替换所述迭代后的SQL函数中对应的标识符,以得到目标数据库执行的SQL函数。
2.根据权利要求1所述的SQL函数转换装置,其特征在于,所述第一替换单元用第一标识符替换所述SQL函数中的单引号中的用户值,用第二标识符替换所述SQL函数中的小括号中的函数参数,所述迭代后的SQL函数包含所述第一标识符和所述第二标识符。
3.根据权利要求2所述的SQL函数转换装置,其特征在于,所述数据库单元将所述第一标识符与所述用户值对应保存为第一参数对照表,将所述第二标识符与所述函数参数对应保存为第二参数对照表,并在所述第二参数对照表中保存所述函数参数在所述SQL函数中的层级。
4.根据权利要求3所述的SQL函数转换装置,其特征在于,所述第二替换单元根据所述迭代后的SQL函数中的所述第一标识符和所述第一参数对照表提取出对应的用户值,将提取出的所述用户值替换所述迭代后的SQL函数中对应的所述第一标识符;所述处理单元还包括分解单元和编写单元,所述分解单元根据所述迭代后的SQL函数中的所述第二标识符,从所述第二参数对照表提取出所述函数参数,分解提取出的所述函数参数,所述编写单元按照目标数据库执行的SQL函数规则重新编写分解的所述函数参数,所述第二替换单元将重新编写后的函数参数替换所述迭代后的SQL函数中对应的第二标识符。
5.根据权利要求2至4中任一项所述的SQL函数转换装置,其特征在于,所述第一替换单元采用递归算法将所述第二标识符按照从低级到高级的顺序分阶替换所述SQL函数中的小括号中的函数参数,所述第二替换单元按照从高级到低级的顺序将处理后的所述函数参数替换所述迭代后的SQL函数中对应的第二标识符,以得到所述目标数据库执行的SQL 函数。
6.一种SQL函数转换方法,其特征在于,包括步骤202,用标识符替换来自调用者的SQL函数中的参数,得到迭代后的SQL函数;步骤204,将所述标识符与所述参数对应保存为参数对照表;步骤206,根据所述迭代后的SQL函数中的标识符,从所述参数对照表提取出所述参数,对所述参数进行转换处理,将处理后的所述参数替换所述迭代后的SQL函数中对应的标识符,以得到目标数据库执行的SQL函数。
7.根据权利要求6所述的SQL函数转换方法,其特征在于,所述步骤202具体包括所述参数包括用户值和函数参数,用第一标识符替换所述SQL函数中的单引号中的所述用户值,用第二标识符替换所述SQL函数中的小括号中的所述函数参数,所述迭代后的SQL函数包含所述第一标识符和所述第二标识符。
8.根据权利要求7所述的SQL函数转换方法,其特征在于,所述步骤204具体包括将所述第一标识符与所述用户值对应保存为第一参数对照表,将所述第二标识符与所述函数参数对应保存为第二参数对照表,并在所述第二参数对照表中保存所述函数参数在所述 SQL函数中的层级。
9.根据权利要求8所述的SQL函数转换方法,其特征在于,所述步骤206具体包括 步骤2062,根据所述迭代后的SQL函数中的所述第二标识符,从所述第二参数对照表提取出所述函数参数,分解提取出的所述函数参数,按照目标数据库执行的SQL函数规则重新编写分解的所述函数参数,将重新编写后的函数参数替换所述迭代后的SQL函数中对应的第二标识符;步骤2064,根据所述迭代后的SQL函数中的所述第一标识符和所述第一参数对照表提取出对应的用户值,将提取出的所述用户值替换所述迭代后的SQL函数中对应的所述第一标识符。
10.根据权利要求7至9中任一项所述的SQL函数转换方法,其特征在于,采用递归算法将所述第二标识符按照从低级到高级的顺序分阶替换所述SQL函数中的小括号中的函数参数,在得到所述目标数据库执行的SQL函数时,按照从高级到低级的顺序将处理后的所述函数参数替换所述迭代后的SQL函数中对应的第二标识符。
全文摘要
本发明提供了一种SQL函数转换装置,包括第一替换单元,用标识符替换来自调用者的SQL函数中的参数,得到迭代后的SQL函数;数据库单元,将所述标识符与所述参数对应保存为参数对照表;处理单元,根据所述迭代后的SQL函数中的标识符,从所述参数对照表提取出所述参数,对所述参数进行转换处理;第二替换单元,将处理后的所述参数替换所述迭代后的SQL函数中对应的标识符,以得到目标数据库执行的SQL函数。根据本发明的技术方案,可以提供全面且安全的函数替换技术。本发明还提供了一种SQL函数转换方法。
文档编号G06F17/30GK102436474SQ20111029558
公开日2012年5月2日 申请日期2011年9月29日 优先权日2011年9月29日
发明者刘新峰, 娄东生, 孙东旺 申请人:畅捷通信息技术股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1