plsql 在 Sql Developer 中有效,但在 liquibase 更改中无效 ORA-06550 PLS-00103

plsql works in Sql Developer, but not in a liquibase change ORA-06550 PLS-00103

我有以下代码 运行ning 在 SQL 开发人员中没有问题,但是当我放入一个 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;

及其变更集:

     <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>

错误如下所示:

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.)

通常,动态 SQL 不需要语句终止符。我不知道 Liquibase,但似乎 需要它。

我不确定我是否理解您在末尾连接一个空字符串的意思:

execute immediate('CREATE SEQUENCE SEQ_SLS_ITEMS MINVALUE '||seqval||'');
                                                                      ^
                                                                 empty string?

连接一个 semi-colon 怎么样,即

execute immediate('CREATE SEQUENCE SEQ_SLS_ITEMS MINVALUE '||seqval||';');
                                                                      ^
                                                                 semi-colon

Liquibase 将尝试通过默认语句分隔符 ; 拆分 <sql> 标记内的 "script"。对于 PL/SQL 块,这显然是错误的,因为整个块需要被视为单个语句。

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

<sql splitStatements="false">
  DECLARE 
   .... 
  END;
</sql>