plsql 适用于 Sql Developer,但不适用于 liquibase 更改 ORA-06550 PLS-00103

Cri*_*ian 3 oracle plsql liquibase

我有以下代码在 SQL Developer 中运行没有问题,但是当我放入 liquibase 更改并运行它时,出现错误。

DECLARE
  seqval NUMBER;
BEGIN
  SELECT MAX(id) + 1 INTO seqval FROM T_SLS_ITEMS;
  execute immediate('CREATE SEQUENCE SEQ_SLS_ITEMS MINVALUE '||seqval||'');
END;
Run Code Online (Sandbox Code Playgroud)

以及它的变更集:

     <changeSet author="Cristian Marian (cmarian)" id="2019-05-24-171101 Fix Items sequence - creting">
        <sql>
          DECLARE
            seqval NUMBER;
          BEGIN
            SELECT MAX(id) + 1 INTO seqval FROM T_SLS_ITEMS;
            execute immediate('CREATE SEQUENCE SEQ_SLS_ITEMS MINVALUE '||seqval||'');
          END;
        </sql>
    </changeSet>
Run Code Online (Sandbox Code Playgroud)

错误如下所示:

Reason: liquibase.exception.DatabaseException: ORA-06550: line 2, column 27:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:

   := . ( @ % ; not null range default character
 [Failed SQL: DECLARE
              seqval NUMBER] (Liquibase Update failed.)
Run Code Online (Sandbox Code Playgroud)

a_h*_*ame 9

Liquibase 将尝试<sql>通过默认的语句分隔符分割标签内的“脚本” ,即;. 对于 PL/SQL 块,这显然是错误的,因为需要将整个块视为单个语句。

为此,请splitStatements<sql>标签中使用属性:

<sql splitStatements="false">
  DECLARE 
   .... 
  END;
</sql>
Run Code Online (Sandbox Code Playgroud)