我正在尝试使用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命令提示符下成功执行。你有什么建议可以解决这个问题吗?
答案 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 $$