如何在 Liquibase 中执行多项操作?

时间:2021-04-23 10:29:36

标签: sql oracle liquibase oracle19c

说我有这个:

--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 中的 /
我怎样才能同时执行?

2 个答案:

答案 0 :(得分:0)

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

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

XKCD: Exploits of a Mom

如果您希望在一个命令中同时执行两个 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;
/

答案 1 :(得分:0)

您提供的 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.';
/

有关类似示例,请参阅上面的链接。

希望我答对了你的问题。

相关问题