Как создать хранимую процедуру mySQL в JdbcTemplate - PullRequest
2 голосов
/ 11 июля 2019

Фон

Чтобы обойти проблему в MySql, что некоторые операторы разрешены только в хранимой процедуре, которую я пытаюсь создать, запустите, а затем отбросьте хранимую процедуру в sql, представленную JdbcTemplate.Примером упрощения может быть (это происходит при весенней загрузке):

@Service
public class StartupDatabaseCheck {
    private JdbcTemplate template;

    @Autowired
    public StartupDatabaseCheck(JdbcTemplate template){
        this.template = template;
    }

    @PostConstruct
    public void init() {
        log.info("Running custom fields table creation (if required)");
        try {
            String migrateSql = Resources.toString(Resources.getResource("migrateScript.sql"), Charsets.UTF_8);
            template.execute(migrateSql);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }
}

Где migrateScript.sql равен

DELIMITER //
CREATE PROCEDURE migrate()
BEGIN
    IF ((SELECT count(1)
         FROM INFORMATION_SCHEMA.COLUMNS
         WHERE table_name = 'custom_field_instance_data'
           and column_name='entity_id' and is_nullable = false) > 0)
    THEN
        alter table custom_field_instance_data MODIFY COLUMN entity_id char(32) null;
    END IF;
END //
DELIMITER ;

call migrate;

drop procedure migrate;

Выполнение этого в mySql workbench работает нормально, но отправленоJdbcTemplate Я получаю ошибку

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 'CREATE PROCEDURE migrate_custom_fields()

Насколько я понимаю, это потому, что эти DELIMITER операторы не разрешены JdbcTemplate , но простое их удаление, как предлагается в этой ссылке, приводит к другим синтаксическим ошибкам

Вопрос

Как JdbcTemplate

Notes

может создать хранимую процедуру mySQL (или операторы, обычно разрешенные только с хранимой процедурой) *1019* *1020* NotesОшибка без операторов-разделителей:

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 'CREATE PROCEDURE migrate_custom_fields()

1 Ответ

1 голос
/ 11 июля 2019

Похоже, что драйвер не принимает запросы с разделителями в учетную запись. Если вы хотите создать хранимую процедуру на лету, используя jdbc.Используя следующее свойство и передайте его в качестве параметра соединения в URL.

jdbc:mysql://localhost:3306/test?allowMultiQueries=true

Приведенное выше свойство разрешит ';'запросы с разделителями.Подробнее об этом можно прочитать здесь Создание хранимой процедуры MySQL с использованием JPA Hibernate

Обновленный файл migrateScript.sql в этом случае будет

drop procedure IF EXISTS migrate_custom_fields;

CREATE PROCEDURE migrate_custom_fields()
BEGIN
    IF ((SELECT count(1)
         FROM INFORMATION_SCHEMA.COLUMNS
         WHERE table_name = 'custom_field_instance_data'
           and column_name='entity_id' and is_nullable = false) > 0)
    THEN
        alter table custom_field_instance_data MODIFY COLUMN entity_id char(32) null;
    END IF;
END ;

call migrate_custom_fields;

drop procedure migrate_custom_fields;
...