什么';在Java中解析多行SQL语句最简单的方法是什么?

什么';在Java中解析多行SQL语句最简单的方法是什么?,java,sql,oracle,jdbc,Java,Sql,Oracle,Jdbc,我对Java非常陌生,但我正在寻找可以接受多行SQL语句的Java代码,比如从平面文件中执行以下操作: CREATE OR REPLACE TRIGGER REQ.TR_INPT_STAY_DETAI_SQ_BI BEFORE INSERT ON REQ.INPT_STAY_DETAIL FOR EACH ROW BEGIN SELECT REQ.SQ_INPT_DETAIL.nextval INTO :new.INPT_STAY_DETAIL_PID from DUAL; END;

我对Java非常陌生,但我正在寻找可以接受多行SQL语句的Java代码,比如从平面文件中执行以下操作:

CREATE OR REPLACE TRIGGER REQ.TR_INPT_STAY_DETAI_SQ_BI
  BEFORE INSERT ON REQ.INPT_STAY_DETAIL
  FOR EACH ROW
BEGIN
  SELECT REQ.SQ_INPT_DETAIL.nextval INTO :new.INPT_STAY_DETAIL_PID from DUAL;
END;
并将这些多行语句转换为一行SQL语句,如下所示(可能包装在此显示中),作为单个JDBC语句对Oracle数据库执行:

CREATE OR REPLACE TRIGGER REQ.TR_INPT_STAY_DETAI_SQ_BI BEFORE INSERT ON REQ.INPT_STAY_DETAIL FOR EACH ROW BEGIN SELECT REQ.SQ_INPT_DETAIL.nextval INTO :new.INPT_STAY_DETAIL_PID from DUAL; END;
我曾尝试使用多个BufferedReader和/或使用mark()方法来实现这一点,但似乎无法实现

问题似乎在于长语句结尾和结尾的分号;声明

你对最简单的方法有什么想法


我认为我取得了一些进展,但如果同一个SQL输入文件也有更简单的SQL命令,例如:

DROP TABLE TABLE.NAME_HERE;
在我这里的第一个条件下,他们会失败:

if ( !thisLine.startsWith("END;") && !thisLine.equals("/") ) {
    sqlBuf.append(thisLine).append(" ");
    statementReady = false;
}
else if (thisLine.startsWith("END;")) {
    sqlBuf.append(thisLine).append(" ");
    statementReady = true;
}
else if (thisLine.equals("/")) {
    statementReady = true;
}
else { }

稍后在运行.execute之前,我会检查statemendReady变量。

一种方法可能是使用ANTLR。它有一个很好的例子,这肯定会帮助解决SQL语法中的许多关键问题。

一种方法可能是使用ANTLR。它有,这肯定会有助于处理SQL语法中的许多常见情况。

只要读入每一行,并使用StringBuilder附加它们,但是,不要附加任何有
结尾的行因为您的查询不需要它

如果文件中有,您也应该忽略
Go

然后你可以把StringBuilder变成一个字符串,你就拥有了它

只要记住在每行之间留一个空格

有关从文件中读取多行的详细信息,请参见:

重要的部分是:

StringBuilder buf = new StringBuilder();
while ((strLine = br.readLine()) != null)   {
       if (!strLine.startsWith("End"))
          buf.append(strLine).append(" ");
    }

只需读入每一行,并使用StringBuilder附加它们,但是,不要附加任何有
End的行因为您的查询不需要它

如果文件中有,您也应该忽略
Go

然后你可以把StringBuilder变成一个字符串,你就拥有了它

只要记住在每行之间留一个空格

有关从文件中读取多行的详细信息,请参见:

重要的部分是:

StringBuilder buf = new StringBuilder();
while ((strLine = br.readLine()) != null)   {
       if (!strLine.startsWith("End"))
          buf.append(strLine).append(" ");
    }

您是否可以通过对换行符进行搜索和替换并在语句末尾添加换行符来预处理该文件,这样就不会有那么多的换行符,那么您读取的每一行都将是一条sql语句

(像
sed
这样的Unix工具可以使这变得非常简单)


否则,James是对的(请先告诉我)。

您可以通过对换行符进行搜索和替换,并在语句末尾添加换行符来预处理文件,这样就不会有那么多的换行符,那么您读取的每一行都将是一条sql语句吗

(像
sed
这样的Unix工具可以使这变得非常简单)



否则,James是对的(请告诉我)。

Oracle SQL语句的语法相当复杂,使用这种字符串匹配算法无法从脚本文件轻松获取SQL语句或PLSQL存储过程。您需要的是一个能够正确解析整个SQL脚本的完整的SQL解析器,这里向您展示了如何借助。Oracle SQL语句的语法非常复杂,使用此字符串匹配算法无法从脚本文件轻松获取SQL语句或PLSQL存储过程。您需要的是一个能够正确解析整个SQL脚本的完整的SQL解析器,这里向您展示了如何在的帮助下完成此操作。

您可以发布您尝试使用但未成功的代码吗?大约有200行可怕的Java代码。可以吗?可能有点太多了。如果您有一个满是sql命令的文件,并且您需要一次处理一个命令,那么这是一个非常不同的问题。您可能希望澄清此文件中的命令以及您需要的解决方案的通用性。我想我认为多行语句将更难理解,而单行语句将更容易理解。。。SQL文件可能包含带有结尾的触发器定义;和/,它也可能有简单的语句,如上所述。它们中的任何一个可以在一行上,也可以在多行上。我不确定是否可以严格执行提供给我的文件格式。我希望我能处理任何格式,但我想这是问题的症结所在……你能发布你尝试使用但未成功的代码吗?这就像是200行左右可怕的Java代码。可以吗?可能有点太多了。如果您有一个满是sql命令的文件,并且您需要一次处理一个命令,那么这是一个非常不同的问题。您可能希望澄清此文件中的命令以及您需要的解决方案的通用性。我想我认为多行语句将更难理解,而单行语句将更容易理解。。。SQL文件可能包含带有结尾的触发器定义;和/,它也可能有简单的语句,如上所述。它们中的任何一个可以在一行上,也可以在多行上。我不确定是否可以严格执行提供给我的文件格式。我希望我能处理任何格式,但我想这是问题的症结所在…+1-rziegler72,我强烈推荐这种方法(我也准备这么做),因为它工作得很好,效率很高。由于您刚接触Java,请确保关闭所有写入程序或读取器。+1-这应该可以工作,但不要删除“END;”线路。如果有“开始”行,则需要该行。Oracle中的GO等效于一个带有单个“/”的行,如果它存在,则必须将其删除。谢谢大家,我将尝试类似的方法&看看我的结果。ANTLR在这一点上似乎有点超出我的想象。@Vincent-很明显,我不知道发送“结束;”这很重要。我在SQL Server上呆的时间太长了(因此“GO”)。我编辑了上面的问题以展示我的尝试,所以它越来越近了,但仍然没有被理解