SQL代码信息显示方法、装置、计算机装置及存储介质与流程

文档序号:19942787发布日期:2020-02-14 23:24阅读:190来源:国知局
SQL代码信息显示方法、装置、计算机装置及存储介质与流程

本发明涉及软件开发技术领域,具体涉及一种sql代码信息显示方法、装置、计算机装置及计算机存储介质。



背景技术:

在软件开发过程中,开发人员需要分析sql代码的执行过程。但由于sql代码中sql字段、sql字段所在的表较多,导致sql代码理解起来有一定难度。此外,sql参数、sql变量、sql游标在sql代码中的不同位置交替出现,增加了sql代码的理解难度。实际应用场景中,需要一个通过显示sql代码的相关信息帮助用户理解、分析sql代码的方法,以提升软件开发效率。



技术实现要素:

鉴于以上内容,有必要提出一种sql代码信息显示方法、装置、计算机装置及计算机存储介质,其可以显示sql代码的相关信息,方便用户理解sql代码的执行过程,提升软件开发效率。

本申请的第一方面提供一种sql代码信息显示方法,所述方法包括:

获取sql代码;

检测所述sql代码的语法、语义、入参方式是否正确;

若所述sql代码的语法、语义、入参方式正确,检测是否接收到从所述sql代码中指定目标代码的操作指令,若接收到所述操作指令,在所述sql代码中检索所述目标代码之前的第一预设关键字和所述目标代码之后的第二预设关键字;

根据所述第一预设关键字和所述第二预设关键字判断所述目标代码是否为sql字段、sql参数、sql变量或sql游标;

若所述目标代码为sql字段,则在所述sql代码对应的数据库中查询所述目标代码的sql字段信息,显示所述sql字段信息;

若所述目标代码为sql参数、sql变量或sql游标,则在所述sql代码中检索包含所述目标代码的sql代码行,显示所述sql代码行。

另一种可能的实现方式中,检测所述sql代码的语法是否正确包括:

对于所述sql代码中的每条sql语句,识别所述sql语句中所有的关键字;

将所述关键字按照出现顺序组合,得到所述sql语句的关键字组合;

判断所述关键字组合与按照sql语法规则定义的第一预设关键字组合是否匹配。

另一种可能的实现方式中,检测所述sql代码的语义是否正确包括:

根据所述数据库的配置信息连接所述数据库;

获取所述数据库中的数据库表或所述数据库表中的数据列;

判断所述sql代码中的sql字段是否包含在所述数据库表或所述数据列中。

另一种可能的实现方式中,检测所述sql代码的入参方式是否正确包括:

识别所述sql代码中的占位符;

判断所述sql代码中的占位符与所述sql代码对应的持久层框架对应的预设占位符是否一致。

另一种可能的实现方式中,所述检测所述sql代码的入参方式是否正确还包括:

若所述sql代码中的占位符与所述持久层框架对应的预设占位符一致,判断所述sql代码中的占位符的位置与所述持久层框架对应的预设占位符的位置是否一致。

另一种可能的实现方式中,所述根据所述第一预设关键字和所述第二预设关键字判断所述目标代码是否为sql字段、sql参数、sql变量或sql游标包括:

判断所述第一预设关键字与所述第二预设关键字的关键字组合是否与按照sql语法规则定义的第二预设关键字组合相匹配;

若所述第一预设关键字与所述第二预设关键字的关键字组合与所述第二预设关键字组合相匹配,则根据所述第一预设关键字与所述第二预设关键字的关键字组合的类型判断所述sql代码中所述目标代码是否为sql字段、sql参数、sql变量或sql游标;

若所述第一预设关键字与所述第二预设关键字的关键字组合与所述第二预设关键字组合不匹配,则根据所述第一预设关键字的类型判断所述sql代码中所述目标代码是否为sql字段、sql参数、sql变量或sql游标。

另一种可能的实现方式中,所述方法还包括:

若所述sql代码的语法正确,检测所述sql代码中是否包含预警关键字;

若所述sql代码中包含所述预警关键字,则进行报警。

本申请的第二方面提供一种sql代码信息显示装置,所述装置包括:

获取模块,用于获取sql代码;

检测模块,用于检测所述sql代码的语法、语义、入参方式是否正确;

检索模块,用于若所述sql代码的语法、语义、入参方式正确,检测是否接收到从所述sql代码中指定目标代码的操作指令,若接收到所述操作指令,在所述sql代码中检索所述目标代码之前的第一预设关键字和所述目标代码之后的第二预设关键字;

判断模块,用于根据所述第一预设关键字和所述第二预设关键字判断所述目标代码是否为sql字段、sql参数、sql变量或sql游标;

第一显示模块,用于若所述目标代码为sql字段,则在所述sql代码对应的数据库中查询所述目标代码的sql字段信息,显示所述sql字段信息;

第二显示模块,用于若所述目标代码为sql参数、sql变量或sql游标,则在所述sql代码中检索包含所述目标代码的sql代码行,显示所述sql代码行。

本申请的第三方面提供一种计算机装置,所述计算机装置包括处理器,所述处理器用于执行存储器中存储的计算机程序时实现所述sql代码信息显示方法。

本申请的第四方面提供一种计算机存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现所述sql代码信息显示方法。

本发明获取sql代码;检测所述sql代码的语法、语义、入参方式是否正确;若所述sql代码的语法、语义、入参方式正确,检测是否接收到从所述sql代码中指定目标代码的操作指令,若接收到所述操作指令,在所述sql代码中检索所述目标代码之前的第一预设关键字和所述目标代码之后的第二预设关键字;根据所述第一预设关键字和所述第二预设关键字判断所述目标代码是否为sql字段、sql参数、sql变量或sql游标;若所述目标代码为sql字段,则在所述sql代码对应的数据库中查询所述目标代码的sql字段信息,显示所述sql字段信息;若所述目标代码为sql参数、sql变量或sql游标,则在所述sql代码中检索包含所述目标代码的sql代码行,显示所述sql代码行。本发明可以显示sql代码的相关信息,方便用户理解sql代码的执行过程,提升软件开发效率。

