如何使用Liquibase将存储过程导入MySQL?

如何使用Liquibase将存储过程导入MySQL?,mysql,stored-procedures,liquibase,changeset,Mysql,Stored Procedures,Liquibase,Changeset,我正在使用Gradle2.7、MySQL 5.5.46和Liquibase Gradle 1.1.1插件。我有一个包含存储过程的文件,看起来像 DELIMITER // DROP PROCEDURE IF EXISTS MyProc; CREATE PROCEDURE MyProc( IN param1 VARCHAR(25), IN param2 VARCHAR(5), OUT outParam VARCHAR(2500)) BEGIN … END // 我能够在MySQL命令行

我正在使用Gradle2.7、MySQL 5.5.46和Liquibase Gradle 1.1.1插件。我有一个包含存储过程的文件,看起来像

DELIMITER //

DROP PROCEDURE IF EXISTS MyProc;

CREATE PROCEDURE MyProc(
 IN param1 VARCHAR(25),
 IN param2 VARCHAR(5),
 OUT outParam VARCHAR(2500))

BEGIN
…
END //
我能够在MySQL命令行上很好地导入这个文件。然而,当我创建这个Liquibase变更集时

<changeSet id="create_my_stored_proc" author="davea">
    <sqlFile path="src/main/resources/scripts/my_stored_proc.sql" stripComments="true"/>
</changeSet>
我需要做什么来更正此错误

编辑:我删除了每个答案的“分隔符”行,使我的文件看起来像

DROP PROCEDURE IF EXISTS MyProd;

CREATE PROCEDURE MyProc(
 IN param1 VARCHAR(25), 
 IN param2 VARCHAR(5),
 OUT outParam VARCHAR(2500))

BEGIN
…
END //
然而,在运行变更集时,我得到了这个错误

Caused by: 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 MyProc(
 IN param1 VARCHAR(25), 
 IN param2 VAR' at line 3
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:400)
    at com.mysql.jdbc.Util.getInstance(Util.java:383)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:980)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3847)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3783)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2447)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2594)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2541)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2499)
    at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:844)
    at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:748)
    at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:314)
    ... 131 more

您必须在更改本身中指定分隔符,而不是在文件中指定分隔符。为此,请从sql文件中删除包含
分隔符的行,然后更改变更集,使其如下所示:

<changeSet id="create_my_stored_proc" author="davea">
    <sqlFile endDelimiter="//" path="src/main/resources/scripts/my_stored_proc.sql" stripComments="true" />
</changeSet>

对于LiquiBase创建过程,您需要使用xml创建过程,它将解决您的问题。还要编译它并检查是否没有错误

<changeSet id="create_my_stored_proc" author="davea">
<createProcedure path="src/main/resources/scripts/my_stored_proc.sql"/>
<sql>alter procedure MyProc compile;</sql>
<sql>call MyProc();</sql>
<changeSet id="create_my_stored_proc" author="davea">

修改程序MyProc编译;
调用MyProc();
线路

DROP PROCEDURE IF EXISTS MyProc;
编辑的文件生成错误,因为它以默认delimeter()结束,而delimeter已更改为/。您可以使用更改的delimeter/将此语句保存在sqlFile中,即:

DROP PROCEDURE IF EXISTS MyProc //

谢谢你的回复。根据您的建议,我删除了DELIMTER行,并适当地更新了变更集,但是我仍然得到一个错误(包括在我的问题中)。请注意,使用DELIMITER param,我可以通过MySQL命令行.K导入文件,删除“DROP PROCEDURE”行并允许正常运行。MySQL命令行允许的命令与通过JDBC驱动程序发送命令时允许的命令不同,而且,在哪里可以使用哪些命令并不总是很清楚。其他数据库也是如此。使用Oracle sqlplus命令行可以执行的操作与通过驱动程序运行普通SQL时允许执行的操作不同。
DROP PROCEDURE IF EXISTS MyProc //