2012-02-20 84 views
3

我想通過使用jdbc安裝我的web項目時執行.sql文件。從google推薦的2個選項:手動解析腳本(通過分割「;」字符)或使用ant。我更喜歡簡單的方式,所以螞蟻是一個不錯的選擇。這是我用它來建立數據庫的代碼:無法從.sql文件創建存儲過程 - JDBC

public void executeSql(String sqlFilePath) { 
     final class SqlExecuter extends SQLExec { 
      public SqlExecuter() { 
       Project project = new Project(); 
       project.init(); 
       setProject(project); 
       setTaskType("sql"); 
       setTaskName("SQL Init"); 
      } 
     } 

     SqlExecuter executer = new SqlExecuter(); 
     executer.setSrc(new File(sqlFilePath)); 
     executer.setDriver("com.mysql.jdbc.Driver") ; 
     executer.setPassword("123456"); 
     executer.setUserid("root"); 
     executer.setUrl("jdbc:mysql://localhost:3306/abc"); 
     executer.execute(); 
    } 

代碼工作正常,直到它符合創建過程

DELIMITER // 
CREATE PROCEDURE LOG (IN period INT) 
BEGIN 
    INSERT INTO log_archive 
     SELECT * FROM ablog 
      WHERE log_date < DATE_SUB(CURRENT_DATE(), INTERVAL period DAY); 
    DELETE FROM ablog 
     WHERE log_date < DATE_SUB(CURRENT_DATE(), INTERVAL period DAY); 
END// 
DELIMITER ; 

的一部分,並給這個錯誤:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER // CREATE PROCEDURE LOG(IN period INT) BEGIN INSERT INTO log_archi' at line 1

如果我刪除存儲過程的一部分,那麼它將運行良好。 sql文件也是從mysql命令提示符下成功執行的。你有任何建議來解決這個問題嗎?

回答

1

考慮使用的工具,像liquibase。它支持mysql,但有一些小問題。

+0

我認爲這是從分離的文件中執行存儲過程的唯一方法。謝謝你鏈接 – 2012-02-21 02:08:50

+0

@bubuzz:不,任何人都可以根據SQL引擎加載一個sql,格式然後調用JDBC。 Liquibase做得更好:) – Jayan 2012-02-21 04:39:25

1

嘗試這種方式 http://forums.mysql.com/read.php?46,271411,271411

CREATE PROCEDURE LOG (period INT) 
BEGIN 
    INSERT INTO log_archive 
     SELECT * FROM ablog 
      WHERE log_date < CURRENT_DATE- INTERVAL period DAY; 
    DELETE FROM ablog 
     WHERE log_date < CURRENT_DATE - INTERVAL period DAY; 
END 

你可以把分隔符如果需要在它剛剛從命令行曾與delimiter //END//命令行 mysql>\. yoursqlfile.sql 運行它。


命令行:

delimiter // 
CREATE PROCEDURE LOG (period INT) 
BEGIN 
    INSERT INTO log_archive 
     SELECT * FROM ablog 
      WHERE log_date < CURRENT_DATE- INTERVAL period DAY; 
    DELETE FROM ablog 
     WHERE log_date < CURRENT_DATE - INTERVAL period DAY; 
END// 

希望它可以幫助升技

+0

是的,我也嘗試過它創造的問題後。我也收到了這個錯誤信息:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:你的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在第1行附近使用正確的語法。很明顯,當我創建一個包含它的字符串並使用executeUpdate時,沒有分隔符的代碼運行良好。 – 2012-02-20 15:53:28

+0

@bubuzzz你檢查了這個鏈接http ://docs.oracle.com/javase/tutorial/jdbc/basics/storedprocedures.html他們也有例子 – 2012-02-20 15:56:45

+0

感謝您的鏈接。我也試過了。也許這可能是它不工作的原因http://bugs.mysql.com/bug.php?id=58425。好吧,它會幫助一個人。仍然找不到解決方案,儘管 – 2012-02-20 16:01:36

1

如果您只使用一個分隔符(例如,\\或我使用$$)並且不更改中間腳本(否DELIMITER XX),那麼您可以運行相當複雜的腳本。

dbConnection = DriverManager.getConnection(connectionString, user, password); 
statement = dbConnection.createStatement(); 
for (String sqlpart : sqlFileContents.split("\\$\\$")) 
{ 
    if (!sqlpart.trim().isEmpty()) 
     statement.addBatch(sqlpart); 
} 
statement.executeBatch(); 

例如

DROP PROCEDURE IF EXISTS Log $$ 
CREATE PROCEDURE Log (period INT) 
BEGIN 
    INSERT INTO log_archive 
     SELECT * FROM ablog 
      WHERE log_date < CURRENT_DATE- INTERVAL period DAY; 
    DELETE FROM ablog 
     WHERE log_date < CURRENT_DATE - INTERVAL period DAY; 
END $$