Выполнить файл SQLPlus SQL в относительном пути в ShellScript - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь создать ShellScript, который соединяет sqlplus и выполняет file.sql в подпапке.

- folderA/
 * scripts/myShellScript.sh
 * sql/mySql.sql

Я хотел выполнить mySql.sql из myShellScript.sh.

Я пробовал это:

@../sql/mySql.sql

Но его возвращение: файл не найден.

Это мой код:

sqlplus -s $username/$password > logtest << EOF
WHENEVER OSERROR EXIT 9;
WHENEVER SQLERROR EXIT SQL.SQLCODE;

set echo on
set time off
set timing off
set heading off
set termout off
prompt ...
@../mySql.sql

SPOOL OFF
exit; 

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 31 января 2019

Путь после @ относится к пути, по которому вызывается myShellScript.sh, а не к пути, в котором находится myShellScript.sh.

Если вы cd в folderA/scripts/ и выполняете ./myShellScript.sh ссылаясь на файл SQL как @../sql/mySql.sql, он должен работать просто отлично.

Если вместо этого вы вызываете myShellScript.sh из folderA/ как ./scripts/myShellScript.sh, вам придется использовать @./sql/mySql.sql.

Возможный способ вызова myShellScript.sh из произвольного местоположения - добавить некоторую обработку текущего каталога в сценарий:

cd "${0%/*}"
sqlplus -s $username/$password > logtest << EOF
...
@../sql/mySql.sql

Таким образом, sqlplus запускается изпуть myShellScript.sh находится в.
Но, конечно, это также изменит путь, в который записывается logtest.

На самом деле, наиболее распространенный подход, который я видел, состоит в определении всех путей как абсолютныхи держите их в переменных:

sqlpath=/path/to/sql/files
logpath=/path/to/logs

sqlplus USER/PASSWD >"$logpath"/logtest @"$sqlpath"/mySql.sql
...