附图说明

图1是本发明实施例提供的sql代码信息显示方法的流程图。

图2是本发明实施例提供的sql代码信息显示装置的结构图。

图3是本发明实施例提供的计算机装置的示意图。

具体实施方式

为了能够更清楚地理解本发明的上述目的、特征和优点,下面结合附图和具体实施例对本发明进行详细描述。需要说明的是,在不冲突的情况下,本申请的实施例及实施例中的特征可以相互组合。

在下面的描述中阐述了很多具体细节以便于充分理解本发明,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

除非另有定义,本文所使用的所有的技术和科学术语与属于本发明的技术领域的技术人员通常理解的含义相同。本文中在本发明的说明书中所使用的术语只是为了描述具体的实施例的目的,不是旨在于限制本发明。

优选地,本发明的sql代码信息显示方法应用在一个或者多个计算机装置中。所述计算机装置是一种能够按照事先设定或存储的指令,自动进行数值计算和/或信息处理的设备,其硬件包括但不限于微处理器、专用集成电路(applicationspecificintegratedcircuit,asic)、可编程门阵列(field-programmablegatearray,fpga)、数字处理器(digitalsignalprocessor,dsp)、嵌入式设备等。

所述计算机装置可以是桌上型计算机、笔记本、掌上电脑及云端服务器等计算设备。所述计算机装置可以与用户通过键盘、鼠标、遥控器、触摸板或声控设备等方式进行人机交互。

实施例一

图1是本发明实施例一提供的sql代码信息显示方法的流程图。所述sql代码信息显示方法应用于计算机装置,用于显示sql代码的相关信息,以方便用户理解sql代码的执行过程。

如图1所示,所述sql代码信息显示方法包括:

101,获取sql代码。

可以从计算机装置的存储器中获取预先存储的所述sql代码。或者,可以从网络中下载所述sql代码。或者,可以接收用户输入的所述sql代码。

在一具体实施例中,可以获取语音信息,将所述语音信息转换为所述sql代码。例如,可以通过麦克风采集用户输入的语音信息,对用户输入的语音信息进行识别,得到所述sql代码。可以采用各种语音识别技术,例如动态时间规整(dynamictimewarping,dtw)、隐马尔可夫模型(hiddenmarkovmodel,hmm)、矢量量化(vectorquantization,vq)、人工神经网络(artificialneuralnetwork,ann)等技术对所述语音信息进行识别。

可以在所述计算机装置的屏幕上显示所述sql代码。

所述sql代码包含多个sql代码行。

所述sql代码可以包括sql块、sql方法、sql存储过程。所述sql块、sql方法、sql存储过程可以包括sql字段、sql参数、sql变量、sql游标。

所述sql字段表示所述sql代码对应的数据库中的数据库表或所述数据库表中的数据列,可以根据所述sql字段从所述数据库中查询所述数据库表或数据列。所述sql代码对应的数据库就是所述sql代码操作/访问的数据库。

所述sql块、sql方法、sql存储过程通过对所述sql参数中的输入参数进行处理,得到所述sql参数中的输出参数。

所述sql游标是一种控制结构,用于指向并选择查询结果集中的数据行。可以使用sql游标以每次一行的方式来读取并处理查询结果集。

102,检测所述sql代码的语法、语义、入参方式是否正确。

检测所述sql代码的语法是否正确也就是检测所述sql代码的语法是否符合sql语法规则。

具体地,检测所述sql代码的语法是否正确包括:对于所述sql代码中的每条sql语句,识别所述sql语句中所有的关键字;将所述关键字按照出现顺序组合,得到所述sql语句的关键字组合;判断所述sql语句的关键字组合与按照sql语法规则定义的第一预设关键字组合是否匹配。若所述sql语句的关键字组合与所述第一预设关键字组合相匹配,则所述sql语句的语法正确;否则,若所述sql语句的关键字组合与所述第一预设关键字组合不匹配,则所述sql语句的语法不正确。若所述sql代码中的每条sql语句的语法正确,则所述sql代码的语法正确。否则,若sql代码中的任意一条sql语句的语法不正确,则所述sql代码的语法不正确。举例来说,所述sql代码为“selectloan.appl_no,loan.loan_no,loan.cust_idfroml_loan_masloan,l_loan_id_masloanidwhereloan.appl_no=loanid.appl_noandloan.appl_no=’000100119540’”,所述sql代码的关键字组合为“select-from-where”,与第一预设关键字组合“select-from-where”相匹配,因此所述sql语句的语法正确。

作为一种可选的实施方式,若检测到所述sql代码的语法正确,可以检测所述sql代码中是否包含预警关键字。若所述sql代码中包含所述预警关键字,则进行报警。所述预警关键字用于执行存在一定风险的数据库操作,检测所述sql代码中是否包含预警关键字并在检测到所述预警关键字时进行报警,可以提高数据库操作的安全性。举例来说,所述预警关键字可以包括“select*”、“drop”、“truncate”等。执行包含预警关键字“select*”的sql代码,可能会因为查询量过大导致内存被占用、系统运行缓慢;执行包含预警关键字“drop”的sql代码,会删除整个数据库表、视图、索引等。

可以根据实际需要设置不同预警等级的预警关键字。例如,设置高预警等级的预警关键字,例如包括“select*”、“drop”、“truncate”;设置中预警等级的预警关键字,例如包括“select*”、“drop”;设置低预警等级的预警关键字,例如包括“drop”。

检测所述sql代码的语义是否正确可以是根据所述sql代码对应的数据库检测所述sql代码的语义是否正确。

