(一)、背景
目前业务部门对业务数据的查询可以通过业务系统提供的查询功能进行,也可以通过数据库产商提供的数据库工具进行。业务系统提供的查询功能都是预先设计好的,这种方式功能有限,业务人员需要进行新的查询时,只能通过升级系统来实现,时间上存在滞后,且依然无法满足将来可能的新需求。通过数据库工具进行查询可以满足业务人员随时的新查询需求,但是这要求业务人员需熟练掌握数据库工具和SQL语法。<o:p></o:p>
为满足相关业务部门特别是审计部门在不用掌握数据库查询工具和SQL语法等技术的情况下也能灵活、自由查询数据库,可使用数据库灵活查询工具(简称DBQT)。该工具采用基于LL(K)文法的编译器技术实现,旨在为各行业的业务系统特别是审计系统提供快速、灵活、高效的数据库查询。
(二)、工具的特点
1、采用ANTLR,语言识别的另一个工具(ANother Tool for Language Recognition),通过JAVA动作的语法描述来构造语言识别器、编译器和解释器。
2、采用基本LL(K)的文法编译原理技术实现,即编译器从左向右扫描输入串,使用最左推导法,每次向右扫描K个符号就可确定使用哪个产生式。
3、支持业务化的中文查询语句的语法验证,验证成功后通过翻译器将中文查询语句翻译成标准的英文查询语句。
4、支持常用的五种语句:常规语句、追加语句、比较语句、循环语句、自定义语句。
5、构件化功能组装强大、简单的业务延伸能力,工具提供了与业务系统无关性的二次开发接口。
<o:p></o:p>
(三)、工具的功能
本工具应用了当今最流行ANTLR元语言技术工具,使用BNF巴科斯范式(Backus-Naur Form)进行语法定义,采用基于LL(K)的文法编译原理技术实现的,该工具实现了数据库语句的灵活查询及强大语法验证功能,可以准确地分析复杂的语法,并能根据查询语句对应的数据库表、标准字段表等信息将业务化的中文查询语句翻译成标准的SQL语句,供业务系统提取使用。工具支持常规语句、追加语句、比较语句、循环语句、自定义语句等常用的五种查询语句。
数据库表设置功能<o:p></o:p>
用户根据业务系统的英文库表名称,设置对应的业务化中文库表或帐表名称,以及对应的辅助信息,如库表所在的数据库(当使用多个数据库时)、库表的类别等。通过设置库表,用户在前台就可以用直接选择业务化的库表名称即可,而无需去记住其英文名称。<o:p></o:p>
标准字段表设置功能<o:p></o:p>
用户根据业务系统的库表名称,设置此库表对应的标准字段信息,主要为字段中文名称、业务系统中的英文名称、对应的库表名称以及该字段的数据类型、最大长度、精度等。当用户选择的某一中文库表名称后,可通过快捷键直接获取该表对应的字段信息,方便业务人员的操作。
查询语句语法验证功能<o:p></o:p>
通过以上两个步骤进行库表及字段的设置后,业务人员就可在前台选择所需的数据库表名称、该数据库表的字段,根据业务需要输入自定义的查询语句后,工具可将用户输入的语句进行语法解析验证,一次扫描查询语句即可完成解析。语法的验证包含了对关键字(如:查询SELECT、来自FROM、条件WHERE)、标点符号、运算符号(如:加、减、乘、除)、聚合函数(如:求平均值AVG、求最大值MAX)、数学函数(如:取绝对值ABS、求余弦值COS)、日期时间函数(如:取当前日期时间SYSDATE)、字符串函数(如:求字符串长度LENGTH、字符串截取SUBSTR)、数据类型转化函数(如:转为日期TO_DATE)等的验证。如果发现此语句错误,则可提供较为准确的错误提示;如果语句验证正确,则业务系统就可对该语句进行业务操作。
查询语句翻译功能及业务数据获取<o:p></o:p>
对查询语句语法验证的最终目的是要将业务化的中文查询语句转化成业务系统所需要的标准英文SQL查询语句,本工具提供了将业务化查询语句转化成标准的可执行SQL语句的功能,业务系统可获取此语句直接在系统中使用。<o:p></o:p>
除了业务系统可对标准英文SQL查询语句的获取外,工具还可准确识别并获取不同子句下的内容项,包括SELECT子句的查询内容、FROM子句的表信息、WHERE子句的条件信息、GROUP BY子句的分组内容、ORDER BY子句的排序内容、表合并的表信息、循环语句的变量参数等。
(四)、工具的架构
词法分析<o:p></o:p>
编译器在接收到查询语句后,首先对查询语句进行扫描,即阅读查询语句(通常以字节流表示),扫描程序就是执行词法分析(Lexer Analysis)的过程,并将字节流序列转成编译器可识别的记号流(TOKEN)。<o:p></o:p>
语法分析<o:p></o:p>
语法分析程序从扫描程序中获取记号形式的源代码,根据语法定义中的规则对查询语句进行语法分析(Parser Analysis)。如果查询语句都能应用到所定义的规则,没有产生任何错误的话,则表示此查询语句的语法是正确的,分析全部完成后,将构造出符合该语句的一棵抽象语法树(AST)。<o:p></o:p>
遍历抽象语法树<o:p></o:p>
在语法分析全部完成后,编译器则遍历这棵抽象语法树(AST),并根据需要提取相关的节点(根节点、叶子节点)信息,组成了编译器模型对象(QueryModel)。<o:p></o:p>
编译器模型对象<o:p></o:p>
编译器模型对象(QueryModel)包含查询语句的异常信息、查询语句的类型信息、查询语句的子句信息。查询语句的类型信息,如:常规语句模型对象(SelectStatementModel)、表合并模型对象(TableUnionModel)、表比较模型对象(TableCompareModel);查询语句的子句信息,如:SELECT子句模型对象(SelectListModel)、FROM字句模型对象(TableListModel)、WHERE字句模型对象(SearchConditionModel)等。同时,编译器模型对象负责接收翻译器传回的业务数据,如表名、字段名、表别名、字段别名等信息,进行各种相关的操作。<o:p></o:p>
翻译器<o:p></o:p>
翻译器提供了与业务系统查询语句的各种交互动作,包括常规语句、追加(合并)语句、比较语句、循环语句、自定义查询语句。翻译器负责接收业务系统的表名、字段名等信息及相关业务数据内容的处理,将编译器所需的数据传给编译器模型对象,并将结果传回给业务系统,供业务系统提取使用,完成对业务数据的中转控制与处理。
(五)、支持的平台
硬件环境:SUN / IBM / HP小型机/ PC SERVER
操作系统:WINDOWS、Linux、UNIX、AIX
数据库系统:Oracle、Sybase、DB2
服务器环境:WebSphere、WebLogic、JBoss、Tomcat