SQL语句的转换方法、系统、设备及存储介质与流程

专利2022-05-09  99


sql语句的转换方法、系统、设备及存储介质
技术领域
1.本发明涉及数据库技术领域,尤其涉及sql语句的转换方法、系统、设备及存储介质。


背景技术:

2.近年来,随着开源数据库的广泛应用和发展,商用数据库占据主流的时代逐渐退出舞台。许多业务场景针对如何去除oracle数据库(甲骨文公司的一种商用数据库产品),更换成mysql数据库(一种开源的数据库)是一种主流的数据库变更操作。但是oracle数据库迁移至mysql等开源数据库涉及到了大量繁杂、重复的人工转化操作,在一定程度上是十分耗时耗力的。
3.oracle数据库的sql(structured query language,结构化查询语言)和mysql数据库的sql虽然都是目前数据库领域通用和常见的sql数据库语言,但是oracle数据库和mysql数据库在函数实现、语句结构上有着不小的差别,因此在oracle数据库的sql转化为mysql数据库的sql的过程中面临着许多函数转换、语句结构转换等十分复杂和棘手的难题。


技术实现要素:

4.本申请实施例通过提供一种sql语句的转换方法、系统、设备及存储介质,解决了现有技术中sql语句转换复杂的问题。
5.一种sql语句的转换方法,所述方法包括:
6.对来自于源数据库的待转换sql语句进行词法分析,获得词素流;其中,所述词素流中的词素包括所述待转换sql语句中各分词的属性信息;
7.对所述词素流进行语法分析得到sql语句的语法解析树,根据源数据库和目标数据库之间的转换规则转换所述sql语句的语法解析树;
8.根据转换后的sql语句的语法解析树生成与所述待转换sql语句对应的、且用于目标数据库的结果sql语句;其中,所述目标数据库与所述源数据库为异构的关系型数据库。
9.在其中一个实施例中,所述源数据库为oracle数据库,所述目标数据库为mysql数据库;
10.若所述源数据库还采用mybatis封装sql语句,则在对来自于源数据库的待转换sql语句进行词法分析,获得词素流的步骤之前,所述方法还包括:将采用mybatis封装的sql语句还原成oracle数据库的sql语句;
11.所述待转换sql语句来自所述还原成oracle数据库的sql语句。
12.在其中一个实施例中,所述将采用mybatis封装的sql语句还原成oracle数据库的sql语句,包括:
13.从mybatis封装的sql语句中提取出带xml标签的sql语句,并转化成为json格式;
14.从所述json格式的语句中提取出oracle数据库的sql语句。
15.在其中一个实施例中,所述将采用mybatis封装的sql语句还原成oracle数据库的sql语句的步骤中,在从所述json格式的语句中提取出oracle数据库的sql语句的步骤之后,还包括:
16.对提取出的oracle数据库的sql语句进行语法校验,筛除不符合oracle数据库的语法的sql语句。
17.在其中一个实施例中,所述对来自于源数据库的待转换sql语句进行词法分析,获得词素流,包括:
18.定义词素对象的数据结构;
19.对所述待转换sql语句进行分词;
20.对所述分词按照关键词映射字典和存储过程映射字典进行关键词匹配,获得每个分词的各项属性信息,并构成词素;
21.按照分词处理的次序获得多个词素,形成词素流。
22.在其中一个实施例中,所述对所述词素流进行语法分析得到待转换sql语句的语法解析树,根据源数据库和目标数据库之间的转换规则转换得到转换后的语法解析树,包括:
23.定义节点;所述节点用于连接其他节点并可形成层次关系,并包含词素流;
24.将词素流转换为节点,并建立节点之间的层次依赖关系;
25.根据节点之间的层次依赖关系及各节点包含的词素流构建所述待转换sql语句的语法解析树;
26.根据源数据库和目标数据库之间的转换规则,将所述待转换sql语句的语法解析树转换为结果sql语句的语法解析树。
27.在其中一个实施例中,根据转换后的sql语句的语法解析树生成与所述待转换sql语句对应的、且用于目标数据库的结果sql语句的步骤之后,还包括:将所述结果sql语句按照目标数据库的语法规则进行校验,筛除不符合语法规则的sql语句。
28.一种sql语句的转换设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的sql语句的转换程序,所述处理器执行所述sql语句的转换程序时实现上述的方法的步骤。
29.一种sql语句的转换系统,包括:
30.词法分析模块,用于对来自于源数据库的待转换sql语句进行词法分析,获得词素流;其中,所述词素流中的词素包括所述待转换sql语句中各分词的属性信息;
31.语法分析模块,用于对所述词素流进行语法分析得到待转换sql语句的语法解析树,根据源数据库和目标数据库之间的转换规则转换得到转换后的语法解析树;
32.语句生成模块,用于根据转换后的sql语句的语法解析树生成与所述待转换sql语句对应的、且用于目标数据库的结果sql语句;
33.其中,所述目标数据库与所述源数据库为异构的关系型数据库。
34.一种计算机可读存储介质,其上存储有sql语句转换的程序,该sql语句的转换程序被处理器执行时实现上述的方法。
35.上述sql语句的转换方法、系统、设备及计算机可读存储介质,通过对sql语句进行分析获得词素流,并基于词素流中词素的属性信息进行语法分析,构建出sql语句的语法解
析树,从而简化异构的关系型数据库之间的sql语句的相互转换。
附图说明
36.图1为本申请实施例方案涉及的硬件运行环境的sql语句的转换设备结构示意图;
37.图2为一实施例的sql语句的转换方法流程图;
38.图3为图2中步骤s202的其中一种实现方式的流程图;
39.图4a为图2中步骤s204的其中一种实现方式的流程图;
40.图4b为与通过sql语句形成节点的示意图;
41.图4c为语法解析树;
42.图5为一实施例的sql语句的转换系统模块图。
具体实施方式
43.本申请涉及一种sql语句的转换方法,所述方法包括以下步骤:
44.对来自于源数据库的待转换sql语句进行词法分析,获得词素流;其中,所述词素流中的词素包括所述待转换sql语句中各分词的属性信息;对所述词素流进行语法分析得到待转换sql语句的语法解析树,根据源数据库和目标数据库之间的转换规则转换得到转换后的语法解析树;根据转换后的语法解析树生成与所述待转换sql语句对应的、且用于目标数据库的结果sql语句;其中,所述目标数据库与所述源数据库为异构的关系型数据库。
45.上述方法通过对sql语句进行分析获得词素流,并基于词素流中词素的属性信息进行语法分析,构建出sql语句的语法解析树,从而简化异构的关系型数据库之间的sql语句的相互转换。
46.为了更好的理解上述技术方案,下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
47.图1是本申请实施例方案涉及的硬件运行环境的sql语句的转换设备100结构示意图。
48.本申请实施例的sql语句的转换设备,可以是例如服务器、个人计算机,智能手机、平板电脑、便携计算机等。只要其具备一定的通用数据处理能力即可。
49.如图1所示,所述sql语句的转换设备100包括:存储器104、处理器102及网络接口106。
50.处理器102在一些实施例中可以是一中央处理器(central processing unit,cpu)、控制器、微控制器、微处理器或其他数据处理芯片,用于运行存储器104中存储的程序代码或处理数据,例如执行程序等。
51.存储器104至少包括一种类型的可读存储介质,所述可读存储介质包括闪存、硬盘、多媒体卡、卡型存储器(例如,sd或dx存储器等)、磁性存储器、磁盘、光盘等。存储器104在一些实施例中可以是sql语句的转换设备100的内部存储单元,例如该sql语句的转换设备100的硬盘。存储器104在另一些实施例中也可以是sql语句的转换设备100的外部存储设备,例如该sql语句的转换设备100上配备的插接式硬盘,智能存储卡(smart media card,
smc),安全数字(secure digital,sd)卡,闪存卡(flash card)等。
52.进一步地,存储器104还可以包括sql语句的转换设备100的内部存储单元。存储器104不仅可以用于存储安装于sql语句的转换设备100的应用软件及各类数据,例如人脸识别模型训练的代码等,还可以用于暂时地存储已经输出或者将要输出的数据。
53.网络接口106可选的可以包括标准的有线接口、无线接口(如wi

fi接口),通常用于在该sql语句的转换设备100与其他电子设备之间建立通信连接。
54.网络可以为互联网、云网络、无线保真(wi

fi)网络、个人网(pan)、局域网(lan)和/或城域网(man)。网络环境中的各种设备可以被配置为根据各种有线和无线通信协议连接到通信网络。这样的有线和无线通信协议的例子可以包括但不限于以下中的至少一个:传输控制协议和互联网协议(tcp/ip)、用户数据报协议(udp)、超文本传输协议(http)、文件传输协议(ftp)、zigbee、edge、ieee 802.11、光保真(li

fi)、802.16、ieee 802.11s、ieee 802.11g、多跳通信、无线接入点(ap)、设备对设备通信、蜂窝通信协议和/或蓝牙(blue tooth)通信协议或其组合。
55.图1仅示出了具有组件102

