如何使用Liquibase将存储过程导入MySQL?
我正在使用Gradle2.7、MySQL 5.5.46和Liquibase Gradle 1.1.1插件。我有一个包含存储过程的文件,看起来像如何使用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命令行
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 //