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

时间:2009-10-27 15:48:04

标签: 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;

将这些多行语句转换为这样的一行SQL语句(可能包含在此显示中),作为针对Oracle数据库的单个JDBC语句执行:

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;

我尝试使用多个BufferedReaders,和/或使用mark()方法,但我似乎无法让它工作。

麻烦似乎是在长语句末尾和END结尾的分号;言。

您对最简单的方法有何想法?


我认为我取得了一些进展,但如果相同的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变量。

4 个答案:

答案 0 :(得分:3)

只需读入每一行,然后使用StringBuilder附加它们,但是,不要附加任何包含End;的行,因为您的查询不需要它。

如果文件有,则还应忽略Go

然后你可以把StringBuilder变成一个String,你就可以了。

请记住在每一行之间留一个空格。

有关从文件中读取多行的更多信息,请查看: http://www.roseindia.net/java/beginners/java-read-file-line-by-line.shtml

重要的部分是:

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

答案 1 :(得分:0)

一种方法可能是使用ANTLR。它有oracle SQL grammer,这肯定有助于解决围绕SQL语法的许多极端情况。

答案 2 :(得分:0)

你可以预先处理文件,这样你就没有那么多的换行符,只需要使用搜索并替换换行符并在语句末尾添加换行符,那么你读取的每一行都将是一个单独的sql声明?

(像sed这样的Unix工具可以让这很容易)

否则,詹姆斯是对的(只是打败了我)。

答案 3 :(得分:0)

Oracle SQL语句的语法相当复杂,您无法使用此字符串匹配算法轻松地从脚本文件中获取SQL语句或PLSQL存储过程。您需要的是一个完全正常运行的SQL Parser,它可以正确解析整个SQL脚本,an articlegeneral sql parser的帮助下向您展示如何执行此操作。