具体地,检测所述sql代码的语义是否正确包括:根据所述数据库的配置信息(例如数据库地址、数据库用户名、数据库密码)连接所述数据库;获取所述数据库中的数据库表或所述数据库表中的数据列;判断所述sql代码中的sql字段是否包含在所述数据库表或所述数据列中。若所述sql代码中的sql字段包含在所述数据库表或所述数据列中,则所述sql代码的语义正确。否则,若所述sql代码中的sql字段不包含在所述数据库表或所述数据列中,则所述sql代码的语义不正确。例如,sql代码“selectloan_masfroml_loan_maswhereloan_mas=’002’”中的sql字段为“loan_mas”,查询到数据库表l_loan_mas中不存在sql字段“loan_mas”,则所述sql代码的语义不正确。

检测所述sql代码的入参方式是否正确可以是根据所述sql代码对应的持久层框架检测所述sql代码的入参方式是否正确。

所述sql代码对应的持久层框架就是所述sql代码所在的持久层框架。

持久层框架是负责向(或者从)一个或者多个数据存储器中存储(或者获取)数据的一组类和组件。

所述持久层框架包括mybatis、hibernate或jdbc(javadatabaseconnectivity,java数据库连接)。sql代码对应的持久层框架不同,则sql代码的入参方式不同。

具体地,检测所述sql代码的入参方式是否正确:识别所述sql代码中的占位符;判断所述sql代码中的占位符与所述持久层框架对应的预设占位符是否一致。若所述sql代码中的占位符与所述持久层框架对应的预设占位符一致,则所述sql代码的入参方式正确;否则,若所述sql代码中的占位符与所述持久层框架对应的预设占位符不一致,则所述sql代码的入参方式不正确。

为了提高所述sql代码的入参方式判断的准确性,若所述sql代码中的占位符与所述持久层框架对应的预设占位符一致,可以进一步判断所述sql代码中的占位符的位置与所述持久层框架对应的预设占位符的位置是否一致。若所述sql代码中的占位符的位置与所述持久层框架对应的预设占位符的位置一致,则所述sql代码的入参方式正确。否则,若所述sql代码中的占位符的位置与所述持久层框架对应的预设占位符的位置不一致,则所述sql代码的入参方式不正确。

若所述持久层框架为jdbc,其对应的预设占位符为“?”,其对应的预设占位符的起始序号为1;若所述持久层框架为hibernate,其对应的预设占位符为“:value”或“?”,其对应的预设占位符的起始序号为0;若所述持久层框架为mybatis,其对应的预设占位符为“#{value}”,其对应的预设占位符的位置由所述sql代码的标签确定。

具体地,若所述sql代码对应的持久层框架为jdbc,则判断所述sql代码中的占位符是否为“?”;若所述sql代码中的占位符为“?”,则判断所述sql代码中的占位符的起始序号是否为1;若所述sql代码中的占位符的起始序号为1,则所述sql代码的入参方式不正确;否则,若所述sql代码中的占位符不为“?”,或者所述sql代码中的占位符的起始序号不为1,则所述sql代码的入参方式不正确。

若所述sql代码对应的持久层框架为hibernate,则判断所述sql代码中的占位符是否为“:value”或“?”;若所述sql代码中的占位符为“:value”或“?”,则判断所述sql代码中的占位符的起始序号是否为0;若所述sql代码中的占位符的起始序号为0,则所述sql代码的入参方式正确;否则,若所述sql代码中的占位符不为“:value”或“?”,或者所述sql代码中的占位符的起始序号不为0,则所述sql代码的入参方式不正确。

若所述sql代码对应的持久层框架为mybatis,则判断所述sql代码中的占位符是否为“#{value}”;若所述sql代码中的占位符为“#{value}””,则判断所述sql代码中的占位符的位置是否由所述sql代码的标签确定;若所述sql代码中的占位符的位置由所述sql代码的标签确定,则所述sql代码的入参方式正确;否则,若所述sql代码中的占位符不为“:value”或“?”,或者所述sql代码中的占位符的位置不是由所述sql代码的标签确定,则所述sql代码的入参方式不正确。

在一具体实施例中,若所述sql代码的语法、语义或入参方式不正确,则发出sql代码错误提示。

103,若所述sql代码的语法、语义、入参方式正确,检测是否接收到从所述sql代码中指定目标代码的操作指令,若接收到所述操作指令,在所述sql代码中检索所述目标代码之前的第一预设关键字和所述目标代码之后的第二预设关键字。

可以检测用户对所述sql代码的操作得到所述操作指令,根据所述操作指令得到所述目标代码。例如,当用户选中(例如点击)所述sql代码中的某个代码(例如某个关键字)时检测到所述操作指令,将该代码作为所述目标代码。可以理解,用户可以通过鼠标、数位笔、触摸屏/触摸板等定点设备发出所述操作指令。

所述第一预设关键字与所述第二预设关键字是预设关键字库中的关键字。

在本实施例中,在所述sql代码中检索所述目标代码之前的第一预设关键字和所述目标代码之后的第二预设关键字时,判断所述sql代码的声明部分是否包含所述目标代码。所述声明部分的作用是声明sql代码用到的变量、参数及游标,以及局部的存储过程和函数。若所述sql代码的声明部分包含所述目标代码,则从所述sql代码的声明部分检索所述目标代码之前的第一预设关键字和所述目标代码之后的第二预设关键字。否则,若所述sql代码的声明部分不包含所述目标代码,则从所述sql代码的非声明部分检索所述目标代码之前的第一预设关键字和所述目标代码之后的第二预设关键字。所述第一预设关键字是所述目标代码之前距离所述目标代码最近的所述预设关键字库中的关键字。所述第二预设关键字是所述目标代码之后距离所述目标代码最近的所述预设关键字库中的关键字。

