函数动态创建方法、装置及电子设备与流程

文档序号:18141648发布日期:2019-07-10 11:08阅读:152来源:国知局
函数动态创建方法、装置及电子设备与流程

本申请涉及数据库技术领域,具体而言,涉及一种函数动态创建方法、装置及电子设备。



背景技术:

在传统关系型数据库中,数据库自定义函数及存储过程具有很重要的作用,使用非常普遍,是数据库软件不可或缺的能力。传统数据库创建存储过程各个函数只能独立进行,如果存储过程需要调用一个自定义函数,则需要先创建这个函数并编译通过,才能使用。无法在存储过程的执行中进行动态创建自定义函数,在一定程度上限制了灵活性。



技术实现要素:

有鉴于此,本申请的目的在于,提供一种函数动态创建方法、装置及电子设备以改善上述问题。

本申请实施例提供一种函数动态创建方法,所述方法包括:

获取存储过程的sql语句,所述sql语句包括函数创建语句及存储过程创建语句;

对所述函数创建语句及所述存储过程创建语句进行解析,获得所述函数创建语句对应的第一java文件以及所述存储过程创建语句对应的第二java文件;

编译所述第一java文件生成第一可执行文件,并编译所述第二java文件生成第二可执行文件;

将所述第一可执行文件及所述第二可执行文件加载至内存中。

可选地,所述方法还包括:

将所述函数创建语句与所述第一可执行文件进行关联并保存,将所述存储过程创建语句与所述第二可执行文件进行关联并保存。

可选地,所述对所述函数创建语句及所述存储过程创建语句进行解析,获得所述函数创建语句对应的第一java文件以及所述存储过程创建语句对应的第二java文件的步骤,包括:

根据第一预设文法规则,利用文法解析工具对所述函数创建语句进行解析,获得所述函数创建语句对应的第一java文件;

基于第二预设文法规则,利用所述文法解析工具对所述存储过程创建语句进行解析,获得所述存储过程创建语句对应的第二java文件。

可选地,所述根据第一预设文法规则,利用文法解析工具对所述函数创建语句进行解析,获得所述函数创建语句对应的第一java文件的步骤,包括:

根据第一预设文法规则,利用文法解析工具对所述函数创建语句的语法进行解析,生成语法树,所述语法树包括多个节点;

读取所述语法树中包含的各个节点的节点信息,根据各个节点的节点信息获得所述语法树的属性信息;

根据所述属性信息将所述函数创建语句转换为第一java文件。

可选地,所述属性信息包括函数名称、参数列表及运算表达式,所述根据所述属性信息将所述函数创建语句转换为第一java文件的步骤,包括:

将所述函数名称转换为java类文件名称;

根据所述参数列表生成java类的代码模块;

将所述运算表达式转换为java类表达式;

将生成的所述代码模块及java类表达式写入至预先生成的java文件,并利用所述java类文件名称命名所述java文件,得到所述函数创建语句对应的第一java文件。

可选地,所述第一预设文法规则包括词法解析规则以及语法解析规则,所述根据第一预设文法规则,利用文法解析工具对所述函数创建语句的语法进行解析,生成语法树的步骤,包括:

利用所述词法解析规则及文法解析工具对所述函数创建语句进行词法解析,获得所述函数创建语句的词法解析结果;

基于所述语法解析规则及所述文法解析工具对所述词法解析结果进行解析,获得所述函数创建语句对应的语法树。

可选地,所述将所述第一可执行文件及所述第二可执行文件加载至内存中的步骤,包括:

获取所述第一可执行文件中的函数运行实例,将所述函数运行实例注册至内存中预先配置的函数支持列表中;

获取所述第二可执行文件中的存储过程运行实例,将所述存储过程运行实例注册至内存中预先配置的存储过程列表中。

本申请另一实施例提供一种函数动态创建装置,所述装置包括:

获取模块,用于获取存储过程的sql语句,所述sql语句包括函数创建语句及存储过程创建语句;

解析模块,用于对所述函数创建语句及所述存储过程创建语句进行解析,获得所述函数创建语句对应的第一java文件以及所述存储过程创建语句对应的第二java文件;

编译模块,用于编译所述第一java文件生成第一可执行文件,并编译所述第二java文件生成第二可执行文件;

加载模块,用于将所述第一可执行文件及所述第二可执行文件加载至内存中。

本申请另一实施例提供一种电子设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述程序时实现上述的方法。

本申请另一实施例提供一种可读存储介质,该可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述的方法。

