Jakoś wydaje się, że SQL * Plus (przynajmniej w systemie Windows) nie jest w stanie zlokalizować skryptu ze ścieżką względną, gdy jest wywoływany za pomocą @@
i gdy ścieżka zaczyna się od pojedynczej lub podwójnej kropki.
Na przykład w obszarze x:\some\where
Mam następującą strukturę katalogów:
script.sql
main-dir\main-sub-dir
call-script.sql
script.sql
To znaczy: dwa, script.sql
ale w różnych lokalizacjach.
Treść script.sql
tuż poniżej x:\some\where
jest po prostu
prompt SCRIPT root
podczas gdy druga script.sql
strona jest
prompt SCRIPT main-dir/main-subdir
call-script.sql
czyta
@@script.sql
@ script.sql
oczekiwany wynik
Jeśli uruchomię SQL * Plus od, x:\some\where
a następnie zrobię
@main-dir/main-sub-dir/call-scripts
Wyjście będzie
SCRIPT main-dir/main-subdir
SCRIPT root
Jest to oczekiwane, ponieważ singiel @
ma przeszukiwać ścieżki, z których SQL * Plus został uruchomiony, i @@
powinien przeszukiwać ścieżki z katalogu zawierającego skrypt.
nieoczekiwany wynik
Teraz , jeśli to zmienię call-scripts.sql
:
@@./script.sql
@ ./script.sql
double @@
wydaje się zmieniać swoje zachowanie, ponieważ przeszukuje ścieżki, z których SQL * Plus został uruchomiony, a wynik będzie teraz
SCRIPT root
SCRIPT root
czego się nie spodziewałem.
Czy to zachowanie jest gdzieś udokumentowane, a co ważniejsze, jak muszę to zmienić, call-scripts.sql
aby @@../../other-dir/other-sub-dir/script
poprawnie wywoływało ścieżki względne ( )?
strace
. Oto odpowiednie wywołania: pastebin.com/cVK1QQu4 Zauważ, że nie próbował on stat lub uzyskać dostępu do plików „script.sql” w żadnym innym katalogu przed próbą otwarcia plików widocznych w danych wyjściowych pastebin.Odpowiedzi:
Tak, to błąd 2391334, który istnieje od dawna i prawdopodobnie nie zostanie naprawiony w najbliższej przyszłości.
Jednym ze sposobów obejścia tego jest „poznanie” ścieżki skryptów bez faktycznego kodowania tej ścieżki. Aby to zrobić w SQLPlus, należy zastosować lewę - jeśli spróbujesz uruchomić nieistniejący plik, otrzymasz komunikat o błędzie zawierający nazwę ścieżki.
Oto demo tego w akcji. Aby naśladować twój scenariusz, mam:
Co możemy zrobić, to dodać kilka poleceń z przodu call_script.sql, które wybiorą ścieżkę. Wygląda to trochę dziwnie, ale nie trzeba go zmieniać - to po prostu naprawiona rzecz, którą wklejasz
To, co się tutaj dzieje, to uruchamianie nieistniejącego skryptu, który zwraca:
„SP2-0310: nie można otworzyć pliku” ścieżka \ _nonexistent_script.sql ”
więc z małym wyrażeniem regularnym możemy wyodrębnić ścieżkę, zapisać ją w zmiennej SQLPlus, a następnie użyć od tego momentu.
Ostateczna wersja twojego call_script.sql wyglądałaby tak
a kiedy to uruchomimy, otrzymamy następujące informacje
i proszę bardzo :-)
źródło