106的sql语句的转换设备100,本领域技术人员可以理解的是,图1示出的结构并不构成对sql语句的转换设备100的限定,可以包括比图示更少或者更多的部件,或者组合某些部件,或者不同的部件布置。
56.如图2所示,为一实施例的sql语句的转换方法流程图。所述方法用于在异构的源数据库和目标数据库之间转换sql语句。异构是指不同服务商的数据库,例如oracle、mysql、sql server等。源数据库是指其sql语句要被转换的数据库,目标数据库则是要转换成的sql语句的数据库。上述方法应用于关系型数据库之间的sql语句的转换。所述方法可以包括以下步骤:
57.步骤s202:对来自于源数据库的待转换sql语句进行词法分析,获得词素流;其中,所述词素流中的词素包括所述待转换sql语句中各分词的属性信息。
58.sql语句是一串符合语法规则的词或符号的组合,例如:
59.select*from person where姓名='张三'
60.在进行转换前,需要先对sql语句进行词法分析,以获得该sql语句具体包含哪些分词。这些分词在本申请中称为词素,并定义特定的数据结构来存储该分词的各类信息。例如select、*、from、
……
等都分别可以提取为一个词素。多个词素统称为词素流。
61.步骤s204:对所述词素流进行语法分析得到待转换sql语句的语法解析树,根据源数据库和目标数据库之间的转换规则转换得到转换后的语法解析树。
62.对sql语句进行语法分析,以获得该sql语句具体对应于数据库的哪些操作。例如,上述sql语句是在数据库的person表中查询所有姓名为张三的数据。
63.在进行语法分析时,可以将词素流转换为语法解析树。该语法解析树给出了词素之间的联系,体现出对数据库的具体操作。在语法解析树层面,基于不同数据库之间的差异,按照对应的规则对词素及联系进行对应的转换,即可获得目标数据库的sql语法解析树。
64.步骤s206:根据转换后的sql语句的语法解析树生成与所述待转换sql语句对应的、且用于目标数据库的结果sql语句。
65.结果sql语句将符合目标数据库的操作规则,可以适用于对目标数据库进行操作。
可以理解,sql语句在转换前后可能是完全一样的,因为大部分关系型数据库本质上还是基于sql语言。
66.上述方法通过对sql语句进行分析获得词素流,并基于词素流中词素的属性信息进行语法分析,构建出sql语法解析树,从而简化异构的关系型数据库之间的sql语句的相互转换。
67.在一个实施例中,所述源数据库为oracle数据库,所述目标数据库为mysql数据库。若所述源数据库还采用mybatis封装sql语句,则所述方法还包括:将采用mybatis封装的sql语句还原成oracle数据库的sql语句;则所述待转换sql语句来自所述还原成oracle数据库的sql语句。
68.mybatis是一款优秀的持久层框架,它支持自定义sql、存储过程以及高级映射。mybatis免除了几乎所有的jdbc代码以及设置参数和获取结果集的工作。因此,oracle数据库大多使用了mybatis进行封装。
69.mybatis使用xml映射语句。例如select标签映射查询语句:
70.<select id="selectperson"parametertype="int"resulttype="hashmap">
71.select*from person where id=#{id}
72.</select>
73.这个语句被称作selectperson,接受一个int(或integer)类型的参数,并返回一个hashmap类型的对象,其中的键是列名,值便是结果行中的对应值。
74.xml语句中,每个xml对象以尖括号对<></>标记,括号中的名称为对象的名称(例如select),尖括号对之间为对象的内容,在前面的尖括号中,还可以设置对象的属性(例如id/parametertype/resulttype等)。
75.这与一般的sql查询语句不同,例如“select*from person where姓名=’张三
’”
,要先使用查询语句从数据库中取出数据,再存入对象实例中。因此,在进行异构的关系型数据库之间的转换时,需要对xml语句进行转换,得到纯正的sql语句。
76.在一个实施例中,针对oracle数据库使用mybatis封装sql语句的情况。转换大致包括:构建xml解析器,针对mybatis中带有xml标签的oracle数据库的sql语句转化成为易于读取的json格式的数据;再构建sql生成器,从json格式的数据中提取出sql语句;最后构建oracle语法校验器,针对oracle数据库的sql语句进行语法校验,过滤掉不符合oracle数据库的语法的sql语句。
77.具体地,可以包括:
78.步骤s208:从mybatis封装的sql语句中提取出带xml标签的sql语句,并转化成为json格式。
79.递归定义xml

