【问题标题】:Execute While in SQl Script in Java在 Java 中的 SQL 脚本中执行 While
【发布时间】:2013-11-04 13:00:41
【问题描述】:

我想执行下面的SQL Script,所以我使用了ibatis Script Runner

Connection "con = DriverManager.getConnection("jdbc:odbc:Database")" 

ScriptRunner sr = new ScriptRunner(con, true, false);
// Give the input file to Reader
Reader reader = new BufferedReader(new FileReader(aSQLScriptFilePath));
// Execute script
sr.runScript(reader);

但问题是,While 循环不会被完全执行。 我指出问题的出现是因为 Script Runner 没有等到 while 循环完全完成。所以只创建了 386 行而不是 1000 行。 我使用 Java 语句执行方法遇到了同样的问题(http://docs.oracle.com/javase/6/docs/api/java/sql/Statement.html):

 stmnt.execute("DECLARE @variable int = 1 WHILE (@variable<=1000) BEGIN INSERT INTO BatchTest2 SELECT @variable SET @variable=@variable+1 END" );

但是如果我设置了

Thread.sleep(5000);

在 stmnt.execute 后面,while 循环完全完成,我得到了 1000 行,就像我想要的那样。 所以我的问题是,是否可以使用 Thread.sleep 执行完整的 While 循环?

提前感谢您!

IF OBJECT_ID('test') IS NOT NULL
DROP TABLE test;

CREATE TABLE test(
spalte1 int PRIMARY KEY NOT NULL);

DECLARE @variable int = 1
WHILE (@variable<=1000)
BEGIN
INSERT INTO test
SELECT @variable
SET @variable=@variable+1
END 

【问题讨论】:

标签: java sql-server tsql sql-server-2012


【解决方案1】:

您可以参考MKYONG 的以下示例。希望这对您有所帮助。

    import java.io.BufferedReader;
import java.io.FileReader;
import java.io.Reader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

import com.ibatis.common.jdbc.ScriptRunner;

/**
 * 
 @author Dhinakaran Pragasam
 */
public class RunSqlScript {
    /**
     * @param args
     *            the command line arguments
     */
    public static void main(String[] args) throws ClassNotFoundException,
        SQLException {

        String aSQLScriptFilePath = "path/to/sql/script.sql";

        // Create MySql Connection
        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection(
            "jdbc:mysql://localhost:3306/database", "username", "password");
        Statement stmt = null;

        try {
            // Initialize object for ScripRunner
            ScriptRunner sr = new ScriptRunner(con, false, false);

            // Give the input file to Reader
            Reader reader = new BufferedReader(
                               new FileReader(aSQLScriptFilePath));

            // Exctute script
            sr.runScript(reader);

        } catch (Exception e) {
            System.err.println("Failed to Execute" + aSQLScriptFilePath
                    + " The error is " + e.getMessage());
        }
    }
}

【讨论】:

  • 它在我想要执行 while 循环的地方运行良好,就像我说我只得到约 300 行但 while 循环应该创建 1000 行。
【解决方案2】:

如果手头没有ScriptRunner,一个可能的解决方案可能是使用一个过程,然后在脚本中调用该过程。

Create Procedure insertData()
As
Begin
  DECLARE @variable int = 1
  WHILE (@variable<=1000)
  BEGIN
    INSERT INTO test
    SELECT @variable
    SET @variable=@variable+1
  END
End

IF OBJECT_ID('test') IS NOT NULL
  DROP TABLE test;

CREATE TABLE test(
  spalte1 int PRIMARY KEY NOT NULL);
EXEC insertData;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-05
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    相关资源
    最近更新 更多