Ошибки 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 и не выполняет команду.