【问题标题】:Running SQL script file through Java通过 Java 运行 SQL 脚本文件
【发布时间】:2011-04-28 07:12:35
【问题描述】:

为了执行整个 SQL 脚本文件[包括创建表语句和一些定义创建表的规则]。我找到了这个解决方案来实现它--->“只要你不介意对 Ant 有运行时依赖,就有一种从 Java 执行 SQL 脚本的好方法,而无需自己阅读它们。在我看来,这种依赖是在您的情况下非常合理。这是示例代码,其中 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 脚本文件的任何其他解决方案!!!

谢谢, 马赫什

【问题讨论】:

  • 试试看?你的具体问题是什么?
  • 此外,您是否尝试过针对stackoverflow.com/questions/5801838/…提出的许多解决方案?
  • 尝试自己有什么问题?你为什么期望别人做你的工作?
  • 问题中提到的解决方案 (stackoverflow.com/a/3055008/948268) 适用于具有insertcreate table 等语句的脚本。但是对于具有create or replace trigger(我认为是带有 PL/SQL 块的脚本)的脚本,它会因 java.sql.SQLSyntaxErrorException: ORA-00900: invalid SQL statement 而失败。有人可以帮忙解决这个问题吗?

标签: java sql


【解决方案1】:

这是我从互联网某处(我不记得在哪里)偷来的代码 sn-p,我知道它很好用:它不会按照下面的方式运行。它可能会为您提供足够的线索来让您的工作正常进行,或者您可能会在 Google 上的某个地方找到源代码:

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();
    }
}

【讨论】:

    猜你喜欢
    • 2012-05-31
    • 1970-01-01
    • 2021-06-04
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2013-01-04
    相关资源
    最近更新 更多