Entah bagaimana, tampaknya SQL * Plus (setidaknya pada Windows) tidak dapat menemukan skrip dengan path relatif ketika dipanggil dengan @@
dan ketika path dimulai dengan satu atau dua titik.
Misalnya, di bawah x:\some\where
saya memiliki struktur direktori berikut:
script.sql
main-dir\main-sub-dir
call-script.sql
script.sql
Yaitu: dua script.sql
tetapi di lokasi yang berbeda.
Isi script.sql
hanya di bawah x:\some\where
ini sederhana
prompt SCRIPT root
sementara script.sql
konten lainnya adalah
prompt SCRIPT main-dir/main-subdir
call-script.sql
membaca
@@script.sql
@ script.sql
output yang diharapkan
Jika saya memulai SQL * Plus dari x:\some\where
dan kemudian lakukan a
@main-dir/main-sub-dir/call-scripts
Outputnya adalah
SCRIPT main-dir/main-subdir
SCRIPT root
Ini diharapkan, karena single @
seharusnya mencari jalur dari mana SQL * Plus dimulai dan @@
seharusnya mencari jalur dari direktori skrip yang berisi.
hasil yang tak terduga
Sekarang , jika saya mengubahnya call-scripts.sql
:
@@./script.sql
@ ./script.sql
ganda @@
tampaknya mengubah perilaku itu, karena mencari jalan dari mana SQL * Plus dimulai, dan output sekarang akan menjadi
SCRIPT root
SCRIPT root
yang bukan itu yang saya harapkan.
Apakah perilaku ini didokumentasikan di suatu tempat, dan yang lebih penting, bagaimana saya harus berubah call-scripts.sql
sehingga ia memanggil jalur relatif ( @@../../other-dir/other-sub-dir/script
) dengan benar?
strace
. Inilah panggilan-panggilan yang relevan: pastebin.com/cVK1QQu4 Perhatikan bahwa ia tidak mencoba untuk membuat stat atau mengakses file "script.sql" di direktori lain sebelum mencoba untuk membuka yang terlihat di output pastebin.Jawaban:
Yup, ini Bug 2391334 yang telah ada sejak lama, dan mungkin tidak akan diperbaiki dalam waktu dekat.
Salah satu cara untuk mengatasi ini adalah "tahu" jalan untuk skrip tanpa benar - benar sulit mengkodekan jalur itu. Untuk melakukan ini dalam SQLPlus membutuhkan trik - jika Anda mencoba menjalankan file yang tidak ada, maka Anda akan mendapatkan pesan kesalahan yang menyertakan nama path.
Jadi, inilah demo dari tindakan itu. Untuk meniru skenario Anda, saya punya:
Yang bisa kita lakukan adalah menambahkan beberapa perintah ke bagian depan call_script.sql yang akan mengambil path. Ini terlihat sedikit aneh, tetapi Anda tidak perlu mengubahnya - itu hanya hal yang Anda tempelkan
Apa yang terjadi di sini, adalah kami menjalankan skrip yang tidak ada, yang mengembalikan:
"SP2-0310: tidak dapat membuka file" path \ _nonexistent_script.sql "
jadi dengan regexp kecil kita dapat mengekstrak path, menyimpannya dalam variabel SQLPlus dan kemudian menggunakannya sejak saat itu.
Jadi versi terakhir dari call_script.sql Anda akan terlihat seperti ini
dan ketika kita menjalankannya, kita mendapatkan yang berikut
dan di sana Anda pergi :-)
sumber