【问题标题】:How can I have multiple things executed in Liquibase?如何在 Liquibase 中执行多项操作?
【发布时间】:2021-07-17 13:35:42
【问题描述】:

说我有这个:

--changeset asdf:1 runAlways:false runOnChange:false failOnError:true endDelimiter:"/"
declare
    XXXXX
begin
    DO SOMETHING
end;
/

comment on column my_table.my_col is 'My comment.';

这意味着它只会执行到 Liquibase 中的 /
如何同时执行?

【问题讨论】:

    标签: sql oracle liquibase oracle19c


    【解决方案1】:

    您提供的endDelimeter/

    这意味着它只会执行到 Liquibase 中的 /。

    是的,但这并不意味着它不会提前执行查询。它基本上表示 SQL 语句的结束。请看liquibase docs

    对于要执行的两个查询,您应该以/ 结束这两个查询,如下所示:

    --changeset asdf:1 runAlways:false runOnChange:false failOnError:true endDelimiter:"/"
    declare
        XXXXX
    begin
        DO SOMETHING
    end;
    /
    
    comment on column my_table.my_col is 'My comment.';
    /
    

    类似的例子请参考上面的链接。

    希望我没听错。

    【讨论】:

    • 我不太确定分号是否应该删除或保留。请尝试将它们固定到位,并在移除它们后尝试一次。其中之一肯定会起作用。主要问题是在第二次查询结束时缺少/
    【解决方案2】:

    Oracle 只允许在每个命令中执行一条语句。这有助于防止 SQL 注入。

    例如,此漫画不适用于 Oracle,因为该命令在找到第二条语句时会在 ; 处出错。

    如果您想让两个 Oracle 语句在一个命令中一起执行,那么您需要使用匿名 PL/SQL 块将它们包装到一个(复合)语句中(并将任何 DDL 语句放在 EXECUTE IMMEDIATE 语句中) :

    BEGIN
      declare
        XXXXX NUMBER;
      begin
        NULL; -- Do something
      end;
    
      EXECUTE IMMEDIATE 'comment on column my_table.my_col is ''My comment.''';
    END;
    /
    

    【讨论】:

      猜你喜欢
      • 2011-11-17
      • 1970-01-01
      • 2015-11-20
      • 1970-01-01
      • 1970-01-01
      • 2017-01-23
      • 2017-06-10
      • 2022-01-19
      • 2012-07-06
      相关资源
      最近更新 更多