本申请实施例提供的函数动态创建方法、装置及电子设备,在获取的存储过程的sql语句中包含函数创建语句及存储过程创建语句时,分别对函数创建语句及存储过程创建语句进行解析生成对应的第一java文件及第二java文件,再分别对其进行编译得到第一可执行文件和第二可执行文件,最后将第一可执行文件和第二可执行文件加载至内存中。如此,可在创建存储过程中动态创建自定义函数,便于后续存储过程对自定义函数的调用,并且基于java代码的通用性,java类的自定义函数及存储过程可支持跨平台的使用。

为使本申请的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。

附图说明

为了更清楚地说明本申请实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本申请的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。

图1为本申请实施例提供的电子设备的示意性结构框图。

图2为本申请实施例提供的函数动态创建方法的流程图。

图3为图2中步骤220包括的子步骤流程图。

图4为图2中步骤240包括的子步骤流程图。

图5为本申请实施例提供的函数动态创建装置的功能模块框图。

图标:10-电子设备;110-处理器;120-存储器;130-存储控制器;140-函数动态创建装置;141-获取模块;142-解析模块;143-编译模块;144-加载模块。

具体实施方式

下面将结合本申请实施例中附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本申请实施例的组件可以以各种不同的配置来布置和设计。

因此,以下对在附图中提供的本申请的实施例的详细描述并非旨在限制要求保护的本申请的范围,而是仅仅表示本申请的选定实施例。基于本申请的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。

应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。

请参照图1,是本申请较佳实施例提供的电子设备10的示意性结构框图。如图1所示,所述电子设备10包括函数动态创建装置140、存储器120、存储控制器130以及处理器110。这些组件通过一条或多条通信总线/信号线相互通信。

存储器120可以用于存储软件程序以及模块,如本申请实施例中的函数动态创建装置140中对应的程序指令/模块,处理器110通过运行存储在存储器120内的软件程序以及模块,从而执行各种功能应用以及数据处理,如本申请实施例提供的函数动态创建方法。

所述存储器120可以是,但不限于,随机存取存储器(randomaccessmemory,ram),只读存储器(readonlymemory,rom),可编程只读存储器(programmableread-onlymemory,prom),可擦除只读存储器(erasableprogrammableread-onlymemory,eprom),电可擦除只读存储器(electricerasableprogrammableread-onlymemory,eeprom)等。处理器110以及其他可能的组件对存储器120的访问可在存储控制器130的控制下进行。

