我对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变量。
答案 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 article在general sql parser的帮助下向您展示如何执行此操作。