所述预设关键字库可以包括“create”、“replace”、“function”、“procedure”、“in”、“out”、“declare”、“begin”、“cursor”、“if”、“then”、“else”、“for”、“case”、“when”、“exitwhen”、“while”、“goto”、“loop”、“endif”、“endloop”“end”“elseif”、“exception”、“select”、“from”、“where”、“insertinto”、“deletefrom”、“update”、“values”、“exception”等关键字。所述预设关键字库中的关键字可以作为sql代码中内容判断、sql代码中语句结构划分、sql代码中语句之间结构划分的依据。

104,根据所述第一预设关键字和所述第二预设关键字判断所述目标代码是否为sql字段、sql参数、sql变量或sql游标。

在本实施例中,可以判断所述第一预设关键字与所述第二预设关键字的关键字组合是否与按照sql语法规则定义的第二预设关键字组合相匹配;若所述第一预设关键字与所述第二预设关键字的关键字组合与第二预设关键字组合相匹配,则根据所述第一预设关键字与所述第二预设关键字的关键字组合的类型判断所述sql代码中所述目标代码是否为sql字段、sql参数、sql变量或sql游标。否则,若所述第一预设关键字与所述第二预设关键字的关键字组合与第二预设关键字组合不匹配,则根据所述第一预设关键字的类型判断所述sql代码中所述目标代码是否为sql字段、sql参数、sql变量或sql游标。所述关键字组合由所述第一预设关键字和所述第二预设关键字进行组合得到。例如,所述第一关键字为select,所述第二关键字为from,则所述关键字组合为select-from。若所述第一预设关键字与所述第二预设关键字组合中的第一个关键字一致且所述第二预设关键字与所述第二预设关键字组合中的第二个关键字一致,则所述第一预设关键字与所述第二预设关键字的关键字组合与第二预设关键字组合相匹配;若所述第一预设关键字与所述第二预设关键字组合中的第一个关键字不一致或所述第二预设关键字与所述第二预设关键字组合中的第二个关键字不一致,则所述第一预设关键字与所述第二预设关键字的关键字组合与第二预设关键字组合不匹配。

所述第一预设关键字或所述关键字组合的类型可以包括:sql字段关键字、sql参数关键字、sql变量关键字、sql游标关键字。

若所述第一预设关键字或所述关键字组合为sql字段关键字,则所述目标代码为sql字段。所述sql字段关键字可以包括“select”、“select-from”(select为第一预设关键字,from为第二预设关键字)、“from”、“from-where”(from为第一预设关键字,where为第二预设关键字)等。

若所述第一预设关键字或所述关键字组合为sql参数关键字,则所述目标代码为sql参数。所述sql参数关键字可以包括“function-in”(function为第一预设关键字,in为第二预设关键字)、“in-out”(in为第一预设关键字,out为第二预设关键字)等。

若所述第一预设关键字或所述关键字组合为sql变量关键字,则所述目标代码为sql变量。所述sql变量关键字可以包括“declare-int”(declare为第一预设关键字,int为第二预设关键字)、“declare-intger”(declare为第一预设关键字,intger为第二预设关键字)等。

若所述第一预设关键字或所述关键字组合为sql游标关键字,则所述目标代码为sql游标。所述sql游标关键字可以包括“cursor”、“cursor-is”(cursor为第一标预设识符,is为第二预设关键字)等。

105,若所述目标代码为sql字段,则在所述sql代码对应的数据库中查询所述目标代码的sql字段信息,显示所述sql字段信息。

若所述目标代码为sql字段,可以通过jdbc技术从所述数据库中查询所述目标代码的sql字段信息。可以通过html(hypertextmarkuplanguage,超文本标记语言)或swing工具显示所述sql字段信息。在一具体实施例中,可以获取所述目标代码的显示位置,根据所述目标代码的显示位置显示所述sql字段信息(例如,在所述目标代码的显示位置的上方显示所述sql字段信息)。

所述sql字段信息包括sql字段所在的数据表、sql字段类型、sql字段描述。

在一具体实施例中,所述目标代码是“n.appl_no”,所述sql字段信息为“appl_no:表1_loan_mas字段类型:varchar(36)描述:申请号”,其中“l_loan_mas”为所述sql字段所在的数据表,“varchar(36)”为sql字段类型、“申请号”为sql字段描述。

显示所述sql字段信息可以方便用户了解所述目标代码(sql字段)的具体信息,提升软件开发效率。

106,若所述目标代码为sql参数、sql变量或sql游标,则在所述sql代码中检索包含所述目标代码的sql代码行,显示所述sql代码行。

可以在所述sql代码的全部代码中检索包含所述目标代码的sql代码行。或者,可以在所述sql代码的部分代码(如指定检索范围)中检索包含所述目标代码的sql代码行。所述sql代码行中的每个代码行都包含所述目标代码。

若所述目标代码为sql参数,则在所述sql代码中检索包含所述sql参数的sql代码行。在本实施例中,若所述目标代码为sql参数,则根据所述第二预设关键字确定所述sql参数的参数类型,并标注所述sql参数的参数类型(例如用不同的颜色标注)。所述参数类型包括输入参数和输出参数。例如,所述目标代码为sql参数“v_limit”,所述sql参数“v_limit”的参数类型为输入参数,检索到的包含所述sql参数“v_limit”的sql代码行为“selectid,namefromt_awhererownum>v_limit”。

若所述目标代码为sql变量,则在所述sql代码中检索包含所述sql变量的sql代码行。例如,所述目标代码为sql变量“v_count”,检索到的包含所述sql变量“v_count”的sql代码行为“v_countint”、“selectcount(*)intov_countfromt_b”、“v_count<=v_limit”。

若所述目标代码为sql游标,则在所述sql代码中检索包含所述sql游标的sql代码行。例如,所述目标代码为sql游标“t_a_cursor”,检索到的包含所述sql游标“t_a_cursor”的sql代码行为“cursort_a_cursorisselectid,namefromt_awhererownum>v_limit”、“forv_t_a_insertint_a_cursorloop”。

