在Liquibase Oracle SQL语句上添加/作为结束分隔符

时间:2016-05-19 05:59:42

标签: liquibase

在使用Liquibase功能时,我扩展了liquibase.sqlgenerator.core.CreateIndexGenerator类来转换此命令

create index indexI on tableT(columnC)

这样的事情:

declare
  index_already_exists exception;
  pragma exception_init(index_already_exists, -955);
  --
begin
  execute immediate 'create index indexI on tableT(columnC)';
exception
  when index_already_exists then
    dbms_output.put_line('Warning: Index indexI already exists');
end;

使其成为幂等的并创建一些新的验证。

使用 mvn liquibase:update 时效果非常好。但是,当使用 mvn liquibase:updateSQL 生成SQL时,缺少final /(斜杠)。

查看Liquibase源代码我发现类 LoggingExecutor 曾经在方法 outputStatement

上拥有我需要的东西
} else if (database instanceof OracleDatabase) {
    output.write(StreamUtil.getLineSeparator());
    output.write("/");

我试图在结束后添加最终/(斜杠); if,但它变成这样:

end;
/;

这是无效的PLSQL代码

是否有另一种方法可以在SQL生成的代码上添加final /,或者将/设置为结束分隔符?

2 个答案:

答案 0 :(得分:0)

您可以改为覆盖CreateIndexChange.generateStatements()以返回带有SQL的RawSqlStatement,而不是扩展CreateIndexGenerator。这允许您更好地设置结束分隔符,并且可以使用LoggingExecutor更好地工作。

答案 1 :(得分:0)

我使用liquibase 3.4.2并自动识别结束分隔符。当我自动表示你不必在变更集的声明中使用属性endDelimiter。事实证明,在一些旧版本的liquibase中,在解析过程中引入了一个错误。 请检查http://www.liquibase.org/2015/06/liquibase-3-4-0-released.html 你会看到他们解决了问题https://liquibase.jira.com/browse/CORE-2227。此问题影响版本3.3.2。 所以我建议你使用更新版本或在变更集的声明中正确指定endDelimiter属性。

http://www.liquibase.org/documentation/changes/sql.html