当前位置: 首页 > 知识库问答 >
问题:

从Java/SQL文件中提取SQL语句

欧阳斌
2023-03-14

我有一个庞大的代码库,其中包含大量JAVA和。sql文件。我打算从所有这些文件中提取所有SQL语句。

这是我打算实现这一目标的方式-

  1. 构建一个正则表达式文件,其中包含我打算提取的选择、插入、删除、更新等模式。
  2. 在代码库中逐行解析文件并与Regex匹配。如果找到匹配,则注册代码行、文件名、模式等。

当SQL查询被分成多行时,就会出现问题。

我正在使用java。util。正则表达式。Matcher和java。util。正则表达式。模式方法,用于在使用缓冲读取器读取行时构建/匹配正则表达式模式。

  pattern = Pattern.compile(regexString,Pattern.CASE_INSENSITIVE);
  .
  .
  matcher = pattern.matcher(lineBuffer.readline().trim());
  if( matcher.find()){
    //Do something
  }

对于多行语句,我应该查找行终止符“;”-如果找不到,我可以读取下一行并将输出附加到匹配的字符串中,以便将其理解为单个查询。

 while(!lineString.endsWith(";")) {
   lineString = lineString + lineBfr.readLine().trim();
 }

有没有更好的方法来解决这里的要求使用模式。MULTILINE或使用StreamBuffers,我将整个文件读入单个缓冲区并进一步处理?

共有3个答案

宰父疏珂
2023-03-14

对于Java文件,或者更准确地说,对于已编译的Java类,我正在尝试类似的方法,但我正在使用Java反编译器javap-verbose来搜索以select开头的字符串(键入Utf8),或者以其他方式显示为SQL语句的字符串。

这是一个半成品,我正在自己摸索,所以我不能发布一个完整的解决方案,但这应该足以建立基础。

宗政燕七
2023-03-14

除非您的文件只包含一致可预测格式的SQL语句,否则我认为使用regex解析SQL语句将变得极其复杂。

表面上看起来可能相当简单,但有很多特殊情况需要处理。

  • 如何正确处理评论
  • 字符串中包含的单词SELECT或分号如何
  • 字符串转义字符呢

等等如果你不能处理好所有这些,你甚至无法做像获取所有语句这样简单的事情。

更好的方法是使用现有库为您解析SQL。在这个问题中,似乎有几个很好的Java选项:SQL parser library for Java

秦昂然
2023-03-14

您可以利用Apache Commons及其出色的方法FileUtils#readFileToString(File file)。
这与模式相结合。您提到的MULTILINE似乎是一个潜在的非常简单的解决方案。

 类似资料:
  • 本文向大家介绍SQL Server 提取数字、提取英文、提取中文的sql语句,包括了SQL Server 提取数字、提取英文、提取中文的sql语句的使用技巧和注意事项,需要的朋友参考一下

  • 问题内容: 我正在使用ADFA- LD数据集进行基于主机的入侵检测项目,现在正在进行特征提取模块。我构建了由长度为4的系统调用短语组成的短语词典。现在,为了进行特征提取,我需要将这些短语与新的系统调用轨迹进行比较(以下是一些示例): 。 我需要的是,如何将这些短语与新痕迹进行比较。我在用Java做。 我的短语字典: sys_socketcall-sys_poll-sys_clock_gettime

  • 问题内容: 我有一些存储在文本文件中的SQL语句。如何将这些文件提取到SSIS中的字符串变量中,以便可以在多个地方使用同一查询? 回答问题: 查询是漫长而复杂的,我希望在真实的文本编辑器中而不是在SSIS文本框中进行编辑。我还希望那些无法访问SSIS或不知道如何使用它的人可以编辑查询。最后,每个查询都在许多不同的数据流中使用。如果我错了,请纠正我,但是如果我在多个地方使用相同的查询,我相信我必须使

  • 问题内容: 我试图从SQL中提取数据,然后将其写入文本文件。这在一定程度上做到了这一点, 但它仅从读取文本文件 的表中拉出1 。 我希望能够从表中提取所有数据,然后以诸如此类的列表格式发布到文本文件中… 我需要找出我做错了什么。 问题答案: 该函数将覆盖整个文件- 这就是为什么每次都只获得最后一条记录的原因。 您可以使用和代替。 尽管比构造一个大字符串并使用单个调用稍微复杂一些,但是如果您有很多记

  • “提取 SQL”让你从备份文件中提取 SQL 到一个 SQL 文件。 提取数据库或模式中的一个备份文件 打开一个数据库或模式。 点击“备份”并选择一个现有的备份文件。 在对象工具栏点击“提取 SQL”。 选择提取 SQL 选项并点击“提取”。 为 SQL 文件选择一个路径。 提取任意位置的备份文件 打开你的任何一个数据库或模式。 点击“备份”。 右击对象选项卡的任意位置并选择“提取 SQL 从”。

  • “提取 SQL”让你从备份文件中提取 SQL 到一个 SQL 文件。 提取数据库或模式中的一个备份文件 打开一个数据库或模式。 点击“备份”并选择一个现有的备份文件。 在对象工具栏点击 。 选择提取 SQL 选项并点击“开始”。 为 SQL 文件选择一个路径。 提取任意位置的备份文件 打开你的任何一个数据库或模式。 点击“备份”。 按住 Control 键并点按对象选项卡的任意位置,然后选择“提取