所述处理器110可能是一种集成电路芯片,具有信号的处理能力。上述处理器110可以是通用处理器,包括中央处理器(centralprocessingunit,cpu)、网络处理器(networkprocessor,np)等;还可以是数字信号处理器(dsp)、专用集成电路(asic)、现成可编程门阵列(fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件,可以实现或者执行本申请实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器110也可以是任何常规的处理器等。

于本申请实施例中,所述电子设备10可以是服务器、个人电脑(personalcomputer,pc)、平板电脑等。

可以理解,图1所示的结构仅为示意,电子设备10还可包括比图1中所示更多或者更少的组件,或者具有与图1所示不同的配置。图1中所示的各组件可以采用硬件、软件或其组合实现。

结合图2,本申请实施例还提供一种可应用于上述电子设备10的函数动态创建方法。其中,所述方法有关的流程所定义的方法步骤可以由所述处理器110实现。下面将对图2所示的具体流程进行详细阐述。

步骤210,获取存储过程的sql语句,所述sql语句包括函数创建语句及存储过程创建语句。

步骤220,对所述函数创建语句及所述存储过程创建语句进行解析,获得所述函数创建语句对应的第一java文件以及所述存储过程创建语句对应的第二java文件。

本实施例中,接收用户输入至电子设备10中的存储过程的sql语句,其中,该sql语句中包含存储过程创建语句,此外,若需要在存储过程创建的同时进行自定义函数的创建时,则输入的sql语句还包含函数创建语句。其中,用户输入的sql语句可支持sql99标准语法。

一般来说,存储过程实现的功能要复杂一些,而自定义函数的实现功能针对性比较强。存储过程功能强大,可以执行包括修改表等一系列数据库操作,而自定义函数不能用于执行一组修改全局数据库状态的操作。并且对于存储过程来说,其可以返回参数,例如记录集。而自定义函数只能返回值或者是表对象。自定义函数只能返回一个变量,而存储过程可以返回多个变量,存储过程进行声明时不需要返回类型,而自定义函数声明时需要描述返回类型,且函数体中需要包含一个有效的return语句。

此外,在存储过程中可以使用非确定函数,而自定义函数中不允许内置非确定函数。此外,存储过程一般作为一个独立的部分来执行,而自定义函数可以作为查询语句的一个部分来调用。

本实施例中,分别对接收到的函数创建语句及存储过程创建语句进行解析,获得函数创建语句对应的第一java文件以及存储过程创建语句对应的第二java文件。可选地,预先可设置适用于自定义函数解析的第一预设文法规则,以及适用于存储过程的第二预设文法规则。请参阅图3,可通过以下步骤进行函数创建语句及存储过程创建语句的解析:

步骤221,根据第一预设文法规则,利用文法解析工具对所述函数创建语句进行解析,获得所述函数创建语句对应的第一java文件。

步骤222,基于第二预设文法规则,利用所述文法解析工具对所述存储过程创建语句进行解析,获得所述存储过程创建语句对应的第二java文件。

可选地,分别根据预先设置的第一预设文法规则和第二预设文法规则,利用文法解析工具对函数创建语句和存储过程创建语句进行解析,以分别得到对应的第一java文件和第二java文件。本实施例中,所述的文法解析工具可以是lex和yacc系的词法和语法解析工具,或者可以是基于flex和bison的语法解析工具。

在本实施例中,可根据第一预设文法规则,利用文法解析工具对函数创建语句的语法进行解析,生成语法树。其中,生成的语法树包括多个节点。可通过读取语法树包含的各个节点的节点信息,根据各个节点的节点信息获得所述语法树的属性信息。再根据得到的属性信息将函数创建语句转换为第一java文件。

同上述得到第一java文件的实现方式一致,针对存储过程创建语句时,可利用第二预设文法规则,利用文法解析工具对存储过程创建语句的语法进行解析,生成存储过程的语法树。再读取该语法树的各个节点的节点信息,根据得到的各个节点的节点信息获得该语法树的属性。最后,根据得到的属性信息将存储过程创建语句转换为第二java文件。

可选地,本实施例中,其中第一预设文法规则包括词法解析规则和语法解析规则,在利用第一预设文法规则对函数创建语句进行解析时,可通过以下过程实现:

利用所述词法解析规则及文法解析工具对函数创建语句进行词法解析,获得函数创建语句的词法解析结果。再基于语法解析规则及所述文法解析工具对词法解析结果进行解析,获得函数创建语句对应的语法树。

同理,第二预设文法规则同样包含词法解析规则和语法解析规则,同样地,先利用第二预设文法规则包含的词法解析规则及文法解析工具对存储过程创建语句进行词法解析,获得存储过程创建语句的词法解析结果。再基于第二预设文法规则包含的语法解析规则和文法解析工具对词法解析结果进行解析,获得存储过程创建语句对应的语法树。

在本实施例中,语法树的属性信息包括函数名称、参数列表及运算表达式,在根据属性信息将函数创建语句转换为第一java文件时,可通过以下过程实现:

由上述可知,语法树是根据函数创建语句所生成的,语法树的属性信息中的函数名称则为基于sql语句的函数创建语句的函数名称。可将所述函数名称转换为java类文件名称。根据语法树的属性信息中的参数列表生成java类的代码模块,即java类中的方法代码。将语法树的属性信息中的运算表达式转换为java类表达式。最后,将生成的所述代码模块及java类表达式写入至预先生成的对应于自定义函数的java文件中,并利用所述java类文件名称命名所述java文件,则得到函数创建语句对应的第一java文件。

同上述方式类似,在得到存储过程创建语句对应的语法树的基础上,获得该语法树的属性信息。同样的,存储过程创建语句对应的语法树的属性信息包含函数名称,该函数名称为基于sql语句的存储过程创建语句的函数名称。此外,语法树的属性信息还包括参数列表及运算表达式。可将存储过程创建语句的函数名称转换为java类文件名称。再根据参数列表生成java类的代码模块,将运算表达式转换为java类中的方法代码。最后,将生成的代码模块及java类表达式写入至预先建立的对应于存储过程的java文件中,并利用得到的java类文件名称命名该文件,得到存储过程创建语句对应的第二java文件。

步骤230,编译所述第一java文件生成第一可执行文件,并编译所述第二java文件生成第二可执行文件。

步骤240,将所述第一可执行文件及所述第二可执行文件加载至内存中。

本实施例中,为了便于后续快速、直接调用相应文件,可编译第一java文件和第二java文件得到第一可执行文件和第二可执行文件,并将第一可执行文件和第二可执行文件加载至内存中。如此,后续可直接进行调用。

可选地,请参阅图4,可通过以下方式将第一可执行文件和第二可执行文件加载至内存中:

步骤241,获取所述第一可执行文件中的函数运行实例,将所述函数运行实例注册至内存中预先配置的函数支持列表中。

步骤242,获取所述第二可执行文件中的存储过程运行实例,将所述存储过程运行实例注册至内存中预先配置的存储过程列表中。

本实施例中,电子设备10内部存储设备中预先建立并存储有函数支持列表及存储过程列表。在编译得到第一可执行文件后,可获取其中的函数运行实例,并将获得的函数运行实例添加至预先配置的函数支持列表中。同样地,可编译得到第二可执行文件后,获取其中的存储过程运行实例,并将存储过程运行实例添加至预先配置的存储过程列表中。

进一步地,为了代码的复用性以及后续对相应代码的快速修改,本实施例提供的函数动态创建方法还包括以下步骤:

将函数创建语句与所述第一可执行文件进行关联并保存,并且将存储过程创建语句与所述第二可执行文件进行关联并保存。如此,则建立函数创建语句与第一可执行文件之间的关联关系,后续需要对第一可执行文件进行修改时,可快速找到sql语句的数据源,有利于数据的修改操作。同样地,建立存储过程创建语句与第二可执行文件之间的关联关系,在需要对第二可执行文件进行修改时,可快速找到对应的存储过程的sql语句,实现修改操作。

本实施例中,在将函数创建语句与第一可执行文件关联后进行持久化保存,且将存储过程创建语句与第二可执行文件关联后进行持久化保存。其中,采用持久化保存的方式在当前程序退出后,其中的数据仍然能够保留下来,供程序再次运行时候使用。其中,持久化保存的具体方式可以是保存至文件中、数据库中或者是保存磁盘中。

本实施例提供的函数动态创建方案,实现了将函数创建及存储过程创建的sql语句转换为java代码,从而实现自定义函数及存储过程的代码类型的统一。且将转换后的java代码进行动态编译,将编译后的函数运行实例及存储过程运行实例注册至内存中,方便用户在大数据中使用存储过程且支持后续存储过程调用函数的能力。并且,由于java类对于不同系统较为通用,因此java类的自定义函数及存储过程支持跨平台的使用。

请参阅图5,本申请另一实施例还提供一种应用于上述电子设备10的函数动态创建装置140。该函数动态创建装置140包括获取模块141、解析模块142、编译模块143及加载模块144。

获取模块141,用于获取存储过程的sql语句,所述sql语句包括函数创建语句及存储过程创建语句。具体地,所述获取模块141可以用于执行图2中所示的步骤210,具体的操作方法可以参考步骤210的详细描述。

解析模块142,用于对所述函数创建语句及所述存储过程创建语句进行解析,获得所述函数创建语句对应的第一java文件以及所述存储过程创建语句对应的第二java文件。具体地,所述解析模块142可以用于执行图2中所示的步骤220,具体的操作方法可以参考步骤220的详细描述。

编译模块143,用于编译所述第一java文件生成第一可执行文件,并编译所述第二java文件生成第二可执行文件。具体地,所述编译模块143可以用于执行图2中所示的步骤230,具体的操作方法可以参考步骤230的详细描述。

加载模块144,用于将所述第一可执行文件及所述第二可执行文件加载至内存中。具体地,所述加载模块144可以用于执行图2中所示的步骤240,具体的操作方法可以参考步骤240的详细描述。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的装置的具体工作过程,可以参考前述方法中的对应过程,在此不再过多赘述。

本申请实施例还提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器110执行时可实现上述的函数动态创建方法。

综上所述,本申请实施例提供的函数动态创建方法、装置及电子设备10,在获取的存储过程的sql语句中包含函数创建语句及存储过程创建语句时,分别对函数创建语句及存储过程创建语句进行解析生成对应的第一java文件及第二java文件,再分别对其进行编译得到第一可执行文件和第二可执行文件,再将第一可执行文件和第二可执行文件加载至内存中。如此,可在创建存储过程中动态创建自定义函数,便于后续存储过程对自定义函数的调用,并且基于java代码的通用性,java类的自定义函数及存储过程可支持跨平台的使用。

在本申请所提供的实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本申请的实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。

需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

以上所述仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。

以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1