[Liquibase]delimiter设定sql分隔符

1,011 阅读1分钟

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官方文档