sql解析树,根据数据属性遍历整棵树,遍历的方式是深度优先遍历,通过递归的方式获取子标签和内容。然后将oracle数据库的sql语句转化成为易于读取的json格式。
80.例如:
81.<select id="selectperson"parametertype="int"resulttype="hashmap">
82.select*from person where id=#{id}
83.</select>
84.转换为:
85.{select:select*from person where id=id}
86.步骤s210:从所述json格式的语句中提取出oracle数据库的sql语句。
87.例如:从{select:select*from person where id=id}中提取的sql语句为:select*from person where id=id。
88.步骤s212:对提取出的oracle数据库的sql语句进行语法校验,筛除不符合oracle数据库的语法的sql语句。
89.从xml

sql解析树获得的结果是按照递归解析并组装的,不一定完全满足oracle数据库的语法要求,对不符合要求的要筛除。
90.上述方法,采用json格式作为中间存储结构,易于转换、存储和读取。可以理解,对于未采用mybatis封装sql语句的数据库,上述步骤s208~212不执行。需要说明的是,步骤的数字大小不代表执行顺序的先后。对于采用mybatis封装sql语句的oracle数据库,上述步骤s208~212在步骤s202之前执行。
91.在其中一个实施例中,所述步骤s202:对来自于源数据库的待转换sql语句进行词法分析,获得词素流,如图3所示可以包括:
92.步骤s302:定义词素对象的数据结构。
93.词素对象即sql语句中的各个要素的统称,例如select*from person where姓名='张三'中,包括关键字“select”、“from”、“where”,符号“*”、“=”,以及参数“person”、“'张三'”。这些要素均采用词素对象进行存储。
94.本实施例中定义词素对象的数据结构如下:
95.token('type','value','lineno','index','xml_list','data_type')。通过token将词素的词类型、值、位置信息、索引信息、xml标签信息以及参数数据类型存储起来。
96.在此之前,需要定义type、value等基础类型,方便词素对象使用这些基础类型。根据oracle数据库的特性,给sql语句标注value、type等基础类型,在此基础上,再定义函数和语句结构,例如通过python的装饰器功能,通过自定义python函数实现oracle数据库的sql语句中的函数和语句结构;目前支持oracle大部分的函数和语法。完成数据预处理操作。
97.此外,还需要自定义字符映射表。将oracle关键字保存在关键词映射字典common_keywords中,将存储过程关键词保存在映射字典stored_procedure_keywords中,最终的字符映射表keywords由这两部分组成。字典是一种数据结构,其每项数据包括key和value,key为唯一值,用于在字典中索引,value则是与key对应对象。key一般可以用有意义的字符串表示,value则可以是字符串,也可以是复杂对象。
98.步骤s304:对所述待转换sql语句进行分词。
99.构建词法转换处理器lexer,其生成的文件被称作分词器tokenizer,它是一个实现sql语句分词处理的函数。分词器输入为一串上下文无关的字符流,其从左至右逐个解析字符,即对字符采用正则匹配的方法得到字符流。可通过正则匹配的方式,从sql语句中分离出关键词及符号。
100.步骤s306:对所述分词按照关键词映射字典和存储过程映射字典进行关键词匹配,获得每个分词的各项属性信息,并构成词素。
101.采用上述的关键词映射字典common_keywords以及存储过程映射字典stored_procedure_keywords对关键词进行类别归属操作。根据词的类别归属,获得每个分词的各项属性信息。每个词素都有对应的词类型(type)和值(value),通过上述字典可以匹配查询获得。对于sql语句的mybatis标签来源,使用xml_list属性进行保存;非sql的保留关键字,例如查询参数的值的类型也采用data_type属性保存。经过上述处理,即可构成一个完整的词法单元token。其中,xml_list属性和data_type属性解决了sql语句带标签的问题和函数传参导致的转换二义性问题。
102.步骤s308:按照分词处理的次序获得多个词素,形成词素流。
103.通过tokenizer把字符流按照单词和操作符序列化成为词素流tokens。使用移进/规约的规则来对字符流进行操作,最终结果形成词素流,使得无意义的字符流转换成为了有意义的词素流tokens。
104.对于sql语句:select*from person where age>18,本步骤处理后的数据可以表现为例如:
105.token(type='select',value='select',lineno=2,index=3,xml_list=[],data_type=none);
[0106]
token(type='times',value='*',lineno=2,index=10,xml_list=[]);
[0107]
token(type='from',value='from',lineno=2,index=12,xml_list=[],data_type=none);
[0108]
token(type='name',value='person',lineno=2,index=17,xml_list=[],data_type=none);
[0109]
token(type='where',value='where',lineno=2,index=24,xml_list=[],data_type=none);
[0110]
token(type='name',value='age',lineno=2,index=30,xml_list=[],data_type=none);
[0111]
token(type='>',value='>',lineno=2,index=33,xml_list=[]);
[0112]
token(type='number_integer',value='18',lineno=2,index=34,xml_list=[],data_type=number)。
[0113]
在其中一个实施例中,所述步骤s204:对所述词素流进行语法分析得到待转换sql语句的语法解析树,根据源数据库和目标数据库之间的转换规则转换得到转换后的语法解析树,如图4a所示可以包括:
[0114]
步骤s402:定义节点;所述节点用于连接其他节点并可形成层次关系,并包含词素流。
[0115]
例如可以添加一个节点类,其包含父节点、自身属性以及词素流。
[0116][0117]
如图4b所示,每个节点可以由其他节点构成,例如node(1),也可以由词素流构成例如node(2),节点之间形成层次关系,包含其他节点的节点层次更高。
[0118]
步骤s404:将词素流转换为节点、并建立节点之间的层次依赖关系。
[0119]
节点的层次与sql语句的层次相对应。如图4b所示,该sql语句包括三个层次,第一层为select查询语句,其从表crs_input_templ_resulta和由第二层的select子查询返回的表(这里可以称为表a)中联合查询。
[0120]
第二层是select子查询,其从表crs_bu_level和由第三层select子查询返回的表(这里可以称为表b)中联合查询。第三层的select子查询还包括left join的select子查询。
[0121]
第一层中的词素包括token(type='select',value='select')(其他属性省略表示)、token(type='*',value='*')、token(type='from',value='from'),作为节点node(2)以及表crs_inr_templ_resulta和表a对应的token流作为节点node(3),其中的词素包括token(type='name',value='crs_input_templ_resulta')以及由第二层select子查询所对应的词素流构成。
[0122]
之后的词素流构成节点的方式以此类推,不再赘述。
[0123]
步骤s406:根据节点之间的层次依赖关系及各节点包含的词素流构建所述待转换sql语句的语法解析树。
[0124]
每层获取得到的token词素流和node节点,结合oracle语法规则,根据上下文信息构建lalr(1)状态机和分析栈,使用分析栈来保存文法符号,并用一个缓冲区来存放将要进行语法分析的其余符号。首先将输入的token词素流和node节点采用移进和归约的方式得到sql语法解析树;其次在解析表达式的时候,状态机的状态和当前输入的token决定状态机何时采取移进操作和归约操作,移进操作将token(包含着终结符号和非终结符号)读取到分析栈中,当分析栈的栈顶的n个符号匹配某条规则的右端时,则该规则被左端的句柄代替;最后按照这个规律,逐条预读每个词素,就可以确定采取的是移进还是归约操作了,当状态机接受了全部输入时,就宣布语法分析过程成功完成。此外,可以增加一个错误处理模块,在发现语法错误的时候调用其中一个错误进行恢复操作。
[0125]
如下所示,当输入例句为:
[0126]
select user_name from user where user_age>=27;
[0127]
语法解析器的每一步的操作处理步骤,内容分别是:存储sql字符的符号栈、字符的词素tokens以及parser的移进/规约(shift/reduce)操作:
[0128][0129][0130]
得到的语法解析树如图4c所示。
[0131]
步骤s408:根据源数据库和目标数据库之间的转换规则,将所述待转换sql语句的语法解析树转换为结果sql语句的语法解析树。
[0132]
如图4c所示,采用深度优先遍历的遍历方式递归遍历整棵sql语法解析树,即可得到对应的oracle数据库的sql语句。
[0133]
根据oracle语法转换mysql的转换规则得到语法解析树,即可根据该语法解析树还原出完整的符合mysql语法的sql语句。如下表所示,是oracle转mysql的例句,分别在函数和参数层面上完成了语法解析和语句转换。
[0134]
oracle的sql语句:
[0135]
to_date('2011

09

20 08:30:45','yyyy

mm

dd hh24:mi:ss')from dual;
[0136]
对应的mysql的sql语句:
[0137]
date_format('2011

09

20 08:30:45','%y

%m

%d%h:%i:%s');
[0138]
进一步地,将所述结果sql语句按照目标数据库的语法规则进行校验,筛除不符合语法规则的sql语句。
[0139]
首先构建mysql语法校验器,并检验出无效的mysql数据库的sql语句进行过滤,留下语法无误的mysql数据库的sql语句;然后构建xml生成器和json生成器,最后得到的
mysql数据库的sql语句生成mysql xml数据。
[0140]
将得到的mysql数据库的sql语句进行语法校验,过滤掉语法不规范、不合格的sql语句。将得到的规范的、合格的mysql数据库的sql语句写入json格式,得到结构化的sql语句。
[0141]
将得到的结构化的json格式的sql语句,进行xml标签化处理,得到的json序列化的sql代码,构建xml生成树,逐层将sql语句建立层级关系,然后通过先序遍历的方式遍历整棵树,将json中上下文无关的sql语句组装成符合xml结构化的逻辑完善、无语法错误的mysql数据库的sql语句。即对符合语法规则的结果sql语句进行封装。
[0142]
本申请的方法能够在不影响业务场景正常运行的情况下,把金融场景数据库的oracle数据转换成mysql数据,能够有助于数据库迁移的人力资源和机器资源的释放,实现o2m(oracle to mysql,oracle到mysql)的自动化。在ide(integrated development environment,集成式开发环境)插件中实现o2m工具后,实现了在mybatis中带xml标签的sql语句去除标签后,从json格式中提取出对应的sql语句,然后对sql语句进行解析,最终得到想要的mysql数据。
[0143]
如图5所示,还提供一种sql语句的转换系统。该系统500可以包括:
[0144]
词法分析模块502,用于对来自于源数据库的待转换sql语句进行词法分析,获得词素流;其中,所述词素流中的词素包括所述待转换sql语句中各分词的属性信息;
[0145]
语法分析模块504,用于对所述词素流进行语法分析得到待转换sql语句的语法解析树,根据源数据库和目标数据库之间的转换规则转换得到转换后的语法解析树;
[0146]
语句生成模块506,用于根据转换后的sql语句的语法解析树生成与所述待转换sql语句对应的、且用于目标数据库的结果sql语句。
[0147]
进一步地,所述源数据库为oracle数据库,所述目标数据库为mysql数据库;若所述源数据库还采用mybatis封装sql语句,则所述系统500还包括:sql语句还原模块508,用于将采用mybatis封装的sql语句还原成oracle数据库的sql语句。所述待转换sql语句来自所述还原成oracle数据库的sql语句。
[0148]
所述sql语句还原模块508具体用于:
[0149]
从mybatis封装的sql语句中提取出带xml标签的sql语句,并转化成为json格式;
[0150]
从所述json格式的语句中提取出oracle数据库的sql语句。
[0151]
所述sql语句还原模块510具体还用于:
[0152]
对提取出的oracle数据库的sql语句进行语法校验,筛除不符合oracle数据库的语法的sql语句。
[0153]
所述词法分析模块502具体用于:
[0154]
定义词素对象的数据结构;
[0155]
对所述待转换sql语句进行分词;
[0156]
对所述分词按照关键词映射字典和存储过程映射字典进行关键词匹配,获得每个分词的各项属性信息,并构成词素;
[0157]
按照分词处理的次序获得多个词素,形成词素流。
[0158]
所述语法分析模块504具体用于:
[0159]
定义节点;所述节点用于连接其他节点并可形成层次关系,并包含词素流;
[0160]
将词素流转换为节点、并建立节点之间的层次依赖关系;
[0161]
根据节点之间的层次依赖关系及各节点包含的词素流构建所述待转换sql语句的语法解析树;
[0162]
根据源数据库和目标数据库之间的转换规则,将所述待转换sql语句的语法解析树转换为结果sql语句的语法解析树。
[0163]
所述系统500还包括筛除模块510,用于将所述结果sql语句按照目标数据库的语法规则进行校验,筛除不符合语法规则的sql语句。
[0164]
所述系统500还包括封装模块512,用于对符合语法规则的结果sql语句进行封装。
[0165]
上述系统500为与方法一一对应的模块,模块的具体功能的实现方式已在方法实施例中具体阐述,此处不再赘述。应当理解,方法实施例的具体内容可以引入系统500以对系统实施例进行支持。
[0166]
此外,本申请实施例还提出一种sql语句的转换设备,其包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的sql语句的转换程序,所述处理器执行所述sql语句的转换程序时实现如上所述的sql语句转换的方法的步骤。
[0167]
此外,本申请实施例还提出一种计算机可读存储介质,所述计算机可读存储介质上存储有上述sql语句转换的程序,所述sql语句转换的程序被处理器执行时实现如上所述的sql语句转换的方法的步骤。
[0168]
本申请计算机可读存储介质具体实施方式与上述sql语句转换的方法各实施例基本相同,在此不再赘述。
[0169]
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd

rom、光学存储器等)上实施的计算机程序产品的形式。
[0170]
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0171]
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0172]
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0173]
应当注意的是,在权利要求中,不应将位于括号之间的任何参考符号构造成对权
利要求的限制。单词“包含”不排除存在未列在权利要求中的部件或步骤。位于部件之前的单词“一”或“一个”不排除存在多个这样的部件。本发明可以借助于包括有若干不同部件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
[0174]
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
[0175]
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

