CN111382170B - 一种语句自动转换方法和装置 - Google Patents
一种语句自动转换方法和装置 Download PDFInfo
- Publication number
- CN111382170B CN111382170B CN201811633920.1A CN201811633920A CN111382170B CN 111382170 B CN111382170 B CN 111382170B CN 201811633920 A CN201811633920 A CN 201811633920A CN 111382170 B CN111382170 B CN 111382170B
- Authority
- CN
- China
- Prior art keywords
- statement
- insert
- update
- operation target
- module
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000006243 chemical reaction Methods 0.000 title claims abstract description 49
- 238000000034 method Methods 0.000 title claims abstract description 49
- 238000007781 pre-processing Methods 0.000 claims abstract description 23
- 230000014509 gene expression Effects 0.000 claims description 66
- 238000012545 processing Methods 0.000 claims description 35
- 238000004458 analytical method Methods 0.000 claims description 14
- 238000003780 insertion Methods 0.000 claims description 6
- 230000037431 insertion Effects 0.000 claims description 6
- 238000012986 modification Methods 0.000 claims description 5
- 230000004048 modification Effects 0.000 claims description 5
- 238000005516 engineering process Methods 0.000 description 6
- 238000013508 migration Methods 0.000 description 3
- 230000005012 migration Effects 0.000 description 3
- 238000010586 diagram Methods 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000010276 construction Methods 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 238000013507 mapping Methods 0.000 description 1
- 230000000750 progressive effect Effects 0.000 description 1
- 230000009897 systematic effect Effects 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
- 230000007704 transition Effects 0.000 description 1
Images
Classifications
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
一种语句自动转换方法,将原始SQL语句切分为语句序列,包括:预处理步骤,顺序解析并获取所述INSERT语句和所述UPDATE语句的语义数值,将解析的结果分别存储于预设存储结构中;获取简单型UPDATE语句的操作目标、条件和赋值信息,将所述UPDATE语句的条件和赋值信息填入与所述UPDATE语句具有相同操作目标的所述INSERT语句的合并存储位置;转换步骤,对经过所述预处理步骤的所述语句序列依次进行转换并输出;直接输出CREATE语句和合并存储位置中内容为空的INSERT语句;更新输出合并存储位置中的INSERT语句;输出经过转换后的复杂型UPDATE语句。本发明还公开一种语句自动转换装置。通过本发明实现UPDATE语句自动转换为INSERT语句。
Description
技术领域
本发明涉及软件行业,更具体的说,涉及一种语句转换技术。
背景技术
随着网络规模的不断扩大,数据增长迅速,传统的基于关系数据库的数据处理手段已经越来越力不从心。而最经济和平滑的向大数据技术过度的手段,就是能直接复用原来的数据处理过程中写好的一系列SQL语句,这样可以保证对原来的业务逻辑保持不变,只是改变了底层的执行引擎。
在移植过程中最大的问题就是,目前面向大数据处理的数据库或计算框架(如Greenplum和Spark)都是面向分析型的,对于原来的处理逻辑过程中的更新操作支持非常弱或不支持,这就需要提供一个自动化的转换工具,自动把原来大批量SQL语句序列中的update语句,自动转换为等价的非update语句。
在新旧SQL的移植方面,涉及传统关系数据库之间的SQL移植和关系数据库 SQL向大数据SQL移植两个方面,而前者与本专利的场景无关,下面我只讨论后者。即原有面向关系数据库的SQL序列移植为适合运行在大数据的数据库或大数据计算框架下运行的SQL序列。
一般情况下会采取两种方法进行SQL序列的转换。
a)将原有SQL直接用于大数据跨框架。
b)按照大数据的特点和要求手工移植原有SQL序列。
对于上述方案a),由于目前面向大数据处理的数据库或计算框架(如 GreenPlum和Spark)都是面向分析型的,对于原来的处理逻辑过程中的更新操作支持非常弱或不支持,如果现有SQL序列中存在update语句,则会导致效率非常低或直接不支持。
上述方案b)为手工移植方案,存在移植工作量大(一个SQL都有几百个字段),并且容易导致逻辑错误,在新旧系统的数据核查比对方面的工作量是非常巨大的。
因此,一种简便的自动实现语句转换的技术亟待出现。
发明内容
本发明根据UPDATE语句和INSERT语句的结构和语义,对不同类型的 UPDATE语句采用了不同的转换方法,达到最优转换的目的。本发明提供了如下技术方案一种语句自动转换的方法,包括:将原始SQL语句切分为语句序列,在所述语句序列中获取与所述原始语句操作目标相应的INSERT语句、UPDATE 语句、CREATE语句,然后进入预处理步骤:
顺序解析并获取所述INSERT语句和所述UPDATE语句的语义数值,按照类型、操作目标将解析的结果分别存储于预设存储结构中;
获取简单型UPDATE语句的操作目标、条件和赋值信息,在所述预设存储结构中,将所述UPDATE语句的条件和赋值信息填入与所述UPDATE语句具有相同操作目标的所述INSERT语句的合并存储位置;
转换步骤:
对经过所述预处理步骤的所述语句序列依次进行转换并输出;
直接输出CREATE语句和合并存储位置中内容为空的INSERT语句;
获取所述INSERT语句相应合并存储位置中的目标、条件和赋值信息,将所述获取的目标、条件和赋值信息合并入所述INSERT语句的赋值部分,并输出修改后的INSERT语句;
解析所述复杂型UPDATE语句的子句,根据所述复杂型UPDATE语句的操作目标生成新CREATE语句,根据所述复杂型UPDATE语句的条件和赋值信息对所述新CREATE语句生成新INSERT语句,根据所述新INSERT 语句和所述复杂型UPDATE语句输出最终INSERT语句。
优选的:
解析INSERT语句的类型、操作目标、数值、表达式等语义数值,按照双层关键字-值的预设存储结构进行存储。
详细的,所述获取简单型UPDATE语句的操作目标、条件和赋值信息,在所述预设存储结构中,将所述UPDATE语句的条件和赋值信息填入与所述 UPDATE语句具有相同操作目标的所述INSERT语句的合并存储位置的方法具体为:
获取所述简单型UPDATE语句的操作目标、条件表达式和赋值信息;
根据所述简单型UPDATE语句的操作目标,在所述预设存储结构中查找相同操作目标的INSERT语句,获取该INSERT语句的存储信息;
根据所述INSERT语句的存储信息,将所述简单型UPDATE语句的条件表达式和赋值信息按照INSERT语句的存储结构合并存入所述INSERT语句的合并存储位置。
更详细的,获取所述INSERT语句相应合并存储位置中的目标、条件和赋值信息,将所述获取的目标、条件和赋值信息合并入所述INSERT语句的赋值部分,并输出修改后的INSERT语句的方法具体为:
在所述合并存储位置中获得语句序列中所述INSERT语句的操作目标列表;
获得所述合并存储位置中与所述操作目标列表相应的条件表达式和赋值表达式对列表;
将操作目标列表的条件表达式和赋值表达式对作为所述语句序列中 INSERT语句对当前操作目标的赋值部分;
输出修改后的INSERT语句。
进一步的,所述解析所述复杂型UPDATE语句的子句,根据所述复杂型 UPDATE语句的操作目标生成新CREATE语句,根据所述复杂型UPDATE 语句的条件和赋值信息对所述新CREATE语句生成新INSERT语句,根据所述新INSERT语句和所述复杂型UPDATE语句输出最终INSERT语句的方法具体为:
解析所述复杂型UPDATE语句的子句,获取所述复杂型UPDATE语句的操作目标;
生成新CREATE语句,所述新CREATE语句的创建目标为所述复杂型UPDATE语句操作目标的对应临时操作目标;
生成新INSERT语句,所述新INSERT语句的插入条件和赋值信息为所述复杂型UPDATE语句的条件和赋值信息,所述新INSERT语句的操作目标为所述新CREATE语句的创建目标;
根据所述复杂型UPDATE语句、所述新CREATE语句和所述新INSERT 语句组合成最终INSERT语句。
具体的:
所述简单型UPDATE语句为不包含子查询的更新语句;所述复杂型 UPDATE语句为包含子查询的更新语句。
本发明还公开一种语句自动转换装置,包含预处理单元和转换单元,
所述预处理单元包括:
解析存储模块,用于顺序解析并获取所述INSERT语句和所述UPDATE 语句的语义数值,按照类型、操作目标将解析的结果分别存储于预设存储结构中;
合并处理模块,用于获取简单型UPDATE语句的操作目标、条件和赋值信息,在所述预设存储结构中,将所述UPDATE语句的条件和赋值信息填入与所述UPDATE语句具有相同操作目标的所述INSERT语句的合并存储位置;
所述转换单元包含:
顺序处理模块,用于对经过所述预处理步骤的所述语句序列依次进行转换并输出;以及,直接输出CREATE语句和合并存储位置中内容为空的 INSERT语句;
合并INSERT语句处理模块,用于获取所述INSERT语句相应合并存储位置中的目标、条件和赋值信息,将所述获取的目标、条件和赋值信息合并入所述INSERT语句的赋值部分,并输出修改后的INSERT语句;
UPDATE语句处理模块,解析所述复杂型UPDATE语句的子句,根据所述复杂型UPDATE语句的操作目标生成新CREATE语句,根据所述复杂型UPDATE语句的条件和赋值信息对所述新CREATE语句生成新INSERT 语句,根据所述新INSERT语句和所述复杂型UPDATE语句输出最终INSERT 语句。
具体的,所述解析存储模块进一步包含:
INSERT语句解析子模块,用于解析所述INSERT语句的类型、操作目标、数值、表达式等语义数值;
存储子模块,用于按照双层关键字-值的预设存储结构对解析子模块解析的INSERT语句的类型、操作目标、数值、表达式等语义数值进行存储。
更具体的,所述合并处理模块进一步包含:
UPDATE语句解析子模块,用于解析获取所述简单型UPDATE语句子句的操作目标、条件表达式和赋值信息;
相关语句存储信息获取子模块,用于根据所述UPDATE语句解析子模块获取的简单型UPDATE语句的操作目标,在所述存储子模块的预设存储结构中查找相同操作目标的INSERT语句,获取该INSERT语句的存储信息;
合并子模块,用于根据所述相关语句存储信息获取子模块获取的INSERT 语句的存储信息,将所述UPDATE语句解析子模块获取的简单型UPDATE 语句的条件表达式和赋值信息按照INSERT语句的存储结构合并存入所述 INSERT语句的合并存储位置。
更详细的,所述合并INSERT语句处理模块进一步包含:
操作目标列表获取子模块,用于在所述合并子模块存入的合并存储位置中获得语句序列中所述INSERT语句的操作目标列表;
表达式对列表获取子模块,用于获得所述合并存储位置中与所述操作目标列表相应的条件表达式和赋值表达式对列表;
赋值修改子模块,用于将所述表达式对列表获取子模块获取的操作目标列表的条件表达式和赋值表达式对作为所述语句序列中INSERT语句对当前操作目标的赋值部分;
进一步的,所述UPDATE语句处理模块的进一步包含:
操作目标获取子模块,用于解析所述复杂型UPDATE语句的子句,获取所述复杂型UPDATE语句的操作目标;
CREATE语句生成子模块,用于生成新CREATE语句,所述新CREATE 语句的创建目标为所述操作目标获取子模块获取的所述复杂型UPDATE语句操作目标的对应临时操作目标;
INSERT语句生成子模块,用于生成新INSERT语句,所述新INSERT 语句的插入条件和赋值信息为所述复杂型UPDATE语句的条件和赋值信息,所述新INSERT语句的操作目标为所述CREATE语句生成子模块生成的所述新CREATE语句的创建目标;
语句组合模块,用于根据所述复杂型UPDATE语句、所述新CREATE 语句和所述新INSERT语句组合成最终INSERT语句。
优选的,所述装置还包括:
输出单元,用于给单元模块提供输出接口,输出经过所述顺序模块处理的CREATE语句和合并存储位置中内容为空的INSERT语句、输出经过所述合并INSERT语句处理模块修改后的INSERT语句、输出经过UPDATE语句处理模块处理的最终INSERT语句。
经由上述的技术方案可知,本发明实施例公开的一种语句自动转换方法,将UPDATE语句分成简单型和复杂型两种类型,对于简单型的没有子查询的 UPDATE语句,将其与操作相同表明的INSERT语句合并为一个;对于复杂型含有子查询方式的UPDATE语句,自动转换为等价的INSERT语句,通过创建CREATE语句作为中间媒介,实现等价转换;本发明从原始SQL序列向目标SQL序列实现整体的映射算法,可以提高效率降低错误率,基于转换后的全是INSERT语句的SQL语句,非常有利于大数据技术的快速推广。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例一提供的一种语句自动转换的方法流程示意;
图2-1为本申请实施例二提供的方法流程图;
图2-2为本申请实施例二提供的方法流程图
图3为本申请实施例三提供的方法流程图;
图4-1为本申请实施例四提供的预处理部分方法流程图;
图4-2为本申请实施例四提供的转换部分方法流程图;
图5为本申请实施例五提供的一种语句自动转换的装置结构示意图;
图6为本申请实施例六提供的装置结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有付出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参阅图1,给出本发明的实施例一,一种语句自动转换方法。
步骤S00:将原始SQL语句切分为语句序列,在所述语句序列中获取与所述原始语句操作目标相应的INSERT语句、UPDATE语句、CREATE语句。
步骤S01:预处理步骤。
步骤S011:顺序解析并获取所述INSERT语句和所述UPDATE语句的语义数值,按照类型、操作目标将解析的结果分别存储于预设存储结构中。
解析INSERT语句的类型、操作目标、数值、表达式等语义数值,按照双层关键字-值的预设存储结构进行存储。
Update语句的类型一般包含简单型和复杂型,所述简单型UPDATE语句为不包含子查询的更新语句;所述复杂型UPDATE语句为包含子查询的更新语句。
操作目标可以是表,insert语句的操作目标,即对哪个表进行插入操作; update语句的操作目标,即是对哪个表的更新操作;CREATE语句的操作目标即是创建这个名称的表。数值和表达式等,都是具体操作的内容,插入的字段和值、更新的字段和值、创建的字段和值等等。
双层关键字-值的预设存储结构可以是:
Map<String,Map<String,String>>
针对insert类型的SQL语句,每个语句存储一个Map,key对应的是字段名,数值还是个Map,该Map的Key为条件表达式,value为字段值的表达式。
采用这种方式进行存储可以提高数据传输和数据读取的效率。
步骤S012:获取简单型UPDATE语句的操作目标、条件和赋值信息,在所述预设存储结构中,将所述UPDATE语句的条件和赋值信息填入与所述 UPDATE语句具有相同操作目标的所述INSERT语句的合并存储位置。
如果update语句和insert语句具有相同的操作目标,则说明它们对相同的表进行更新和插入,因此将update更新的内容都存储到insert语句的存储位置,需要说明的是为了区分哪些是insert语句原有的信息和update语句合并过来的信息,将存储区域可以做相应的划分,即通过合并存储位置存储那些从update语句得来的内容。
由此可见,预处理步骤主要是对简单型update语句的预先处理,将其内容合并存储到相应的insert语句存储位置中,为后续的语句转换做准备工作。
步骤S02:转换步骤。
步骤S021:对经过所述预处理步骤的所述语句序列依次进行转换并输出。
经过预处理步骤后的语句序列包括insert语句、复杂型update语句和 CREATE语句。
对这些语句的存储也有了相应的变化,其变化主要在于简单型update语句的内容已经合并入相应的insert语句的合并存储位置了。
步骤S022:直接输出CREATE语句和合并存储位置中内容为空的INSERT语句。
CREATE语句不需要做任何转换,因此在顺序转换的过程中如果遇到 CREATE语句,直接输出即可。
合并存储位置中内容为空,说明对应的insert语句没有与相应的update 语句进行合并,因此语句本身也没有任何变化,直接输出即可。
步骤S023:获取所述INSERT语句相应合并存储位置中的目标、条件和赋值信息,将所述获取的目标、条件和赋值信息合并入所述INSERT语句的赋值部分,并输出修改后的INSERT语句。
合并存储位置中有相应的信息,就说明该insert语句在预处理的步骤中被合并可相应的update语句,因此需要将insert语句的条件和赋值信息按照所有存储的内容重新修改后输出。
此时输出的insert语句,即已包含了操作目标相同的update语句的内容,因此完成了对简单型update语句向insert语句的转换过程。
步骤S024:解析所述复杂型UPDATE语句的子句,根据所述复杂型 UPDATE语句的操作目标生成新CREATE语句,根据所述复杂型UPDATE 语句的条件和赋值信息对所述新CREATE语句生成新INSERT语句,根据所述新INSERT语句和所述复杂型UPDATE语句输出最终INSERT语句。
复杂型update语句包含子查询的信息,因此不能简单地将其内容存储至 insert语句的相应位置,需要创建与update语句目标相同的表,对该表插入相应的内容,再通过insert语句实现从创建的表中向update语句的操作目标中插入相应内容的目的。
因此需要通过原有UPDATE语句,生成建表的CREATE语句,在对新建的表插入原表相同的内容,最终通过上述这些条件,生成最终的insert语句。
本发明先对SQL语句进行解析,获得三种不同的语句,将INSERT语句和UPDATE语句的语义数值按照其类型和操作目标进行存储,然后将简单型UPDATE语句的语义数据存入与其具有相同操作目标的INSERT语句存储结构中,通过这种方式,将具有相同操作目标的简单型UPDATE语句和 INSERT语句合并在一起,实现等价转换;进一步的对于复杂型的UPDATE语句,借助CREATE语句创建了UPDATE语句的相应内容,最终组合 UPDATE语句、INSERT语句、和CREATE语句的所有内容,形成最终 INSERT语句。通过这些步骤实现了UPDATE的无缝等价自动转化,避免了人为转换的失误、提高了效率,可以最大限度的利用现有的SQL,将这些转换后的SQL应用于大数据技术,可以实现大数据技术的快速推广。
为了更好的说明本发明,给出实施例二,如图2-1所示,详细阐述本发明对于简单型UPDATE语句的转换过程。
步骤S201:获取所述简单型UPDATE语句的操作目标、条件表达式和赋值信息。
步骤S202:根据所述简单型UPDATE语句的操作目标,在所述预设存储结构中查找相同操作目标的INSERT语句,获取该INSERT语句的存储信息。
步骤S203:根据所述INSERT语句的存储信息,将所述简单型UPDATE语句的条件表达式和赋值信息按照INSERT语句的存储结构合并存入所述INSERT 语句的合并存储位置。
步骤S204:对经过所述预处理步骤的所述语句序列依次进行转换并输出。
步骤S205:获取所述INSERT语句相应合并存储位置中的目标、条件和赋值信息,将所述获取的目标、条件和赋值信息合并入所述INSERT语句的赋值部分,并输出修改后的INSERT语句。
图2-2更进一步的说明步骤S205中如何获取修改后的INSERT语句。
步骤S2051:在所述合并存储位置中获得语句序列中所述INSERT语句的操作目标列表。
步骤S2052:获得所述合并存储位置中与所述操作目标列表相应的条件表达式和赋值表达式对列表。
步骤S2053:将操作目标列表的条件表达式和赋值表达式对作为所述语句序列中INSERT语句对当前操作目标的赋值部分。
步骤S2054:输出修改后的INSERT语句。
根据实施例二的方法,可实现下列SQL的转化。
原始SQL序列:
转换后SQL序列:
为了详细说明如何对复杂型UPDATE语句进行转换,给出本发明的实施例三,如图3所示。
步骤S301:解析所述复杂型UPDATE语句的子句,获取所述复杂型UPDATE 语句的操作目标。
步骤S302:生成新CREATE语句,所述新CREATE语句的创建目标为所述复杂型UPDATE语句操作目标的对应临时操作目标。
步骤S303:生成新INSERT语句,所述新INSERT语句的插入条件和赋值信息为所述复杂型UPDATE语句的条件和赋值信息,所述新INSERT语句的操作目标为所述新CREATE语句的创建目标。
步骤S304:根据所述复杂型UPDATE语句、所述新CREATE语句和所述新INSERT语句组合成最终INSERT语句。
需要说明的是,在完成复杂型UPDATE语句转换后,可以将CREATE语句创建的临时表删除。
根据实施例三,可实现下列SQL的转换。
原始SQL序列:
转换后SQL序列:
为了更加系统详尽的描述本发明的实现过程,下面结合实例给出实施例四,如图4-1所示为预处理步骤。
原始SQL语句序列(简称原始SQL序列):
SQL-1、SQL-2、。。。SQL-N
由于原始语句的数量是固定的,采用String orgSqls[N]数组表示。
转换后SQL语句序列(简称转换后SQL序列):
SQL-1、SQL-2、。。。SQL-M
转换后的SQL数量M一般情况下与原始的SQL数量N是不相同的,而且在转换过程中SQL的数量会动态变化,这部分采用List<String>destSqlList列表方式表示。
本实例涉及的语句分别为:
建表语句:create table
插入语句:insert
更新语句:update,Update语句还可以进一步分为简单类型(simple)和子查询类型(subQuery)
删表语句:drop table
查询语句:select,在本专利涉及的SQL序列中一般出现在子查询中。
依据分隔符(一般为分号)切分SQL语句序列。
预处理过程:
步骤S4011:将SQL语句序列存入原始SQL数组,定义预设存储结构。
原始SQL数组为:String orgSqls[N],N为原始SQL语句的数量;并依次定义以下数据结构:
String orgType[N]:SQL语句的类型数组;
String orgTabName[N]:SQL所操作表的数组;
Map<String,Map<String,String>>insertColValMaps[N]:针对insert类型的SQL语句,每个语句存储一个Map,key对应的是字段名,数值还是个Map,该Map的Key为条件表达式,value为字段值的表达式;
String updSubTypes[N]:update语句的子类型,simple或subQuery。
步骤S4012:从原始SQL序列的SQL-1开始扫描,依次扫描每个SQL。
步骤S4013:针对每个SQL(假设当前正在扫描的为第k个SQL),解析SQL 的类型、所操作的表,并存入orgTypes[k],orgTabNames[k]。
步骤S4014:判定当前正在扫描的SQL类型orgType[k]是否为simple update,如果是则进入步骤S4015。如果否则返回步骤S4012。
步骤S4015:将simple update存入全局变量:updSubTypes[k]。
步骤S4016:获取where语句中的全部条件表达式,存入变量condition-k。
步骤S4017:获取每个set语句的针对每个字段的赋值语句,假设共有针对 colNum个字段的赋值语句,字段名和字段值的表达式分别存入字段名数组String colNames[colNum]和字段值表达式数组String colVals[colNum]。
步骤S4018:依据本update语句所操作做的表名orgTabNames[k],通过同时查找表名数组orgTabNames[]和SQL语句类型数组orgTypes[],找到针对该表做insert操作的那个SQL语句,假设该语句为SQL-L,然后取出该insert语句对应的Map(insertColValMaps[L])。
步骤S4019:针对colNum个字段,依次做如下操作,针对第i个字段的操作如下:
insertColValMaps[L].get(colNames[i]).put(condition-k,colVals[i])
当N个SQL语句全部扫描完成,结束预处理过程。
图4-2所示为转换步骤。
在本过程开始之前定义一个等待删除表的列表List<String>deletingTabList,用于缓存本过程中产生的临时表名。
步骤S4021:从原始SQL序列的SQL-1开始,依次扫描每个SQL。
步骤S4022:对于第k个SQL语句SQL-k,取出SQL的类型orgType[k],如果是insert语句,进入步骤S4023,如果是复杂型update语句,进入步骤S4028。
步骤S4023:对于insert语句,先查看insertColValMaps[k]是否为空,如果为空直接向destSqlList输出当前语句:destSqlList.add(orgSqls[k])。反之则进入步骤S4024。
步骤S4024:从insertColValMaps[k]获取到最外层的key值列表。
从insertColValMaps[k]获取到最外层的key值列表,即字段列表:insertColValMaps[k].keyset()
针对该列表的每个字段依次做如下处理:
步骤S4025:针对当前字段所对应的Map<String,String>,获取相应条件表达式和数值表达式对儿的列表。如:cond1,val1;cond2,val2;…
步骤S4026:获取该字段在原来insert语句中的赋值表达式oldVal,修改该insert语句中该字段的赋值部分。
从oldVal修改为:
Case when cond1 then val1 when cond2 then val2…else oldVal end
步骤S4027:完成字段列表中的全部字段的赋值部分的修改之后,将该insert 语句输出到destSqlList中。
步骤S4028:解析update语句,拆分where和set子句分别存储其内容。
去掉where子句部分的exists(。。。)部分。
把where语句中全部剩余部分的条件表达式,存入变量condition-k。
假设共有setNum个set语句,定义如下局部数据结构(仅用于当前update 语句):
List<String>colLists[setNum]:保存每个set中字段列表
List<String>expLists[setNum]:保存每个set对应的子查询中表达式列表
String subTabs[setNum]:保存每个set的对应的子查询的from中的表名。
String joinConds[setNum]:保存每个set的对应的子查询的关联条件。
针对每个set语句依次处理,完成以下过程:
针对第i个set语句:解析其字段列表存入colLists[i],解析select部分的表达式列表存入expLists[i],解析出from部分的表名存入subTabs[i],从子查询的 where子句部分解析出关联条件joinCond[i]。
步骤S4029:生成一个在本SQL序列中未曾使用过的不重复的表名(如 tmpXXXX),存入变量tmpTab中。(由于生产具有唯一性的临时表名不是本专利重点,这里对此不做详述)
步骤S40210:根据临时表tmpTab和update语句,获取对应的insert语句,修改所述insert语句。
以update语句操作的表名orgTabName[k]为依据找到对应的建表语句,及对应的在destSqlList序列中的位置(假设该位置为pos),在pos得后面插入一条建表语句,该建表语句的结构内容与前者完全相同,只是表名改为以上 tmpTab变量存储的表名。同时把该临时表tmpTab加入到deletingTabList。
以update语句操作的表名orgTabName[k]为依据找到对应的insert语句,将insert语句中的表名从orgTabName[k]修改为以上tmpTab变量存储的表名。
定义表orgTabName[k]的全部字段列表为allColList(可以从对应的建表语句获取全部字段名),定义未参与update的set语句的字段名列表为remainColList,则:
remainColList=allColList-ΣcolLists[i]
步骤S20211:以该update语句解析出的以上元素构建一个全新的insert语句。
全新的insert语句(含子查询)insertSql,代替该update语句。构造的方式如下:
i)insert into的表名为原update表名;
ii)insert字段列表为:remainColList+colList[1]+colList[2]+。。。+ colList[setNum]。
iii)select表达式列表部分:remainColList+expLists[1]+expLists[2]+。。。 +expLists[setNum],注:remainColList部分的字段,要带上表名 orgTabName[k]或其别名的前缀,而expLists[i]部分涉及的字段名要带上表名subTabs[i]或其别名的前缀。
iv)from先加入主表名orgTabName[k],然后按set的数据量setNum 依次加入leftjoin subTabs[1]on joinCond[1]left join subTabs[2]on joinCond[2]。。。left joinsubTabs[setNum]on joinCond[setNum],注:关联条件部分涉及字段应该不齐相应的表名前缀。
v)如果condition-k不为空,则语句的最后增加where condition-k部分。
最后将构造好的insertSql语句添加到destSqlList:
destSqlList.add(insertSql)。
对于其他类型的SQL,直接添加到destSqlList:destSqlList.add(orgSqls[k])
完成所有的SQL转换后,取出deletingTabList缓存中的所有表名,针对每个表名deletingTabList[i],构造删表操作,并加入到destSqlList: destSqlList.add(droptable deletingTabList[i])。
本发明还公开了一种语句自动转换装置,先给出本发明的实施例五,如图5 所示,用以说明该装置的结构特点。该装置包括:包含预处理单元和转换单元。
所述预处理单元1包括:
解析存储模块11,用于顺序解析并获取所述INSERT语句和所述 UPDATE语句的语义数值,按照类型、操作目标将解析的结果分别存储于预设存储结构中。
合并处理模块12,用于获取简单型UPDATE语句的操作目标、条件和赋值信息,在所述预设存储结构中,将所述UPDATE语句的条件和赋值信息填入与所述UPDATE语句具有相同操作目标的所述INSERT语句的合并存储位置。
所述转换单元2包含:
顺序处理模块21,用于对经过所述预处理步骤的所述语句序列依次进行转换并输出;以及,直接输出CREATE语句和合并存储位置中内容为空的 INSERT语句。
合并INSERT语句处理模块22,用于获取所述INSERT语句相应合并存储位置中的目标、条件和赋值信息,将所述获取的目标、条件和赋值信息合并入所述INSERT语句的赋值部分,并输出修改后的INSERT语句。
UPDATE语句处理模块23,解析所述复杂型UPDATE语句的子句,根据所述复杂型UPDATE语句的操作目标生成新CREATE语句,根据所述复杂型UPDATE语句的条件和赋值信息对所述新CREATE语句生成新INSERT 语句,根据所述新INSERT语句和所述复杂型UPDATE语句输出最终INSERT 语句。
为了更好的说明单元的结构,给出本发明的实施例六,如图6所示。
预处理单元:
所述解析存储模块11进一步包含:
INSERT语句解析子模块111,用于解析所述INSERT语句的类型、操作目标、数值、表达式等语义数值。
存储子模块112,用于按照双层关键字-值的预设存储结构对解析子模块解析的INSERT语句的类型、操作目标、数值、表达式等语义数值进行存储。
所述合并处理模块12进一步包含:
UPDATE语句解析子模块121,用于解析获取所述简单型UPDATE语句子句的操作目标、条件表达式和赋值信息。
相关语句存储信息获取子模块122,用于根据所述UPDATE语句解析子模块获取的简单型UPDATE语句的操作目标,在所述存储子模块的预设存储结构中查找相同操作目标的INSERT语句,获取该INSERT语句的存储信息。
合并子模块123,用于根据所述相关语句存储信息获取子模块获取的 INSERT语句的存储信息,将所述UPDATE语句解析子模块获取的简单型UPDATE语句的条件表达式和赋值信息按照INSERT语句的存储结构合并存入所述INSERT语句的合并存储位置。
转换单元:
顺序处理模块21,用于对经过所述预处理步骤的所述语句序列依次进行转换并输出;以及,直接输出CREATE语句和合并存储位置中内容为空的 INSERT语句。
所述合并INSERT语句处理模块22进一步包含:
操作目标列表获取子模块221,用于在所述合并子模块存入的合并存储位置中获得语句序列中所述INSERT语句的操作目标列表。
表达式对列表获取子模块222,用于获得所述合并存储位置中与所述操作目标列表相应的条件表达式和赋值表达式对列表。
赋值修改子模块223,用于将所述表达式对列表获取子模块获取的操作目标列表的条件表达式和赋值表达式对作为所述语句序列中INSERT语句对当前操作目标的赋值部分。
所述UPDATE语句处理模块23的进一步包含:
操作目标获取子模块231,用于解析所述复杂型UPDATE语句的子句,获取所述复杂型UPDATE语句的操作目标。
CREATE语句生成子模块232,用于生成新CREATE语句,所述新 CREATE语句的创建目标为所述操作目标获取子模块获取的所述复杂型 UPDATE语句操作目标的对应临时操作目标。
INSERT语句生成子模块233,用于生成新INSERT语句,所述新INSERT 语句的插入条件和赋值信息为所述复杂型UPDATE语句的条件和赋值信息,所述新INSERT语句的操作目标为所述CREATE语句生成子模块生成的所述新CREATE语句的创建目标。
语句组合模块234,用于根据所述复杂型UPDATE语句、所述新CREATE 语句和所述新INSERT语句组合成最终INSERT语句。
优选的,所述装置还包括:
输出单元3,用于给单元模块提供输出接口,输出经过所述顺序模块处理的CREATE语句和合并存储位置中内容为空的INSERT语句、输出经过所述合并INSERT语句处理模块修改后的INSERT语句、输出经过UPDATE语句处理模块处理的最终INSERT语句。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的装置实施例中的对应过程,可以参考前述方法的具体工作过程,在此不再赘述。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”“第四”等(如果存在)是用于区别类似的部分,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请实施例能够在除了这里图示的以外的顺序实施。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (12)
1.一种语句自动转换方法,将原始SQL语句切分为语句序列,在所述语句序列中获取与所述原始语句操作目标相应的INSERT语句、UPDATE语句、CREATE语句,其特征在于,包括:
预处理步骤:
顺序解析并获取所述INSERT语句和所述UPDATE语句的语义数值,按照类型、操作目标将解析的结果分别存储于预设存储结构中;
获取简单型UPDATE语句的操作目标、条件和赋值信息,在所述预设存储结构中,将所述UPDATE语句的条件和赋值信息填入与所述UPDATE语句具有相同操作目标的所述INSERT语句的合并存储位置;
转换步骤:
对经过所述预处理步骤的所述语句序列依次进行转换并输出;
直接输出CREATE语句和合并存储位置中内容为空的INSERT语句;
获取所述INSERT语句相应合并存储位置中的目标、条件和赋值信息,将所述获取的目标、条件和赋值信息合并入所述INSERT语句的赋值部分,并输出修改后的INSERT语句;
解析复杂型UPDATE语句的子句,根据所述复杂型UPDATE语句的操作目标生成新CREATE语句,根据所述复杂型UPDATE语句的条件和赋值信息对所述新CREATE语句生成新INSERT语句,根据所述新INSERT语句和所述复杂型UPDATE语句输出最终INSERT语句。
2.根据权利要求1所述的方法,其特征在于:
解析INSERT语句的类型、操作目标、数值、表达式等语义数值,按照双层关键字-值的预设存储结构进行存储。
3.根据权利要求2所述的方法,其特征在于,所述获取简单型UPDATE语句的操作目标、条件和赋值信息,在所述预设存储结构中,将所述UPDATE语句的条件和赋值信息填入与所述UPDATE语句具有相同操作目标的所述INSERT语句的合并存储位置的方法具体为:
获取所述简单型UPDATE语句的操作目标、条件表达式和赋值信息;
根据所述简单型UPDATE语句的操作目标,在所述预设存储结构中查找相同操作目标的INSERT语句,获取该INSERT语句的存储信息;
根据所述INSERT语句的存储信息,将所述简单型UPDATE语句的条件表达式和赋值信息按照INSERT语句的存储结构合并存入所述INSERT语句的合并存储位置。
4.根据权利要求3所述的方法,其特征在于,获取所述INSERT语句相应合并存储位置中的目标、条件和赋值信息,将所述获取的目标、条件和赋值信息合并入所述INSERT语句的赋值部分,并输出修改后的INSERT语句的方法具体为:
在所述合并存储位置中获得语句序列中所述INSERT语句的操作目标列表;
获得所述合并存储位置中与所述操作目标列表相应的条件表达式和赋值表达式对列表;
将操作目标列表的条件表达式和赋值表达式对作为所述语句序列中INSERT语句对当前操作目标的赋值部分;
输出修改后的INSERT语句。
5.根据权利要求4中所述的方法,其特征在于,所述解析所述复杂型UPDATE语句的子句,根据所述复杂型UPDATE语句的操作目标生成新CREATE语句,根据所述复杂型UPDATE语句的条件和赋值信息对所述新CREATE语句生成新INSERT语句,根据所述新INSERT语句和所述复杂型UPDATE语句输出最终INSERT语句的方法具体为:
解析所述复杂型UPDATE语句的子句,获取所述复杂型UPDATE语句的操作目标;
生成新CREATE语句,所述新CREATE语句的创建目标为所述复杂型UPDATE语句操作目标的对应临时操作目标;
生成新INSERT语句,所述新INSERT语句的插入条件和赋值信息为所述复杂型UPDATE语句的条件和赋值信息,所述新INSERT语句的操作目标为所述新CREATE语句的创建目标;
根据所述复杂型UPDATE语句、所述新CREATE语句和所述新INSERT语句组合成最终INSERT语句。
6.根据权利要求1-5中任一所述的方法,其特征在于:
所述简单型UPDATE语句为不包含子查询的更新语句;所述复杂型UPDATE语句为包含子查询的更新语句。
7.一种语句自动转换装置,包含预处理单元和转换单元,其特征在于:
所述预处理单元包括:
解析存储模块,用于顺序解析并获取INSERT语句和UPDATE语句的语义数值,按照类型、操作目标将解析的结果分别存储于预设存储结构中;
合并处理模块,用于获取简单型UPDATE语句的操作目标、条件和赋值信息,在所述预设存储结构中,将所述UPDATE语句的条件和赋值信息填入与所述UPDATE语句具有相同操作目标的所述INSERT语句的合并存储位置;
所述转换单元包含:
顺序处理模块,用于对经过所述预处理步骤的语句序列依次进行转换并输出;以及,直接输出CREATE语句和合并存储位置中内容为空的INSERT语句;
合并INSERT语句处理模块,用于获取所述INSERT语句相应合并存储位置中的目标、条件和赋值信息,将所述获取的目标、条件和赋值信息合并入所述INSERT语句的赋值部分,并输出修改后的INSERT语句;
UPDATE语句处理模块,解析复杂型UPDATE语句的子句,根据所述复杂型UPDATE语句的操作目标生成新CREATE语句,根据所述复杂型UPDATE语句的条件和赋值信息对所述新CREATE语句生成新INSERT语句,根据所述新INSERT语句和所述复杂型UPDATE语句输出最终INSERT语句。
8.根据权利要求7所述的装置,其特征在于,所述解析存储模块进一步包含:
INSERT语句解析子模块,用于解析所述INSERT语句的类型、操作目标、数值、表达式等语义数值;
存储子模块,用于按照双层关键字-值的预设存储结构对解析子模块解析的INSERT语句的类型、操作目标、数值、表达式等语义数值进行存储。
9.根据权利要求8所述的装置,其特征在于,所述合并处理模块进一步包含:
UPDATE语句解析子模块,用于解析获取所述简单型UPDATE语句子句的操作目标、条件表达式和赋值信息;
相关语句存储信息获取子模块,用于根据所述UPDATE语句解析子模块获取的简单型UPDATE语句的操作目标,在所述存储子模块的预设存储结构中查找相同操作目标的INSERT语句,获取该INSERT语句的存储信息;
合并子模块,用于根据所述相关语句存储信息获取子模块获取的INSERT语句的存储信息,将所述UPDATE语句解析子模块获取的简单型UPDATE语句的条件表达式和赋值信息按照INSERT语句的存储结构合并存入所述INSERT语句的合并存储位置。
10.根据权利要求9所述的装置,其特征在于,所述合并INSERT语句处理模块进一步包含:
操作目标列表获取子模块,用于在所述合并子模块存入的合并存储位置中获得语句序列中所述INSERT语句的操作目标列表;
表达式对列表获取子模块,用于获得所述合并存储位置中与所述操作目标列表相应的条件表达式和赋值表达式对列表;
赋值修改子模块,用于将所述表达式对列表获取子模块获取的操作目标列表的条件表达式和赋值表达式对作为所述语句序列中INSERT语句对当前操作目标的赋值部分。
11.根据权利要求10所述的装置,其特征在于,所述UPDATE语句处理模块的进一步包含:
操作目标获取子模块,用于解析所述复杂型UPDATE语句的子句,获取所述复杂型UPDATE语句的操作目标;
CREATE语句生成子模块,用于生成新CREATE语句,所述新CREATE语句的创建目标为所述操作目标获取子模块获取的所述复杂型UPDATE语句操作目标的对应临时操作目标;
INSERT语句生成子模块,用于生成新INSERT语句,所述新INSERT语句的插入条件和赋值信息为所述复杂型UPDATE语句的条件和赋值信息,所述新INSERT语句的操作目标为所述CREATE语句生成子模块生成的所述新CREATE语句的创建目标;
语句组合模块,用于根据所述复杂型UPDATE语句、所述新CREATE语句和所述新INSERT语句组合成最终INSERT语句。
12.根据权利要求7-11所述的装置,其特征在于,所述装置还包括:
输出单元,用于给单元模块提供输出接口,输出经过顺序模块处理的CREATE语句和合并存储位置中内容为空的INSERT语句、输出经过所述合并INSERT语句处理模块修改后的INSERT语句、输出经过UPDATE语句处理模块处理的最终INSERT语句。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811633920.1A CN111382170B (zh) | 2018-12-29 | 2018-12-29 | 一种语句自动转换方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811633920.1A CN111382170B (zh) | 2018-12-29 | 2018-12-29 | 一种语句自动转换方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111382170A CN111382170A (zh) | 2020-07-07 |
CN111382170B true CN111382170B (zh) | 2023-07-14 |
Family
ID=71222981
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811633920.1A Active CN111382170B (zh) | 2018-12-29 | 2018-12-29 | 一种语句自动转换方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111382170B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115994142B (zh) * | 2022-12-13 | 2024-04-02 | 浙江浙里信征信有限公司 | 一种基于数据中台的数据开发方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103678532A (zh) * | 2013-12-02 | 2014-03-26 | 中国移动(深圳)有限公司 | 变更语句逆向分析方法、数据库变更回退方法及系统 |
CN105868204A (zh) * | 2015-01-21 | 2016-08-17 | 中国移动(深圳)有限公司 | 一种转换Oracle脚本语言SQL的方法及装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070185897A1 (en) * | 2006-02-06 | 2007-08-09 | International Business Machines Corporation | Method and system for tracking and storing semantic web revision history |
-
2018
- 2018-12-29 CN CN201811633920.1A patent/CN111382170B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103678532A (zh) * | 2013-12-02 | 2014-03-26 | 中国移动(深圳)有限公司 | 变更语句逆向分析方法、数据库变更回退方法及系统 |
CN105868204A (zh) * | 2015-01-21 | 2016-08-17 | 中国移动(深圳)有限公司 | 一种转换Oracle脚本语言SQL的方法及装置 |
Non-Patent Citations (1)
Title |
---|
SQL语句的自动生成;韩冰;;甘肃科技(02);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN111382170A (zh) | 2020-07-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107092656B (zh) | 一种树状结构数据处理方法及系统 | |
CN107247808B (zh) | 一种分布式NewSQL数据库系统及图片数据查询方法 | |
US7730032B2 (en) | Efficient queriability of version histories in a repository | |
JP4856627B2 (ja) | 部分的クエリーキャッシング | |
US9171100B2 (en) | MTree an XPath multi-axis structure threaded index | |
US20110137890A1 (en) | Join Order for a Database Query | |
US20130006968A1 (en) | Data integration system | |
CN107016071B (zh) | 一种利用简单路径特征优化树状结构数据的方法及系统 | |
JP3914662B2 (ja) | データベース処理方法及び実施装置並びにその処理プログラムを記憶した媒体 | |
CN104657439A (zh) | 用于自然语言精准检索的结构化查询语句生成系统及方法 | |
US20040221229A1 (en) | Data structures related to documents, and querying such data structures | |
KR20040036201A (ko) | Xml 데이터 검색을 위한 질의 처리 방법 | |
CN110795526B (zh) | 一种用于检索系统的数学公式索引创建方法与系统 | |
CN105630881A (zh) | 一种rdf的数据存储方法和查询方法 | |
CN104573039A (zh) | 一种关系数据库的关键词查询方法 | |
CN107818181A (zh) | 基于Plcient交互式引擎的索引方法及其系统 | |
CN111191084B (zh) | 一种基于图结构的地名地址的解析方法 | |
US20030159110A1 (en) | Structured document management system, structured document management method, search device and search method | |
CN111382170B (zh) | 一种语句自动转换方法和装置 | |
CN111125216B (zh) | 数据导入Phoenix的方法及装置 | |
US20170242880A1 (en) | B-tree index structure with grouped index leaf pages and computer-implemented method for modifying the same | |
CN116701351A (zh) | 一种适用于大数据的函数依赖近似发现方法 | |
US7546282B2 (en) | Method for searching within elements in a hierarchically structured database | |
CN115374121A (zh) | 数据库索引的生成方法、机器可读存储介质与计算机设备 | |
CN112836021B (zh) | 一种图书馆智能化搜索系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |