当前位置: 首页 > 专利查询>浙江大学专利>正文

一种将Transact-SQL程序转换为Java程序的方法技术

技术编号:23445332 阅读:48 留言:0更新日期:2020-02-28 19:38
本发明专利技术公开了一种将Transact‑SQL(T‑SQL)程序转换为Java程序的方法,该方法包括以下步骤:1)获取Transact‑SQL对象;2)遍历类型定义代码,获取全局类型信息;3)遍历业务逻辑代码,获取签名信息以及依赖关系;4)确定业务逻辑代码的转换顺序;5)依次遍历业务逻辑代码,按照转换规则,执行转换过程。本发明专利技术中的程序转换方法,一方面,在转换过程中考虑了T‑SQL和Java各自的优势,既保留了T‑SQL对数据库的高效操作,又获得了Java的灵活性和可扩展性;另一方面,通过引入自动化转换技术,降低了人力成本,提高了转换效率。

A method of transforming transact SQL program into Java program

【技术实现步骤摘要】
一种将Transact-SQL程序转换为Java程序的方法
本专利技术属于计算机软件中的程序转换领域,具体涉及一种将Transact-SQL程序转换为Java程序的方法。
技术介绍
随着程序语言的发展,新型的程序语言被不断设计出来。相比于传统程序语言,新型程序语言往往支持更多的高级语言特性,表达能力更强,开发起来更快捷,更适应技术发展潮流。因此,企业中的很多历史悠久的业务系统面临着从传统编程语言向新型编程语言转换的需求。SQL(StructuredQueryLanguage),即结构化查询语言,是关系型数据库的标准语言,已被众多数据库管理系统所采用。Transact-SQL(简称T-SQL)是MicrosoftSQLSERVER对SQL的扩展,提供了类似C、Basic和Pascal中的过程式语句,如变量、控制流、子程序等,使得SQL不再局限于标准的数据库操作,成为一种功能强大的结构化语言,可以用来完成业务逻辑编写。Java是一门面向对象编程语言,不仅吸收了C++的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java允许程序员以优雅的思维方式进行复杂的编程,是目前主流的编程语言之一,并且是编写企业应用程序的首选。与一般的程序转换场景不同,T-SQL是一种特殊的编程语言,它包括SQL语句和过程式语句两部分,而其中的SQL语句必须由数据库来执行,因此,转换后的Java程序中既有Java代码(通常由T-SQL中的过程式语句转换而来),也有SQL语句(包含在Java的JDBCAPI调用语句中,以Java中的字符串形式存在)。这两部分代码运行在不同的系统软件中,Java代码运行在Java虚拟机中,SQL语句运行在数据库中(Java程序在执行JDBCAPI调用语句时会通过系统驱动将SQL语句传递给数据库来执行)。这样的运行方式带来两个主要问题:(1)两种代码在运行时如何进行数据传递;(2)SQL语句如何调用Java语句。产生第二个问题的主要原因是SQL语句中会嵌套一些子程序调用,但是T-SQL中的子程序需要整体转换为Java中的子程序,而SQL语句在数据库中执行时是无法调用Java中的子程序的。另外,也存在一些特殊情况:■不需要将SQL语句转换为JDBCAPI调用语句,而是转换为Java中的原生实现,这是因为T-SQL本身的语法限制,导致一些在Java中很容易就能完成的功能,在T-SQL中就需要用一些复杂的SQL语句。比如Java中的容器在T-SQL中并没有类似的实现,所以只能用数据库表来替代。■有些过程语句必须由数据库来执行,所以需要将过程式语句转换为JDBCAPI调用。例如T-SQL中的SET语句通常可以转换为Java中的赋值语句,但如果是通过SET语句改变数据库系统状态,就只能转换为JDBCAPI调用。综上所述,将T-SQL转换为Java是一项十分复杂的任务。而且,现实中的业务系统往往积累了大量的T-SQL代码,开发人员进行手动转换需要耗费大量的时间和人力。
技术实现思路
针对上述现有技术中存在的缺陷,本专利技术的目的在于提供一种将Transact-SQL程序转换为Java程序的方法。为达到上述目的,本专利技术釆用如下技术方案:一种将Transact-SQL程序转换为Java程序的方法,包括如下步骤:获取Transact-SQL代码;遍历类型定义代码,获取全局类型信息;遍历业务逻辑代码,获取签名信息以及依赖关系;确定业务逻辑代码的转换顺序;依次遍历业务逻辑代码,按照转换规则,执行转换过程。上述技术方案中,进一步地,所获取的Transact-SQL代码包括数据库表定义代码、用户定义类型代码、函数定义代码、存储过程定义代码。其中,数据库表定义代码和用户定义类型代码统称为类型定义代码,这些代码所定义的类型是所有业务逻辑代码都可以使用的全局类型;函数定义代码和存储过程定义代码统称为业务逻辑代码,执行业务代码就是对函数/存储过程的调用。进一步地,所述的遍历类型定义代码,获取全局类型信息,用于后续对业务逻辑代码中的数据类型进行转换,包括如下步骤:首先,构建T-SQL类型定义代码的抽象语法树AST;然后遍历抽象语法树,访问特定节点类型,提取全局类型信息,主要包括类型名、子类型构成等。进一步地,所述的遍历业务逻辑代码,获取签名信息以及依赖关系,用于后续对业务逻辑代码中的子过程调用进行转换,包括如下步骤:首先,构建T-SQL业务逻辑代码的抽象语法树;然后,遍历抽象语法树,访问特定节点类型,提取签名信息以及依赖信息;其中,签名信息包括名称(函数名/存储过程名)、输入参数的信息和返回值的信息,输入参数的数量和返回值的数量都是不限的;输入参数的信息包括名称、类型、顺序、默认值;每个输入参数或返回值的类型是内置类型、数据库表和自定义类型中的任意一种具体类型。返回值的信息包括名称、类型、顺序等;依赖信息主要体现在业务逻辑代码之间的调用关系,如果函数/存储过程A调用了函数/存储过程B,就认为函数/存储过程A依赖于函数/存储过程B。更进一步地,所述的业务逻辑代码的转换顺序主要考虑代码之间的依赖关系,被依赖方要在依赖方之前进行转换,所以需要基于依赖关系,通过拓扑排序确定转换顺序。更进一步地,完成转换后,每个T-SQL自定义函数/存储过程都转换为独立的Java类,自定义函数/存储过程中的可执行代转换为Java类中的一个静态方法的方法体。进一步地,实际转换过程包括方法签名生成和方法体生成两部分;方法签名基于前述步骤提取的T-SQL签名信息来生成,主要包括方法名、输入参数名称、输入参数类型和返回值类型;方法体的生成主要包括如下步骤:基于T-SQL业务逻辑代码构建抽象语法树;遍历T-SQL抽象语法树,根据节点类型及其相邻节点类型,按照T-SQL语法的转换规则转换为Java抽象语法树;根据Java抽象语法树生成Java业务逻辑代码。进一步地,在生成方法体的过程中,需要对包含子程序调用的标准SQL语句进行特殊处理,以解决Java代码和SQL代码之间的数据传递问题,因为SQL语句需要在数据库中执行,而子程序调用需要在Java运行环境中执行;包含子程序调用的SQL语句的转换过程,主要分成三种情况,一是系统内置子程序调用,二是不依赖于SQL语句的自定义子程序调用,三是依赖于SQL语句的自定义子程序调用,如果子程序调用的输入参数引用了数据库表的数据列,那么子程序的执行结果就依赖于所在的SQL语句;所述的特殊处理主要包括如下步骤:判断子程序类型,如果是系统内置子程序,不需对子程序进行转换,直接生成JDBCAPI调用语句,因为SQL语句中通常会大量调用这些内置子程序,对其进行转换会造成Java代码的极大膨胀,而且这些内置子程序相对简单,相较而言,转换带来的收益较少;如果是自定义子程序,再判断子程序的执行结果是否依赖于所在的SQL语句,如果不存在依赖,先将自定本文档来自技高网
...

【技术保护点】
1.一种将Transact-SQL程序转换为Java程序的方法,其特征在于,包括如下步骤:/n获取Transact-SQL代码;/n遍历类型定义代码,获取全局类型信息;/n遍历业务逻辑代码,获取签名信息以及依赖关系;/n确定业务逻辑代码的转换顺序;/n依次遍历业务逻辑代码,按照转换规则,执行转换过程。/n

【技术特征摘要】
1.一种将Transact-SQL程序转换为Java程序的方法,其特征在于,包括如下步骤:
获取Transact-SQL代码;
遍历类型定义代码,获取全局类型信息;
遍历业务逻辑代码,获取签名信息以及依赖关系;
确定业务逻辑代码的转换顺序;
依次遍历业务逻辑代码,按照转换规则,执行转换过程。


2.根据权利要求1所述的将Transact-SQL程序转换为Java程序的方法,其特征在于,所获取的Transact-SQL代码包括数据库表定义代码、用户定义类型代码、函数定义代码、存储过程定义代码。


3.根据权利要求1所述的将Transact-SQL程序转换为Java程序的方法,其特征在于,所述的遍历类型定义代码,获取全局类型信息,包括如下步骤:
构建T-SQL类型定义代码的抽象语法树AST;
遍历抽象语法树,访问特定节点类型,提取全局类型信息。


4.根据权利要求1所述的将Transact-SQL程序转换为Java程序的方法,其特征在于,所述的遍历业务逻辑代码,获取签名信息以及依赖关系,包括如下步骤:
构建T-SQL业务逻辑代码的抽象语法树;
遍历抽象语法树,访问特定节点类型,提取签名信息以及依赖信息;
所述的签名信息包括函数名称/存储过程名称、输入参数的信息和返回值的信息,输入参数的数量和返回值的数量都是不限的;输入参数的信息包括名称、类型、顺序、默认值;返回值的信息包括名称、类型、顺序;每个输入参数或返回值的类型是内置类型、数据库表和自定义类型中的任意一种具体类型;
所述的依赖信息主要体现在业务逻辑代码之间的调用关系。


5.根据权利要求4所述的将Transact-SQL程序转换为Java程序的方法,其特征在于,所述的业务逻辑代码的转换顺序主要考虑依赖关系,被依赖方要在依赖方之前进行转换,并基于依赖关系,通过拓扑排序确定转换顺序。


6.根据权利要求5所述的将Transact-SQL程序转换为Java程序的方法,其特征在于,完成转换后,每个T-SQL自定义函数/存储过程都转换为独立的Java类,自定义函数/存储过程中的可执行代码转换为Java类中的一个静态方法的方法体。


7.根据权利要求4所述的将Transact-SQL程序转换为Java程序的方法,其特征在于,转换过程包括方法签名生成和方法体生成两部分,所述的方法签名基于提取的签名信息来生成,包括方法名、输入参数名称、输入参数类型和返回值类型;方法体的生成包括如下步骤:
基于T-SQL业务逻辑代码构建抽象语法树;
遍历T-SQL抽象语法树,根据节点类型及其相邻节点类型,按照T-SQL语法的转换规则转换为Java抽象语法树;
根据Java抽象语法树生成Java业务逻辑代码。


8.根据权利要求7所述的将Transact-SQL程序转换为Java程序的方法,其...

【专利技术属性】
技术研发人员:尹建伟智晨邓水光李莹
申请(专利权)人:浙江大学
类型:发明
国别省市:浙江;33

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1