Java 如何在JdbcTemplate中创建mySQL存储过程 背景

Java 如何在JdbcTemplate中创建mySQL存储过程 背景,java,mysql,spring,jdbc,jdbctemplate,Java,Mysql,Spring,Jdbc,Jdbctemplate,为了解决MySql中某些语句只允许在存储过程中使用的问题,我尝试在JdbcTemplate提交的sql中创建、运行然后删除存储过程。一个简单的例子是(这恰好在spring boot中): migrateScript.sql在哪里 DELIMITER // CREATE PROCEDURE migrate() BEGIN IF ((SELECT count(1) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_na

为了解决MySql中某些语句只允许在存储过程中使用的问题,我尝试在JdbcTemplate提交的sql中创建、运行然后删除存储过程。一个简单的例子是(这恰好在spring boot中):

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()
据我所知,这是因为那些
分隔符
语句,但按照链接中的建议删除它们会导致其他语法错误

问题: JdbcTemplate如何创建mySQL存储过程(或者通常只允许在存储过程中执行语句)

笔记 没有deliminator语句的错误是

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

驱动程序似乎没有将带分隔符的查询纳入帐户。如果您想使用jdbc动态创建存储过程。 使用以下属性并将其作为URL中的连接参数传递

jdbc:mysql://localhost:3306/test?allowMultiQueries=true
上述属性将允许“;”分隔查询。 你可以在这里找到更多关于这个的信息

在本例中,更新的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;

您能检查一下这篇文章吗。似乎驱动程序没有考虑带分隔符的查询。@user06062019太棒了!这是可行的(更改连接字符串,删除分隔符行,将//替换为;)。你想写一个答案,我会接受吗?如果不是,我将自行回答此问题。在应用程序部署期间,应将存储过程部署到服务器。应用程序应该只调用它们。@PeterHe这不是一个真正的存储过程。真正的用例是“使用IF”,但这似乎只能在mySql中的存储过程中实现
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;