无法从.sql文件 - JDBC创建存储过程

时间:2012-02-20 15:25:11

标签: java mysql stored-procedures ant jdbc

我正在尝试使用jdbc在安装我的Web项目期间执行.sql文件。谷歌提出的2个选项:手动解析脚本(通过拆分“;”字符)或使用ant。我更喜欢简单的方式,所以蚂蚁是个不错的选择。这是我用来设置数据库的代码:

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 ;

并提供此错误:

  

引起:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:SQL语法中有错误;检查与MySQL服务器版本对应的手册,以便在'DELIMITER // CREATE PROCEDURE LOG(IN期间INT)附近使用正确的语法,在第1行BEGIN INSERT INTO log_archi'

如果我删除存储过程部分,那么它将运行良好。 sql文件也可以从mysql命令提示符下成功执行。你有什么建议可以解决这个问题吗?

3 个答案:

答案 0 :(得分: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

如果需要在命令行中运行分隔符,可以使用分隔符 mysql>\. yoursqlfile.sql 它刚刚在命令行中使用delimiter //END//


命令行:

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//

希望它有助于升技

答案 1 :(得分:1)

考虑使用像liquibase这样的工具。它支持mysql,虽然有一些小问题。

答案 2 :(得分: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 $$