Невозможно создать хранимую процедуру из файла .sql - JDBC - PullRequest
3 голосов
/ 20 февраля 2012

Я пытаюсь выполнить файл .sql во время установки моего веб-проекта с помощью jdbc.Google предлагает 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 period INT) BEGIN INSERT INTO log_archi» в строке 1

, если я удаляючасть хранимой процедуры, тогда она будет работать хорошо.Файл sql также успешно выполняется из командной строки mysql.У вас есть предложения по решению этой проблемы?

Ответы [ 3 ]

1 голос
/ 20 февраля 2012

Рассмотрите возможность использования такого инструмента, как liquibase . Он поддерживает mysql, хотя есть и небольшие проблемы.

1 голос
/ 19 июня 2015

Если вы используете только один разделитель (например, \\ или я использовал $$) и не меняете средний сценарий (нет 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 $$
1 голос
/ 20 февраля 2012

Попробуйте следующим образом 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//

надеюсь, что это поможет abit

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...