技术特征:
1.一种sql语句的转换方法,其特征在于,所述方法包括:对来自于源数据库的待转换sql语句进行词法分析,获得词素流;其中,所述词素流中的词素包括所述待转换sql语句中各分词的属性信息;对所述词素流进行语法分析得到待转换sql语句的语法解析树,根据源数据库和目标数据库之间的转换规则转换得到转换后的语法解析树;根据转换后的语法解析树生成与所述待转换sql语句对应的、且用于目标数据库的结果sql语句;其中,所述目标数据库与所述源数据库为异构的关系型数据库。2.根据权利要求1所述方法,其特征在于,所述源数据库为oracle数据库,所述目标数据库为mysql数据库;若所述源数据库还采用mybatis封装sql语句,则在对来自于源数据库的待转换sql语句进行词法分析,获得词素流的步骤之前,所述方法还包括:将采用mybatis封装的sql语句还原成oracle数据库的sql语句;所述待转换sql语句来自所述还原成oracle数据库的sql语句。3.根据权利要求2所述方法,其特征在于,所述将采用mybatis封装的sql语句还原成oracle数据库的sql语句,包括:从mybatis封装的sql语句中提取出带xml标签的sql语句,并转化成为json格式;从所述json格式的语句中提取出oracle数据库的sql语句。4.根据权利要求3所述方法,其特征在于,所述将采用mybatis封装的sql语句还原成oracle数据库的sql语句的步骤中,在从所述json格式的语句中提取出oracle数据库的sql语句的步骤之后,还包括:对提取出的oracle数据库的sql语句进行语法校验,筛除不符合oracle数据库的语法的sql语句。5.根据权利要求2所述方法,其特征在于,所述对来自于源数据库的待转换sql语句进行词法分析,获得词素流,包括:定义词素对象的数据结构;对所述待转换sql语句进行分词;对所述分词按照关键词映射字典和存储过程映射字典进行关键词匹配,获得每个分词的各项属性信息,并构成词素;按照分词处理的次序获得多个词素,形成词素流。6.根据权利要求1所述方法,其特征在于,所述对所述词素流进行语法分析得到待转换sql语句的语法解析树,根据源数据库和目标数据库之间的转换规则转换得到转换后的语法解析树,包括:定义节点;所述节点用于连接其他节点并可形成层次关系,并包含词素流;将词素流转换为节点,并建立节点之间的层次依赖关系;根据节点之间的层次依赖关系及各节点包含的词素流构建所述待转换sql语句的语法解析树;根据源数据库和目标数据库之间的转换规则,将所述待转换sql语句的语法解析树转换为结果sql语句的语法解析树。7.根据权利要求1所述方法,其特征在于,根据转换后的sql语句的语法解析树生成与
所述待转换sql语句对应的、且用于目标数据库的结果sql语句的步骤之后,还包括:将所述结果sql语句按照目标数据库的语法规则进行校验,筛除不符合语法规则的sql语句。8.一种sql语句的转换设备,其特征在于,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的sql语句的转换程序,所述处理器执行所述sql语句的转换程序时实现权利要求1

