2012-02-20 81 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 $$