Почему-то кажется, что SQL * Plus (по крайней мере, в Windows) не может найти скрипт с относительным путем при вызове с помощью @@
и когда путь начинается с одинарной или двойной точки.
Например, у x:\some\where
меня есть следующая структура каталогов:
script.sql
main-dir\main-sub-dir
call-script.sql
script.sql
То есть: два, script.sql
но в разных местах.
Содержание script.sql
просто под x:\some\where
просто
prompt SCRIPT root
в то время script.sql
как содержание другого
prompt SCRIPT main-dir/main-subdir
call-script.sql
читает
@@script.sql
@ script.sql
ожидаемый результат
Если я запускаю SQL * Plus с, x:\some\where
а затем делаю
@main-dir/main-sub-dir/call-scripts
Выход будет
SCRIPT main-dir/main-subdir
SCRIPT root
Это ожидается, поскольку сингл @
должен искать пути с того места, где был запущен SQL * Plus, и @@
должен искать пути из директории содержащего скрипта.
неожиданный вывод
Теперь , если я изменю call-scripts.sql
так:
@@./script.sql
@ ./script.sql
двойник, @@
похоже, меняет свое поведение, поскольку он ищет пути, с которых был запущен SQL * Plus, и теперь вывод будет
SCRIPT root
SCRIPT root
это не то, что я ожидал.
Задокументировано ли это поведение где-то, и что более важно, как я должен изменить его, call-scripts.sql
чтобы он @@../../other-dir/other-sub-dir/script
правильно вызывал относительные пути ( )?
strace
. Вот соответствующие вызовы: pastebin.com/cVK1QQu4 Обратите внимание, что он не пытался выполнить стат или доступ к файлам «script.sql» в любых других каталогах, прежде чем пытаться открыть те, которые видны в выводе pastebin.Ответы:
Да, это ошибка 2391334, которая существует уже долгое время и, вероятно, не будет исправлена в ближайшем будущем.
Один из способов работы вокруг этого «знать» путь для сценариев без фактически жесткого кодирования по этому пути. Для этого в SQLPlus требуется хитрость - если вы попытаетесь запустить несуществующий файл, вы получите сообщение об ошибке, содержащее имя пути.
Итак, вот демонстрация этого в действии. Чтобы подражать вашему сценарию, у меня есть:
Что мы можем сделать, это добавить некоторые команды в начало call_script.sql, которые будут выбирать путь. Это выглядит немного странно, но вам не нужно менять его - это просто фиксированная вещь, которую вы вставляете в
Здесь происходит то, что мы запускаем несуществующий скрипт, который возвращает:
«SP2-0310: невозможно открыть файл« путь \ _nonexistent_script.sql »
поэтому с помощью небольшого регулярного выражения мы можем извлечь путь, сохранить его в переменной SQLPlus и затем использовать с этого момента.
Таким образом, окончательная версия вашего call_script.sql будет выглядеть так
и когда мы запустим это, мы получим следующее
и там вы идете :-)
источник