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



我正试图在安装web项目期间使用jdbc执行一个.sql文件。谷歌建议的两个选项:手动解析脚本(通过拆分";"字符)或使用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语法有错误;在第1行的"DELIMITER//CREATE PROCEDURE LOG(IN period INT)BEGIN INSERT INTO LOG_archi"附近,请查看与MySQL服务器版本对应的手册,以获得要使用的正确语法

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

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

试试这种方法http://forums.mysql.com/read.php?46,271411271411

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

希望它能帮助abit

如果只使用一个分隔符(例如\或我使用了$$),并且不更改中间脚本(没有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 $$

最新更新