显示所有包含所述目标代码的sql代码行可以便于用户了解所述目标代码(sql参数、sql变量或sql游标)的处理逻辑,提升软件开发效率。

实施例一的sql代码信息显示方法获取sql代码;检测所述sql代码的语法、语义、入参方式是否正确;若所述sql代码的语法、语义、入参方式正确,检测是否接收到从所述sql代码中指定目标代码的操作指令,若接收到所述操作指令,在所述sql代码中检索所述目标代码之前的第一预设关键字和所述目标代码之后的第二预设关键字;根据所述第一预设关键字和所述第二预设关键字判断所述目标代码是否为sql字段、sql参数、sql变量或sql游标;若所述目标代码为sql字段,则在所述sql代码对应的数据库中查询所述目标代码的sql字段信息,显示所述sql字段信息;若所述目标代码为sql参数、sql变量或sql游标,则在所述sql代码中检索包含所述目标代码的sql代码行,显示所述sql代码行。实施例一的sql代码信息显示方法通过显示sql代码的相关信息,加快用户对sql代码执行过程的理解,提升软件开发效率。

实施例二

图2是本发明实施例二提供的sql代码信息显示装置的结构图。所述sql代码信息显示装置20应用于计算机装置。本装置的sql代码信息显示是显示sql代码的相关信息。所述sql代码信息显示装置20可以提升软件开发效率。如图2所示,所述sql代码信息显示装置20可以包括获取模块201、检测模块202、检索模块203、判断模块204、第一显示模块205、第二显示模块206。

获取模块201,用于获取sql代码。

可以从计算机装置的存储器中获取预先存储的所述sql代码。或者,可以从网络中下载所述sql代码。或者,可以接收用户输入的所述sql代码。

在一具体实施例中,可以获取语音信息,将所述语音信息转换为所述sql代码。例如,可以通过麦克风采集用户输入的语音信息,对用户输入的语音信息进行识别,得到所述sql代码。可以采用各种语音识别技术,例如动态时间规整(dynamictimewarping,dtw)、隐马尔可夫模型(hiddenmarkovmodel,hmm)、矢量量化(vectorquantization,vq)、人工神经网络(artificialneuralnetwork,ann)等技术对所述语音信息进行识别。

可以在所述计算机装置的屏幕上显示所述sql代码。

所述sql代码包含多个sql代码行。

所述sql代码可以包括sql块、sql方法、sql存储过程。所述sql块、sql方法、sql存储过程可以包括sql字段、sql参数、sql变量、sql游标。

所述sql字段表示所述sql代码对应的数据库中的数据库表或所述数据库表中的数据列,可以根据所述sql字段从所述数据库中查询所述数据库表或数据列。所述sql代码对应的数据库就是所述sql代码操作/访问的数据库。

所述sql块、sql方法、sql存储过程通过对所述sql参数中的输入参数进行处理,得到所述sql参数中的输出参数。

所述sql游标是一种控制结构,用于指向并选择查询结果集中的数据行。可以使用sql游标以每次一行的方式来读取并处理查询结果集。

检测模块202,用于检测所述sql代码的语法、语义、入参方式是否正确。

检测所述sql代码的语法是否正确也就是检测所述sql代码的语法是否符合sql语法规则。

具体地,检测所述sql代码的语法是否正确包括:对于所述sql代码中的每条sql语句,识别所述sql语句中所有的关键字;将所述关键字按照出现顺序组合,得到所述sql语句的关键字组合;判断所述sql语句的关键字组合与按照sql语法规则定义的第一预设关键字组合是否匹配。若所述sql语句的关键字组合与所述第一预设关键字组合相匹配,则所述sql语句的语法正确;否则,若所述sql语句的关键字组合与所述第一预设关键字组合不匹配,则所述sql语句的语法不正确。若所述sql代码中的每条sql语句的语法正确,则所述sql代码的语法正确。否则,若sql代码中的任意一条sql语句的语法不正确,则所述sql代码的语法不正确。举例来说,所述sql代码为“selectloan.appl_no,loan.loan_no,loan.cust_idfroml_loan_masloan,l_loan_id_masloanidwhereloan.appl_no=loanid.appl_noandloan.appl_no=’000100119540’”,所述sql代码的关键字组合为“select-from-where”,与第一预设关键字组合“select-from-where”相匹配,因此所述sql语句的语法正确。

作为一种可选的实施方式,若检测到所述sql代码的语法正确,可以检测所述sql代码中是否包含预警关键字。若所述sql代码中包含所述预警关键字,则进行报警。所述预警关键字用于执行存在一定风险的数据库操作,检测所述sql代码中是否包含预警关键字并在检测到所述预警关键字时进行报警,可以提高数据库操作的安全性。举例来说,所述预警关键字可以包括“select*”、“drop”、“truncate”等。执行包含预警关键字“select*”的sql代码,可能会因为查询量过大导致内存被占用、系统运行缓慢;执行包含预警关键字“drop”的sql代码,会删除整个数据库表、视图、索引等。

可以根据实际需要设置不同预警等级的预警关键字。例如,设置高预警等级的预警关键字,例如包括“select*”、“drop”、“truncate”;设置中预警等级的预警关键字,例如包括“select*”、“drop”;设置低预警等级的预警关键字,例如包括“drop”。

检测所述sql代码的语义是否正确可以是根据所述sql代码对应的数据库检测所述sql代码的语义是否正确。

具体地,检测所述sql代码的语义是否正确包括:根据所述数据库的配置信息(例如数据库地址、数据库用户名、数据库密码)连接所述数据库;获取所述数据库中的数据库表或所述数据库表中的数据列;判断所述sql代码中的sql字段是否包含在所述数据库表或所述数据列中。若所述sql代码中的sql字段包含在所述数据库表或所述数据列中,则所述sql代码的语义正确。否则,若所述sql代码中的sql字段不包含在所述数据库表或所述数据列中,则所述sql代码的语义不正确。例如,sql代码“selectloan_masfroml_loan_maswhereloan_mas=’002’”中的sql字段为“loan_mas”,查询到数据库表l_loan_mas中不存在sql字段“loan_mas”,则所述sql代码的语义不正确。

