通过Java运行SQL脚本文件
为了执行整个SQL脚本文件[其中包括create table语句和一些定义create table的规则]。我发现这个解决方案是为了实现它-->有一种很好的方法可以从Java执行SQL脚本,而无需自己阅读它们,只要您不介意在运行时依赖Ant即可。在我看来,在你的情况下,这种依赖是非常合理的。下面是示例代码,其中SQLExec类位于ant.jar中:通过Java运行SQL脚本文件,java,sql,Java,Sql,为了执行整个SQL脚本文件[其中包括create table语句和一些定义create table的规则]。我发现这个解决方案是为了实现它-->有一种很好的方法可以从Java执行SQL脚本,而无需自己阅读它们,只要您不介意在运行时依赖Ant即可。在我看来,在你的情况下,这种依赖是非常合理的。下面是示例代码,其中SQLExec类位于ant.jar中: private void executeSql(String sqlFilePath) { final class SqlExecuter
private void executeSql(String sqlFilePath) {
final class SqlExecuter extends SQLExec {
public SqlExecuter() {
Project project = new Project();
project.init();
setProject(project);
setTaskType("sql");
setTaskName("sql");
}
}
SqlExecuter executer = new SqlExecuter();
executer.setSrc(new File(sqlFilePath));
executer.setDriver(args.getDriver());
executer.setPassword(args.getPwd());
executer.setUserid(args.getUser());
executer.setUrl(args.getUrl());
executer.execute();
}
我不知道它是否会起作用
有人能给我们一些提示来解决上述问题吗?我的意思是如何让代码工作,也让我知道任何其他解决方案来执行SQL脚本文件
谢谢,
Mahesh这是我从互联网上偷来的一段代码片段,我不记得我知道在哪里工作得很好:它不会按下面的方式运行。它可能会给你足够的线索让你的工作,或者你可能会在谷歌的某个地方找到来源:
private void runScriptOnce(Connection conn, Reader reader) throws IOException, SQLException {
StringBuffer command = null;
try {
LineNumberReader lineReader = new LineNumberReader(reader);
String line = null;
while ((line = lineReader.readLine()) != null) {
if (command == null) {
command = new StringBuffer();
}
String trimmedLine = line.trim();
if (trimmedLine.startsWith("--")) {
println(trimmedLine);
} else if (trimmedLine.length() < 1
|| trimmedLine.startsWith("//")) {
// Do nothing
} else if (trimmedLine.length() < 1
|| trimmedLine.startsWith("--")) {
// Do nothing
} else if (!fullLineDelimiter
&& trimmedLine.endsWith(getDelimiter())
|| fullLineDelimiter
&& trimmedLine.equals(getDelimiter())) {
command.append(line.substring(0, line
.lastIndexOf(getDelimiter())));
command.append(" ");
Statement statement = conn.createStatement();
println(command);
boolean hasResults = false;
if (stopOnError) {
hasResults = statement.execute(command.toString());
} else {
try {
statement.execute(command.toString());
} catch (SQLException e) {
e.fillInStackTrace();
printlnError("Error executing: " + command);
printlnError(e);
}
}
if (autoCommit && !conn.getAutoCommit()) {
conn.commit();
}
ResultSet rs = statement.getResultSet();
if (hasResults && rs != null) {
ResultSetMetaData md = rs.getMetaData();
int cols = md.getColumnCount();
for (int i = 0; i < cols; i++) {
String name = md.getColumnLabel(i);
print(name + "\t");
}
println("");
while (rs.next()) {
for (int i = 0; i < cols; i++) {
String value = rs.getString(i);
print(value + "\t");
}
println("");
}
}
command = null;
try {
statement.close();
} catch (Exception e) {
// Ignore
}
Thread.yield();
} else {
command.append(line);
command.append(" ");
}
}
if (!autoCommit) {
conn.commit();
}
} catch (SQLException e) {
e.fillInStackTrace();
printlnError("Error executing: " + command);
printlnError(e);
throw e;
} catch (IOException e) {
e.fillInStackTrace();
printlnError("Error executing: " + command);
printlnError(e);
throw e;
} finally {
conn.rollback();
flush();
}
}
private String getDelimiter() {
return delimiter;
}
private void print(Object o) {
if (logWriter != null) {
System.out.print(o);
}
}
private void println(Object o) {
if (logWriter != null) {
logWriter.println(o);
}
}
private void printlnError(Object o) {
if (errorLogWriter != null) {
errorLogWriter.println(o);
}
}
private void flush() {
if (logWriter != null) {
logWriter.flush();
}
if (errorLogWriter != null) {
errorLogWriter.flush();
}
}
试试看?你的具体问题是什么?此外,你有没有尝试过向你提出的许多解决方案?尝试自己有什么错?为什么您希望其他人做您的工作?问题中提到的解决方案适用于包含insert、create table等语句的脚本。但是对于具有create或replace触发器的脚本,我认为带有PL/SQL块的脚本会因java.SQL.SQLSyntaxErrorException:ORA-00900:invalid SQL语句而失败。有人能帮忙解决这个问题吗?