ANT - ошибка выполнения PLSQL - PullRequest
0 голосов
/ 03 июля 2018

У меня есть несколько сценариев sql (некоторые sql и некоторые plsql), которые нужно выполнить с помощью ant. Прежде чем начать выполнение, я должен убедиться, что файлы являются исполняемыми. Поэтому я запускаю следующую цель, чтобы создать исполняемый файл sql и plsql из ant.

    <copy todir="${migration.scripts.dir}\temp\">
      <fileset dir="${migration.scripts.dir}" includes="*.sql"/>
      <filterchain>
        <replaceregex byline="false" pattern=";" replace="${line.separator}/" flags="mg"/>
        <replaceregex byline="false" pattern="/[\s]*/" replace=";${line.separator}/"  flags="mg"/>
       </filterchain>
    </copy>

А PLSQL в файле файл выглядит примерно так -

   BEGIN 
     FOR c IN 
     --query
     LOOP 
       dbms_utility.blah ; 
     END LOOP; 
     COMMIT;
    END;
    /

что при выполнении команды target target makeExecutableSQLs выводит -

BEGIN 
 FOR c IN 
 --query 
 LOOP 
   dbms_utility.blah 
/ 
 END LOOP
/ 
 COMMIT
/
END
;
/

, но при следующем запуске произойдет сбой из-за этой ошибки -

Ошибка запуска в строке: 1 в команде - НАЧАТЬ FOR C IN --query LOOP dbms_utility.blah Сообщение об ошибке - ORA-06550: строка 9, столбец 135: PLS-00103: Обнаружен символ «конец файла» при ожидании одного из следующих действий:

   := . ( % ;
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

Error starting at line : 11 in command -
END LOOP
Error report -
Unknown Command


Commit complete.


Error starting at line : 15 in command -
END
Error report -
Unknown Command


Error starting at line : 16 in command -

Error report -
Unknown Command

Не могу положить палец, где ошибка?

1 Ответ

0 голосов
/ 03 июля 2018

Ошибки PL / SQL генерируются, потому что вы заменили точку с запятой в разделителях операторов PL / SQL на терминаторы блоков.

Когда компилятор видит /, он завершает работу и выполняет команду в буфере, поэтому он видит и пытается скомпилировать и запустить

BEGIN 
 FOR c IN 
 --query 
 LOOP 
   dbms_utility.blah 
/ 

как автономный завершенный блок PL / SQL. Как ошибка, которую вы получаете от этого

ORA-06550: строка 9, столбец 135: PLS-00103: обнаружен символ "конец файла" ...

указывает на то, что очевидно завершенный блок заканчивается раньше, чем предполагалось. После blah нет разделителя точки с запятой, но для блока нет end loop или end - в этом коде он пытается выполнить. По сути, он не видел остальную часть сценария.

Затем он продолжает и пытается интерпретировать следующий фрагмент

 END LOOP
/ 

, что также недействительно; клиент даже не пытается выполнить это, потому что он не знает, что с ним делать.

Тогда следующий кусок

 COMMIT
/

успешно выполняется как простой оператор SQL (управления транзакциями), а не в контексте PL / SQL.

и т. Д.

Короче говоря, вы не можете заменить точку с запятой косой чертой в блоке PL / SQL, так как они делают совершенно разные вещи. В простом SQL они взаимозаменяемы (точнее, для большинства клиентов; по крайней мере, по умолчанию - даже в SQL * Plus вы можете изменить терминатор SQL с точки с запятой на что-то другое).

Клиент по-прежнему обрабатывает косую черту после блока PL / SQL и, когда он видит, что отправляет блок в БД для выполнения. Но хотя он знает, что это внутри блока, он знает, что любые точки с запятой, которые он видит, являются частью языка PL / SQL, и он не должен пытаться их интерпретировать.

Это указано в в документации по SQL * Plus для запуска блоков PL / SQL , а другие клиенты, как правило, ведут себя аналогичным образом.

Выполнить текущую подпрограмму с помощью команды RUN или косой черты (/). Точка с запятой (;) обрабатывается как часть подпрограммы PL / SQL и не выполняет команду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...