检测所述sql代码的入参方式是否正确可以是根据所述sql代码对应的持久层框架检测所述sql代码的入参方式是否正确。

所述sql代码对应的持久层框架就是所述sql代码所在的持久层框架。

持久层框架是负责向(或者从)一个或者多个数据存储器中存储(或者获取)数据的一组类和组件。

所述持久层框架包括mybatis、hibernate或jdbc(javadatabaseconnectivity,java数据库连接)。sql代码对应的持久层框架不同,则sql代码的入参方式不同。

具体地,检测所述sql代码的入参方式是否正确:识别所述sql代码中的占位符;判断所述sql代码中的占位符与所述持久层框架对应的预设占位符是否一致。若所述sql代码中的占位符与所述持久层框架对应的预设占位符一致,则所述sql代码的入参方式正确;否则,若所述sql代码中的占位符与所述持久层框架对应的预设占位符不一致,则所述sql代码的入参方式不正确。

为了提高所述sql代码的入参方式判断的准确性,若所述sql代码中的占位符与所述持久层框架对应的预设占位符一致,可以进一步判断所述sql代码中的占位符的位置与所述持久层框架对应的预设占位符的位置是否一致。若所述sql代码中的占位符的位置与所述持久层框架对应的预设占位符的位置一致,则所述sql代码的入参方式正确。否则,若所述sql代码中的占位符的位置与所述持久层框架对应的预设占位符的位置不一致,则所述sql代码的入参方式不正确。

若所述持久层框架为jdbc,其对应的预设占位符为“?”,其对应的预设占位符的起始序号为1;若所述持久层框架为hibernate,其对应的预设占位符为“:value”或“?”,其对应的预设占位符的起始序号为0;若所述持久层框架为mybatis,其对应的预设占位符为“#{value}”,其对应的预设占位符的位置由所述sql代码的标签确定。

具体地,若所述sql代码对应的持久层框架为jdbc,则判断所述sql代码中的占位符是否为“?”;若所述sql代码中的占位符为“?”,则判断所述sql代码中的占位符的起始序号是否为1;若所述sql代码中的占位符的起始序号为1,则所述sql代码的入参方式不正确;否则,若所述sql代码中的占位符不为“?”,或者所述sql代码中的占位符的起始序号不为1,则所述sql代码的入参方式不正确。

若所述sql代码对应的持久层框架为hibernate,则判断所述sql代码中的占位符是否为“:value”或“?”;若所述sql代码中的占位符为“:value”或“?”,则判断所述sql代码中的占位符的起始序号是否为0;若所述sql代码中的占位符的起始序号为0,则所述sql代码的入参方式正确;否则,若所述sql代码中的占位符不为“:value”或“?”,或者所述sql代码中的占位符的起始序号不为0,则所述sql代码的入参方式不正确。

若所述sql代码对应的持久层框架为mybatis,则判断所述sql代码中的占位符是否为“#{value}”;若所述sql代码中的占位符为“#{value}””,则判断所述sql代码中的占位符的位置是否由所述sql代码的标签确定;若所述sql代码中的占位符的位置由所述sql代码的标签确定,则所述sql代码的入参方式正确;否则,若所述sql代码中的占位符不为“:value”或“?”,或者所述sql代码中的占位符的位置不是由所述sql代码的标签确定,则所述sql代码的入参方式不正确。

在一具体实施例中,若所述sql代码的语法、语义或入参方式不正确,则发出sql代码错误提示。

检索模块203,用于若所述sql代码的语法、语义、入参方式正确,检测是否接收到从所述sql代码中指定目标代码的操作指令,若接收到所述操作指令,在所述sql代码中检索所述目标代码之前的第一预设关键字和所述目标代码之后的第二预设关键字。

可以检测用户对所述sql代码的操作得到所述操作指令,根据所述操作指令得到所述目标代码。例如,当用户选中(例如点击)所述sql代码中的某个代码(例如某个关键字)时检测到所述操作指令,将该代码作为所述目标代码。可以理解,用户可以通过鼠标、数位笔、触摸屏/触摸板等定点设备发出所述操作指令。

所述第一预设关键字与所述第二预设关键字是预设关键字库中的关键字。

在本实施例中,在所述sql代码中检索所述目标代码之前的第一预设关键字和所述目标代码之后的第二预设关键字时,判断所述sql代码的声明部分是否包含所述目标代码。所述声明部分的作用是声明sql代码用到的变量、参数及游标,以及局部的存储过程和函数。若所述sql代码的声明部分包含所述目标代码,则从所述sql代码的声明部分检索所述目标代码之前的第一预设关键字和所述目标代码之后的第二预设关键字。否则,若所述sql代码的声明部分不包含所述目标代码,则从所述sql代码的非声明部分检索所述目标代码之前的第一预设关键字和所述目标代码之后的第二预设关键字。所述第一预设关键字是所述目标代码之前距离所述目标代码最近的所述预设关键字库中的关键字。所述第二预设关键字是所述目标代码之后距离所述目标代码最近的所述预设关键字库中的关键字。

所述预设关键字库可以包括“create”、“replace”、“function”、“procedure”、“in”、“out”、“declare”、“begin”、“cursor”、“if”、“then”、“else”、“for”、“case”、“when”、“exitwhen”、“while”、“goto”、“loop”、“endif”、“endloop”“end”“elseif”、“exception”、“select”、“from”、“where”、“insertinto”、“deletefrom”、“update”、“values”、“exception”等关键字。所述预设关键字库中的关键字可以作为sql代码中内容判断、sql代码中语句结构划分、sql代码中语句之间结构划分的依据。