7任一所述的方法的步骤。9.一种sql语句的转换系统,其特征在于,包括:词法分析模块,用于对来自于源数据库的待转换sql语句进行词法分析,获得词素流;其中,所述词素流中的词素包括所述待转换sql语句中各分词的属性信息;语法分析模块,用于对所述词素流进行语法分析得到待转换sql语句的语法解析树,根据源数据库和目标数据库之间的转换规则转换得到转换后的语法解析树;语句生成模块,根据转换后的sql语句的语法解析树生成与所述待转换sql语句对应的、且用于目标数据库的结果sql语句;其中,所述目标数据库与所述源数据库为异构的关系型数据库。10.一种计算机可读存储介质,其特征在于,其上存储有sql语句转换的程序,其特征在于,该sql语句的转换程序被处理器执行时实现权利要求1

7任一所述的方法。
技术总结
本发明公开了一种SQL语句的转换方法、系统、设备及存储介质。所述方法包括以下步骤:对来自于源数据库的待转换SQL语句进行词法分析,获得词素流;其中,所述词素流中的词素包括所述待转换SQL语句中各分词的属性信息;对所述词素流进行语法分析得到待转换SQL语句的语法解析树,根据源数据库和目标数据库之间的转换规则转换得到转换后的语法解析树;根据转换后的语法解析树生成与所述待转换SQL语句对应的、且用于目标数据库的结果SQL语句;其中,所述目标数据库与所述源数据库为异构的关系型数据库。上述方法、系统、存储介质可以简化异构的关系型数据库之间的SQL语句的相互转换。的关系型数据库之间的SQL语句的相互转换。的关系型数据库之间的SQL语句的相互转换。


技术研发人员:王英杰 尹秀
受保护的技术使用者:未鲲(上海)科技服务有限公司
技术研发日:2021.03.25
技术公布日:2021/6/29

转载请注明原文地址:https://doc.8miu.com/read-1921.html

最新回复(0)