liquibase数据初始化的时候,可以新建函数并且调用,但是mysql客户端会对分号 ; 进行执行操作,当你的函数中有DECLEAR时,后面带的分号会让你的sql报错
解决办法:
使用 delimiter 语句可以避免这个问题,delimiter可以自己设定结束符号,比如delimiter # 就是让mysql读取到 # 时才会执行,而不是默认的分号 ;
记得在使用完之后用delimiter ; 重置回来
但是在liquibase中无法直接使用delimiter,官网给出了具体的用法,如果我们是使用的hap框架里的liquibase的话,我们应该这么使用
changeSet(author: "lyh", id: "20171031-data-hmap-basic-init-4") {
sqlFile(path: MigrationHelper.getInstance().dataPath("hmap/core/db/data/"+dbType+"/tables/hmap-date0.sql"), encoding: "UTF-8",endDelimiter:"#")
}那么在sql中我们这么写:
CREATE PROCEDURE `getAllDate` ( ) BEGIN
DECLARE
count INT DEFAULT 0;
DECLARE
startDay DATE DEFAULT DATE( NOW( ) );
WHILE
count < 365 DO
INSERT INTO hms_date_table ( date, YEAR, MONTH, DAY, WEEK ) SELECT
startDay,
YEAR ( startDay ),
MONTH ( startDay ),
DAY ( startDay ),
WEEKOFYEAR( startDay )
FROM
DUAL
WHERE
NOT EXISTS ( SELECT date FROM hms_date_table WHERE date = startDay );
SET count = count + 1;
SET startDay = DATE_ADD( DATE( NOW( ) ), INTERVAL count DAY );
END WHILE;
END;#
call getAllDate();#就可以了。
参考文档:
mysql创建存储过程declare 变量时报错
liquibase-delimiter官方文档