判断模块204,用于根据所述第一预设关键字和所述第二预设关键字判断所述目标代码是否为sql字段、sql参数、sql变量或sql游标。

在本实施例中,可以判断所述第一预设关键字与所述第二预设关键字的关键字组合是否与按照sql语法规则定义的第二预设关键字组合相匹配;若所述第一预设关键字与所述第二预设关键字的关键字组合与第二预设关键字组合相匹配,则根据所述第一预设关键字与所述第二预设关键字的关键字组合的类型判断所述sql代码中所述目标代码是否为sql字段、sql参数、sql变量或sql游标。否则,若所述第一预设关键字与所述第二预设关键字的关键字组合与第二预设关键字组合不匹配,则根据所述第一预设关键字的类型判断所述sql代码中所述目标代码是否为sql字段、sql参数、sql变量或sql游标。所述关键字组合由所述第一预设关键字和所述第二预设关键字进行组合得到。例如,所述第一关键字为select,所述第二关键字为from,则所述关键字组合为select-from。若所述第一预设关键字与所述第二预设关键字组合中的第一个关键字一致且所述第二预设关键字与所述第二预设关键字组合中的第二个关键字一致,则所述第一预设关键字与所述第二预设关键字的关键字组合与第二预设关键字组合相匹配;若所述第一预设关键字与所述第二预设关键字组合中的第一个关键字不一致或所述第二预设关键字与所述第二预设关键字组合中的第二个关键字不一致,则所述第一预设关键字与所述第二预设关键字的关键字组合与第二预设关键字组合不匹配。

所述第一预设关键字或所述关键字组合的类型可以包括:sql字段关键字、sql参数关键字、sql变量关键字、sql游标关键字。

若所述第一预设关键字或所述关键字组合为sql字段关键字,则所述目标代码为sql字段。所述sql字段关键字可以包括“select”、“select-from”(select为第一预设关键字,from为第二预设关键字)、“from”、“from-where”(from为第一预设关键字,where为第二预设关键字)等。

若所述第一预设关键字或所述关键字组合为sql参数关键字,则所述目标代码为sql参数。所述sql参数关键字可以包括“function-in”(function为第一预设关键字,in为第二预设关键字)、“in-out”(in为第一预设关键字,out为第二预设关键字)等。

若所述第一预设关键字或所述关键字组合为sql变量关键字,则所述目标代码为sql变量。所述sql变量关键字可以包括“declare-int”(declare为第一预设关键字,int为第二预设关键字)、“declare-intger”(declare为第一预设关键字,intger为第二预设关键字)等。

若所述第一预设关键字或所述关键字组合为sql游标关键字,则所述目标代码为sql游标。所述sql游标关键字可以包括“cursor”、“cursor-is”(cursor为第一标预设识符,is为第二预设关键字)等。

第一显示模块205,用于若所述目标代码为sql字段,则在所述sql代码对应的数据库中查询所述目标代码的sql字段信息,显示所述sql字段信息。

若所述目标代码为sql字段,可以通过jdbc技术从所述数据库中查询所述目标代码的sql字段信息。可以通过html(hypertextmarkuplanguage,超文本标记语言)或swing工具显示所述sql字段信息。在一具体实施例中,可以获取所述目标代码的显示位置,根据所述目标代码的显示位置显示所述sql字段信息(例如,在所述目标代码的显示位置的上方显示所述sql字段信息)。

所述sql字段信息包括sql字段所在的数据表、sql字段类型、sql字段描述。

在一具体实施例中,所述目标代码是“n.appl_no”,所述sql字段信息为“appl_no:表l_loan_mas字段类型:varchar(36)描述:申请号”,其中“l_loan_mas”为所述sql字段所在的数据表,“varchar(36)”为sql字段类型、“申请号”为sql字段描述。

显示所述sql字段信息可以方便用户了解所述目标代码(sql字段)的具体信息,提升软件开发效率。

第二显示模块206,用于若所述目标代码为sql参数、sql变量或sql游标,则在所述sql代码中检索包含所述目标代码的sql代码行,显示所述sql代码行。

可以在所述sql代码的全部代码中检索包含所述目标代码的sql代码行。或者,可以在所述sql代码的部分代码(如指定检索范围)中检索包含所述目标代码的sql代码行。所述sql代码行中的每个代码行都包含所述目标代码。

若所述目标代码为sql参数,则在所述sql代码中检索包含所述sql参数的sql代码行。在本实施例中,若所述目标代码为sql参数,则根据所述第二预设关键字确定所述sql参数的参数类型,并标注所述sql参数的参数类型(例如用不同的颜色标注)。所述参数类型包括输入参数和输出参数。例如,所述目标代码为sql参数“v_limit”,所述sql参数“v_limit”的参数类型为输入参数,检索到的包含所述sql参数“v_limit”的sql代码行为“selectid,namefromt_awhererownum>v_limit”。

若所述目标代码为sql变量,则在所述sql代码中检索包含所述sql变量的sql代码行。例如,所述目标代码为sql变量“v_count”,检索到的包含所述sql变量“v_count”的sql代码行为“v_countint”、“selectcount(*)intov_countfromt_b”、“v_count<=v_limit”。

若所述目标代码为sql游标,则在所述sql代码中检索包含所述sql游标的sql代码行。例如,所述目标代码为sql游标“t_a_cursor”,检索到的包含所述sql游标“t_a_cursor”的sql代码行为“cursort_a_cursorisselectid,namefromt_awhererownum>v_limit”、“forv_t_a_insertint_a_cursorloop”。

显示所有包含所述目标代码的sql代码行可以便于用户了解所述目标代码(sql参数、sql变量或sql游标)的处理逻辑,提升软件开发效率。

