【发布时间】:2018-02-16 10:36:01
【问题描述】:
我尝试通过 Liquibase 运行 MySQL 存储过程 SQL 脚本,但没有成功。
db.storedprocedure.xml的内容:
<changeSet author="zzz" id="1" runOnChange="true" runInTransaction="true">
<sqlFile path="changelogs/change_03.sql"
relativeToChangelogFile="true"
endDelimiter="$$"
stripComments="false"
splitStatements="false"/>
</changeSet>
我的SQL文件change_03.sql的内容:
$$
CREATE PROCEDURE `liqui01`.`User_Search`(
INOUT id INT,
OUT name VARCHAR(50)
)
BEGIN
SET @sql = CONCAT("SELECT id, name FROM user WHERE da.MarketId = ", id );
PREPARE stmt from @sql;
EXECUTE stmt;
END$$
它显示如下错误:
运行 Liquibase 时出现意外错误:您的 SQL 中有错误 句法;检查与您的 MySQL 服务器版本相对应的手册 在 '$$ ...
附近使用正确的语法
我试过把“$$”改成其他的分隔符,或者把SQL放到XML文件的<sql>标签里面,都不行。
任何建议将不胜感激!
更新 1
@Shadow 给出了正确答案(很遗憾我无法将其标记为答案,因为它在 cmets 中),从 sql 脚本中删除分隔线将使其工作,谢谢他!
现在的问题是:如何使用“endDelimiter”参数?
【问题讨论】:
-
为什么在存储过程的开头有一个 $$?这不是必需的。另请注意,此查询不需要准备好的语句(这与您收到的错误消息无关)
-
@Shadow 嗨,伙计,你节省了我的时间!仍然想知道为什么“endDelimiter”不起作用,以及为什么他们提供这样的参数......我从其他存储过程中复制了脚本,并删除了一些其他部分,只是为了测试 liquibase,但忘记删除“prepare stmt”部分: )
标签: mysql sql stored-procedures syntax liquibase