通过Java运行SQL脚本文件

通过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

为了执行整个SQL脚本文件[其中包括create table语句和一些定义create table的规则]。我发现这个解决方案是为了实现它-->有一种很好的方法可以从Java执行SQL脚本,而无需自己阅读它们,只要您不介意在运行时依赖Ant即可。在我看来,在你的情况下,这种依赖是非常合理的。下面是示例代码,其中SQLExec类位于ant.jar中:

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语句而失败。有人能帮忙解决这个问题吗?