Фон
Чтобы обойти проблему в 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()