Cómo crear un procedimiento almacenado en una mySQL JdbcTemplate

Richard Tingle:

Antecedentes

Para evitar el problema en MySQL que ciertas declaraciones sólo se permiten dentro de un procedimiento almacenado que estoy tratando de crear, ejecutar, a continuación, colocar un procedimiento almacenado en SQL presentada por un JdbcTemplate. Un ejemplo sería simplied (esto pasa a ser dentro de arranque de primavera):

@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);
        }

    }
}

¿Dónde está 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;

La ejecución de este plazo de MySQL Workbench funciona bien, pero presentado por el JdbcTemplate me sale el error

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()

Como lo entiendo eso es porque esas DELIMITERdeclaraciones no están permitidas por JdbcTemplate pero sólo la eliminación de ellos como se sugiere en que enlace conduce a otros errores de sintaxis

Pregunta

¿Cómo se puede crear un procedimiento almacenado MySQL (o declaraciones por lo general sólo se permite con un procedimiento almacenado ser ejecutado) por un JdbcTemplate

notas

El error sin las declaraciones deliminator es

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()
user06062019:

Parece que el conductor no está tomando las consultas delimitados en el account.If desea crear un procedimiento almacenado en marcha utilizando el JDBC. Usando la siguiente propiedad y pasarlo como parámetro de conexión en la dirección URL.

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

La propiedad anterior permitirá ';' consultas delimitado. Puede encontrar más información sobre esto en aquí la creación de MySQL procedimiento almacenado usando Hibernate JPA

Los migrateScript.sql actualizados en este caso serían

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;

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=236758&siteId=1
Recomendado
Clasificación