Иногда я получаю сценарий, который будет нормально работать в SQL Developer или Toad, но требует модификации для успешного запуска из SQL * Plus. Вот пример наихудшего случая, содержащий несколько операторов, каждое из которых содержит пустые строки, точки с запятой и косую черту:
INSERT INTO t1 VALUES ('a
;
/
');
INSERT INTO t1 VALUES ('b
;
/
');
DELETE FROM t1 WHERE c1 = 'c
;
/
';
По разным причинам эти операторы должны запускаться из SQL * Plus. Пустые строки легко решить с помощью простого ...
set sqlblanklines on
Я знаю, что их sqlterminator
можно изменить и / или отключить, но оба требуют изменения кода, первый перемещает проблему, не решая ее, и не решает проблему встроенной косой черты.
Наилучшим ответом был бы способ разрешить выполнение этих операторов без изменений, изменяя каким-либо образом среду (как это делает sqlblanklines). Если это невозможно, возможно, есть способ программно изменить сценарии. Я пытаюсь избежать ручных изменений.
источник
Ответы:
Вы можете сделать большую часть этого, используя login.sql. login.sql выполняется во время - удивительно - входа в систему и загружается из вашего SQLPATH или текущего каталога. Для приведенных вами примеров вы действительно выбрали худший вариант.
Проблема в том, что sqlterminator. Что бы вы там ни указали, косая черта поддерживается как бесплатный sqlterminator. Кроме того, sqlplus сначала сканирует sqlterminator и делает это перед сканированием до строкового терминатора. Ошибка, если вы спросите меня. Косая черта может использоваться в строке, если она не одинока в отдельной строке. Как только sqlplus находит символ, указанный как sqlterminator, он игнорирует все остальное и прекращает чтение.
Косая черта может быть обработана, пока она не одна на линии.
login.sql содержит:
leigh.sql содержит:
запустите скрипт:
Не нужно возиться с блоками начала / конца. Не может обрабатывать sqlterminator внутри команды, независимо от того, где она находится, в строке или нет, не может обрабатывать строки с косой чертой в строке в строке.
источник
Операторы вставки с пустыми строками и точками с запятой завершатся успешно, если поместить их в блоки BEGIN ... END. Это изменение может быть выполнено с использованием сценария, но сценарий завершится ошибкой, если он содержит операторы DDL, которые нельзя выполнить внутри блока без немедленного выполнения.
Это решение также не решает внедренную проблему.
источник
Мой обходной путь:
Кажется, что терминатор команды игнорируется внутри оператора body.
источник
источник