实施例二的sql代码信息显示装置20获取sql代码;检测所述sql代码的语法、语义、入参方式是否正确;若所述sql代码的语法、语义、入参方式正确,检测是否接收到从所述sql代码中指定目标代码的操作指令,若接收到所述操作指令,在所述sql代码中检索所述目标代码之前的第一预设关键字和所述目标代码之后的第二预设关键字;根据所述第一预设关键字和所述第二预设关键字判断所述目标代码是否为sql字段、sql参数、sql变量或sql游标;若所述目标代码为sql字段,则在所述sql代码对应的数据库中查询所述目标代码的sql字段信息,显示所述sql字段信息;若所述目标代码为sql参数、sql变量或sql游标,则在所述sql代码中检索包含所述目标代码的sql代码行,显示所述sql代码行。实施例二通过显示sql代码的相关信息,加快用户对sql代码执行过程的理解,提升软件开发效率。

实施例三

本实施例提供一种计算机存储介质,该计算机存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上述sql代码信息显示方法实施例中的步骤,例如图1所示的101-106:

101,获取sql代码;

102,检测所述sql代码的语法、语义、入参方式是否正确;

103,若所述sql代码的语法、语义、入参方式正确,检测是否接收到从所述sql代码中指定目标代码的操作指令,若接收到所述操作指令,在所述sql代码中检索所述目标代码之前的第一预设关键字和所述目标代码之后的第二预设关键字;

104,根据所述第一预设关键字和所述第二预设关键字判断所述目标代码是否为sql字段、sql参数、sql变量或sql游标;

105,若所述目标代码为sql字段,则在所述sql代码对应的数据库中查询所述目标代码的sql字段信息,显示所述sql字段信息;

106,若所述目标代码为sql参数、sql变量或sql游标,则在所述sql代码中检索包含所述目标代码的sql代码行,显示所述sql代码行。

或者,该计算机程序被处理器执行时实现上述装置实施例中各模块的功能,例如图2中的模块201-206:

获取模块201,用于获取sql代码;

检测模块202,用于检测所述sql代码的语法、语义、入参方式是否正确;

检索模块203,用于若所述sql代码的语法、语义、入参方式正确,检测是否接收到从所述sql代码中指定目标代码的操作指令,若接收到所述操作指令,在所述sql代码中检索所述目标代码之前的第一预设关键字和所述目标代码之后的第二预设关键字;

判断模块204,用于根据所述第一预设关键字和所述第二预设关键字判断所述目标代码是否为sql字段、sql参数、sql变量或sql游标;

第一显示模块205,用于若所述目标代码为sql字段,则在所述sql代码对应的数据库中查询所述目标代码的sql字段信息,显示所述sql字段信息;

第二显示模块206,用于若所述目标代码为sql参数、sql变量或sql游标,则在所述sql代码中检索包含所述目标代码的sql代码行,显示所述sql代码行。

实施例四

图3为本发明实施例四提供的计算机装置的示意图。所述计算机装置30包括存储器301、处理器302以及存储在所述存储器301中并可在所述处理器302上运行的计算机程序303,例如sql代码信息显示程序。所述处理器302执行所述计算机程序303时实现上述sql代码信息显示方法实施例中的步骤,例如图1所示的101-106。或者,该计算机程序被处理器执行时实现上述装置实施例中各模块的功能,例如图2中的模块201-206。

示例性的,所述计算机程序303可以被分割成一个或多个模块,所述一个或者多个模块被存储在所述存储器301中,并由所述处理器302执行,以完成本方法。所述一个或多个模块可以是能够完成特定功能的一系列计算机程序指令段,该指令段用于描述所述计算机程序303在所述计算机装置30中的执行过程。例如,所述计算机程序303可以被分割成图2中的获取模块201、检测模块202、检索模块203、判断模块204、第一显示模块205、第二显示模块206,各模块具体功能参见实施例二。

所述计算机装置30可以是桌上型计算机、笔记本、掌上电脑及云端服务器等计算设备。本领域技术人员可以理解,所述示意图3仅仅是计算机装置30的示例,并不构成对计算机装置30的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,例如所述计算机装置30还可以包括输入输出设备、网络接入设备、总线等。

所称处理器302可以是中央处理单元(centralprocessingunit,cpu),还可以是其他通用处理器、数字信号处理器(digitalsignalprocessor,dsp)、专用集成电路(applicationspecificintegratedcircuit,asic)、现场可编程门阵列(field-programmablegatearray,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器302也可以是任何常规的处理器等,所述处理器302是所述计算机装置30的控制中心,利用各种接口和线路连接整个计算机装置30的各个部分。

所述存储器301可用于存储所述计算机程序303,所述处理器302通过运行或执行存储在所述存储器301内的计算机程序或模块,以及调用存储在存储器301内的数据,实现所述计算机装置30的各种功能。所述存储器301可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序等;存储数据区可存储根据计算机装置30的使用所创建的数据。此外,存储器301可以包括非易失性存储器,例如硬盘、内存、插接式硬盘,智能存储卡(smartmediacard,smc),安全数字(securedigital,sd)卡,闪存卡(flashcard)、至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。

所述计算机装置30集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实现上述实施例方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一计算机存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。其中,所述计算机程序包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、u盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(rom,read-onlymemory)。

在本发明所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。

另外,在本发明各个实施例中的各功能模块可以集成在一个处理模块中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用硬件加软件功能模块的形式实现。

上述以软件功能模块的形式实现的集成的模块,可以存储在一个计算机可读取存储介质中。上述软件功能模块存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(processor)执行本发明各个实施例所述方法的部分步骤。

对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本发明内。不应将权利要求中的任何附关联图标记视为限制所涉及的权利要求。此外,显然“包括”一词不排除其他模块或步骤,单数不排除复数。系统权利要求中陈述的多个模块或装置也可以由一个模块或装置通过软件或者硬件来实现。第一,第二等词语用来表示名称,而并不表示任何特定的顺序。

最后应说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或等同替换,而不脱离本发明技术方案的精神和范围。

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