【发布时间】:2009-10-27 15:48:03
【问题描述】:
我对 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;
我尝试使用多个 BufferedReader 和/或使用 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 变量。
【问题讨论】:
-
你能贴出你尝试使用失败的代码吗?
-
这就像 200 行左右的可怕 Java。可以吗?
-
这可能有点多。只需显示您实际读取和连接数据的位置的 sn-ps
-
如果你有一个充满sql命令的文件,并且你需要一次处理一个,这是一个非常不同的问题。您可能需要澄清此文件中的命令以及您需要的解决方案的通用性。
-
我想我认为多行语句会更难理解,而 1 行语句会很容易...... SQL 文件可能包含带有 END 的触发器定义;和/,它也可能有简单的语句,就像上面一样。其中任何一个都可以在 1 行或多行。我不确定我是否可以严格执行给我的文件格式。我希望我能处理任何格式,但我想这是问题的症结所在......