plsql работает в Sql Developer, но не в жидкость изменяет ORA-06550 PLS-00103 - PullRequest
1 голос
/ 27 мая 2019

У меня есть следующий код, который не вызывает проблем в 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;

и набор изменений для него:

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

Ответы [ 2 ]

4 голосов
/ 27 мая 2019

Liquibase попытается разделить «скрипт» внутри тега <sql> с помощью разделителя оператора по умолчанию, равного ;. Для блока PL / SQL это явно неправильно, так как весь блок должен рассматриваться как один оператор.

Для этого используйте атрибут splitStatements в теге <sql>:

<sql splitStatements="false">
  DECLARE 
   .... 
  END;
</sql>
0 голосов
/ 27 мая 2019

Обычно динамический SQL не требует завершения оператора.Я не знаю Liquibase, но, похоже, он требует .

Я не уверен, что понимаю, что вы имели в виду, конкатенируя пустую строку в конце:

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

Как насчет конкатенации точки с запятой вместо этого, то есть

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